← Back to projects
2025

Bakehouse Occasions — Shopify × RISE ERP

Custom Shopify storefront for Hong Kong bakery Bakehouse, with one-way and two-way sync to the in-house RISE ERP via webhooks and an OData job API.

Bakehouse Occasions — Shopify × RISE ERP — desktop view
Bakehouse Occasions — Shopify × RISE ERP — mobile view

Bakehouse Occasions is the corporate-gifting and occasions storefront for Bakehouse, the Hong Kong bakery known for its egg tarts and pastries. I built and maintain this at Black Durian, where I'm currently working.

I developed the custom Shopify storefront (occasions.bakehouse.hk) and the integration layer that keeps it in sync with the company's in-house ERP, "RISE", in both directions. Shopify webhooks for order creation/cancellation, customer create/update and product create/update post events to an OData async-job API, which lands them in RISE — every Shopify order becomes a linked Sales Order (SO) and Sales Invoice (SI) tagged with its Shopify order number. Each SO captures the delivery details — zone delivery fee, delivery date, time slot and method — and the matching Sales Invoices are pushed into Xero accounting automatically every day. In the other direction, RISE pushes the master product catalog, pricing and per-day availability back to Shopify.

A bakery-specific piece I built is the "Occasions Quota" system: each SKU has an Available Quantity Per Day cap (for example 1,400 Sourdough Egg Tarts a day) that's exported to Shopify, so the store never sells more than the kitchen can bake for a given delivery date.

RISE — which I co-built — is built with Laravel on the back end and a Vue.js front end, exposing an OData API that the Shopify integration talks to. It's multi-entity (a Headquarter plus branches) with segmented contacts — retail Occasions customers, wholesale accounts, internal contacts and suppliers — and real business fields like BR number and expiry, payment policy (e.g. Cash on Delivery), per-customer currency (HKD) and linked wholesale contacts. I was also responsible for the e-commerce site customization itself.

Behind the scenes

Architecture — a Shopify order flows through the OData async-job API into RISE as a linked SO + SI, then daily invoices to Xero; RISE pushes catalog, pricing and per-day availability back to Shopify.
Architecture — a Shopify order flows through the OData async-job API into RISE as a linked SO + SI, then daily invoices to Xero; RISE pushes catalog, pricing and per-day availability back to Shopify.
RISE ERP (Laravel + Vue.js) — customer record for the Occasions entity, with B2E/B2C fields (BR number, payment policy, currency).
RISE ERP (Laravel + Vue.js) — customer record for the Occasions entity, with B2E/B2C fields (BR number, payment policy, currency).
Occasions Quota — per-SKU daily availability caps exported to Shopify so the store never oversells a day's bake.
Occasions Quota — per-SKU daily availability caps exported to Shopify so the store never oversells a day's bake.
RISE — Shopify orders synced in: each one linked to its Sales Order (SO) and Sales Invoice (SI) number. Customer names redacted.
RISE — Shopify orders synced in: each one linked to its Sales Order (SO) and Sales Invoice (SI) number. Customer names redacted.
RISE — Occasion Sale Reports: synced Shopify orders as confirmed Sales Orders with delivery dates and totals. Customer names redacted.
RISE — Occasion Sale Reports: synced Shopify orders as confirmed Sales Orders with delivery dates and totals. Customer names redacted.
RISE — Sales Order detail: delivery zone fee, date, time slot and method, with PDF export. Customer name and address redacted.
RISE — Sales Order detail: delivery zone fee, date, time slot and method, with PDF export. Customer name and address redacted.
Shopify admin — storefront orders that push into RISE in real time via webhooks. Customer column redacted.
Shopify admin — storefront orders that push into RISE in real time via webhooks. Customer column redacted.
Shopify admin — 5,338 customers kept in sync with RISE. Names, emails and locations redacted.
Shopify admin — 5,338 customers kept in sync with RISE. Names, emails and locations redacted.