E-commerce · 2025

PrintShopKE.

Building an online storefront for Kenya's fastest-growing digital print shop — full catalogue, M-Pesa at checkout, nationwide delivery.

The brief

Where it started.

PrintShopKE is a Nairobi-based digital printing operator serving SMEs, corporate clients and events. They had strong offline relationships and a steady flow of walk-in orders, but their web presence was limited to a single contact page and a WhatsApp number.

The mandate was to build an online storefront that could accept orders 24/7, handle the full catalogue of print products (business cards, flyers, banners, t-shirts, brochures, branded merchandise), and integrate M-Pesa so customers could pay from their phones without leaving the site.

The challenge

What was hard.

The catalogue is deep and deeply variable — a business card order has size, paper stock, finish, double-sided, minimum quantity, and artwork upload. A t-shirt order has size, colour, print method, and one-up-front artwork proof. Modelling all this in a clean admin the team could actually maintain was harder than any of the integrations.

Payments were the other half. Most Kenyan buyers pay with M-Pesa — putting Visa first at checkout would collapse conversion. We needed Daraja STK push on the primary path, Pesapal as an aggregator fallback, and cash-on-delivery for corporate orders. All without a third-party SDK adding 200 KB to the bundle.

Our approach

How we solved it.

  • 01
    Product system modelled in the CMS
    Each print product is a CMS entry with structured options. The front-end reads the schema and renders the right order form — no hard-coded product pages.
  • 02
    M-Pesa STK push, server-side
    Daraja calls happen in a Next.js API route. The client posts the order, polls for payment status, shows a receipt. No Daraja keys ever leave the server.
  • 03
    Artwork upload with validation
    Users upload PDFs and images. We validate dimensions, DPI and file type client-side, then store in S3-compatible object storage with a signed-URL handoff to the production team.
  • 04
    County-level shipping
    Shipping cost is calculated from county of delivery, product weight, and urgency (same-day Nairobi vs courier to Mombasa).
  • 05
    Order tracking without a customer account
    Most customers don't want to sign up. Every order gets a unique tracking URL sent via SMS — they paste it to check status, no password required.
Stack

What we built it with.

Next.js 16React Server ComponentsSanity CMSM-Pesa Daraja (STK)Pesapal fallbackVercel + Cloudflare DNSAfrica's Talking (SMS)S3-compatible object storagePlausible analytics
What we shipped

The outcome.

  • Full catalogue with 40+ product types shipped, each editable in CMS.
  • Checkout with M-Pesa STK as default, cards + cash-on-delivery as backup.
  • Order-status SMS sent on payment, production and dispatch events.
  • Admin dashboard for the production team — orders queue, artwork preview, status changes.
  • Customer-tracking page at a unique URL per order.
  • LocalBusiness + Product schema for SEO visibility in Kenyan searches.
< 2sMobile LCP on Safaricom 4G
47Counties covered for shipping
40+Product types in the catalogue
We went from taking orders on WhatsApp to a proper online store that runs 24/7. The M-Pesa flow just works.
PrintShopKE leadership
Digital operations
More work

Other things we shipped.

Chat on WhatsApp