Keeping a storefront and an external business system in sync
A WooCommerce e-commerce platform built and customized for MAY Derma and integrated with the company's external business systems. Delivered as a remote contract between May and July 2026.
Context
MAY Derma needed a storefront that was not an island. Orders taken online had to arrive in the systems the business already ran on, and product and stock data maintained back-office had to be reflected in the store. I built and customized the WooCommerce platform and then built the integration between the two sides.
The problem
A storefront and a back-office system disagree the moment either one can change state independently. Orders, stock and customer records exist in both, and neither is naturally the follower. The work was to decide, record by record, which system owns the truth and how the other finds out about it.
The tempting shortcut is to have the storefront call the other system directly at checkout. It is the smallest amount of code and the worst failure mode: a checkout that depends on the back office being reachable is a checkout that fails when the back office is down.
The integration
Communication runs over webhooks into asynchronous workers. The storefront emits an event when something happens; a worker picks it up, translates it, and writes to the other side. If the destination is unavailable, the event waits and is retried instead of being lost at the till.
Because delivery is at-least-once, every consumer is idempotent. The same event arriving twice produces one order, not two — deduplicated on the event's own identifier before any write. This is the part of the design I would defend hardest: retries are not an edge case, they are the normal operating mode of a webhook integration.
Trade-offs
Results
Delivered and handed over: the storefront runs in Docker behind Nginx on Linux, and orders and stock cross between the store and the client's systems through retryable, idempotent workers rather than synchronous calls.
I am not publishing commercial figures for this project. The client authorized the technical description above, not their sales data.
Retrospective
The integration would have been easier to operate with a delivery log surfaced in the admin from day one — a screen that answers "did this order reach the other side, and if not, why" without opening a database. I built the reliability and under-built the visibility into it.
What I would repeat is refusing the synchronous shortcut. It was more work in week one and it is the reason the store's availability does not depend on someone else's uptime.