The whole bakery, running on one engine.
Pacífica is an artisan sourdough bakery in Cuernavaca. Its platform is one WordPress engine driving three surfaces: a reserve-and-pickup storefront, a customer app whose loyalty card lives in Apple Wallet, and a tablet POS that runs the counter, the stock and the daily close.
es-MX · WordPress + WooCommerce Store API · Expo customer + POS apps
A bakery is a system: ovens, slots, counter, stock. The software mirrors all of it, and the same engine now runs its sister café down the street.
-
Reserve now, pay at pickup
Capacity-limited 30-minute pickup slots with a 1-hour lead time, so same-day ordering works. Checkout rides the WooCommerce Store API. Pay at pickup is the live path; the Stripe gateway is wired and awaiting keys.
-
Three surfaces, one truth
Web, customer app and POS consume the same catalog, the same slots and the same order states through one REST API. Nothing to reconcile, nowhere to drift.
-
Operations on WhatsApp
New orders reach staff by WhatsApp/SMS via Twilio, and staff reply with a digit to advance them. Customers get a message at every step. Nobody has to watch a dashboard.
Surface 01 · The website
The storefront.
Seventeen block templates and twenty-four patterns on a theme.json token system: everything editable, everything seeded from code.
- A 29-product WooCommerce catalog in three categories, real MXN prices, Agotado sold-out states driven by live stock
- Reserve-and-pickup checkout: capacity-limited 30-minute slots with a 1-hour lead time, so same-day orders work
- Fourteen seeded pages: menú, historia, filosofía, proceso, temporada, catering, cómo recoger, FAQ, contacto and three legal pages
- Bodoni Moda display type over a 12-color token palette, zero hardcoded hex in any template or pattern
- Two style variations: Horno de Noche (dark) and Mostrador (light)
- JSON-LD structured data (Bakery, Product, BreadcrumbList) plus Open Graph and Twitter cards
Behind the counter
Back of house.
The parts customers never see: where the bakery actually runs.
- Every paid order reaches staff by WhatsApp/SMS via Twilio; a digit in reply advances it through the flow
- Customers are texted on every change, through custom order statuses: preparing, ready
- Operations dashboard, production calendar, reports and a low-stock widget inside wp-admin
- One REST API: /app/* for the customer app, /pos/* behind Application Passwords, /wallet/v1/* for PassKit
- Idempotent WP-CLI installer, versioned schema migrations, HPOS-ready commerce
Surface 02 · In the pocket
The customer app.
An Expo app for iOS and Android built on React Native and React 19, sharing a typed API client with the POS.
- Four tabs: Carta, Canasta, Mis pedidos and Lealtad
- Catalog and cart against the same Store API as the web
- Checkout shares the web’s pickup slots: same capacity rules, same lead time
- Name, phone and email persisted on device: entered once, kept across orders and restarts
- Live order tracking with a push notification at every status change
- A signed loyalty QR card and an Add to Apple Wallet button
Surface 03 · The counter
The counter, on a tablet.
Pacífica POS: a landscape tablet app that replaces paper across six tabs.
- Entrantes: incoming online orders with push alerts and slide-to-accept
- Pedidos: a live pickup board grouped by time slot, driving each order through its statuses
- Mostrador: walk-in counter sales in cash or card that decrement stock without consuming pickup slots
- Inventario: absolute stock recounts, salidas internas with destinations and an employee picker, per-day history
- Lealtad: a camera QR scanner to stamp and redeem loyalty cards
- Corte del día: revenue by channel and payment method, top sellers, salidas valued at price snapshots
The loyalty loop
A pass that keeps itself current.
No accounts to create, no third-party pass service: the whole loop is built into the engine.
- Anonymous, device-registered loyalty members: no signup form, no password
- HMAC-signed QR tokens, read by the same POS scanner that stamps them
- .pkpass store cards built and PKCS#7-signed in pure PHP
- The full Apple PassKit Web Service: device registration and per-pass auth tokens
- An APNs push on every stamp or redeem, so the pass in the customer’s Wallet refreshes itself
- Stamps and redemptions are counted; reward mechanics stay a business decision, deliberately un-encoded
Built like software, because it is.
The engine-versus-brand split our WordPress builds share, here at its fullest.
-
Plugin decides, theme presents
All commerce logic lives in the pacifica-core plugin: 39 classes booted through a service container. The FSE theme is presentation only, tokens and templates.
-
Built to be re-branded
The same engine now runs Haramara Café down the street. Brand lives in tokens, patterns and seed data, never in forks.
-
Verified end to end
phpcs and PHPStan level 6 on the PHP, TypeScript checks across both apps, and a REST integration matrix that exercises ordering, inventory and loyalty before anything ships.
-
Deploys are boring
GitHub Actions rsyncs only what changed to the VPS. The apps ship through EAS builds, with over-the-air updates in between.
Under the hood
The stack, plainly.
- Web
- WordPress FSE theme theme.json tokens WooCommerce Store API (MXN) Bodoni Moda Two style variations
- Backend
- pacifica-core plugin (PSR-4) REST pacifica/v1 Application Passwords Versioned migrations HPOS-ready WP-CLI installer
- Apps
- Expo SDK 57 React Native 0.86 React 19 TanStack Query Shared TypeScript api-client Expo push
- Wallet and messaging
- Apple PassKit Web Service Pure-PHP .pkpass + PKCS#7 APNs HTTP/2 Twilio WhatsApp/SMS
- Quality and delivery
- PHPCS + PHPStan level 6 TypeScript strict checks End-to-end REST matrix GitHub Actions Scoped rsync deploys EAS builds + OTA
Straight answers.
Why two apps for one bakery?
They do different jobs. The customer app sells: browse, reserve, track, collect stamps. The POS runs the counter: accept, hand off, sell walk-ins, count stock, close the day. Both speak to the same REST API, so there is one source of truth and nothing to reconcile.
Where are card payments?
Pay at pickup is the live path, because that is how this counter sells today. The Stripe gateway is installed and wired, awaiting keys, and Mercado Pago is planned. The checkout blocks neither, and we don’t claim what isn’t on.
Why pickup only, no delivery?
Because the product is the point. Bread comes out of a wood-fired oven on a schedule, and pickup slots are capacity-limited to match it. Reserve, walk in, collect it warm. Delivery is deliberately out of scope.
Want your whole operation on one engine?
Storefront, apps, counter and stock on one system. Tell us how your business actually runs, and we’ll tell you what we’d build first.