The problem
Print is not a normal e-commerce product. A single order depends on size, stock, finish, quantity and turnaround, and it cannot be fulfilled without a large artwork file that has to survive the upload. Ordinary storefront patterns break on both counts.
Uploads that survive real connections
Print artwork routinely runs to hundreds of megabytes, and a single dropped connection at 90% used to mean starting over. Uploads run through Uppy over the tus resumable protocol, so a transfer resumes from where it stopped rather than restarting, and files land in S3 with presigned URLs instead of passing through the application server.
Keeping the request path fast
Order processing generates work that has no business blocking a checkout response — file derivatives, notification emails, downstream sync. That work is queued through BullMQ on Redis and processed out of band, so the customer gets an immediate confirmation while the heavy steps run behind it.
- Stripe for card payments, with the payment flow separated from fulfilment side effects.
- A rich-text layer built on TipTap for product and content copy, including tables, images and typography controls.
- Google Maps integration for delivery and location handling.
- Cart and item models shaped to carry per-item print configuration through to fulfilment.
The operator side
Behind the storefront sits an admin and CRM built in Next.js with MUI, covering order management, content editing and reporting. It pulls traffic and behaviour data through the Google Analytics Data API and renders geographic breakdowns, so commercial decisions are made against real numbers rather than exports.