Print-on-Demand SaaS

Petunia Chatterton

Personalized children's books with an automated render-to-print pipeline.

Petunia Chatterton — product screenshot
Petunia Chatterton Editions — live product (petuniachatterton.com).
Problem

Personalized books mean a unique PDF per order, rendered reliably and handed to a print partner without manual touch.

Solution

A generation pipeline on Puppeteer, qpdf, Cloudflare R2, and BullMQ with content-hash caching, plus HMAC-verified print-fulfillment webhooks to Gelato across A3/A4/A5.

Architecture

Puppeteer + qpdf render · Cloudflare R2 · BullMQ queue · content-hash cache · Gelato HMAC webhooks

OrderCustomer orderAPI enqueues jobContent-hash key
Queue & renderBullMQ (Redis)Puppeteer + qpdf workerCache hit → skip render
Storage & fulfilmentCloudflare R2 (cached PDF)Gelato printHMAC-verified webhook
Request / data flow, left to right.
Why it's built this way

Rendering is expensive and bursty, so it runs on a BullMQ queue keyed by a content hash - identical inputs never re-render, and traffic spikes queue instead of crashing the box. HMAC on the Gelato webhook because a forged fulfillment callback would ship real product.

Impact →Hands-off personalized fulfillment; bilingual SEO slug system for discovery.
PuppeteerqpdfCloudflare R2BullMQGelatoHMAC
Visit live site ↗Discuss a build like Petunia Chatterton← All work
More work
PaylioFlagship SaaSiBoardingPassPayments & AnalyticsE-VignettesMulti-currency Commerce