Two WordPress sites, manual exports, drift everywhere.
- ×Two brands, two separate WordPress sites — each its own product, pricing, stock source
- ×19,000+ SKUs maintained by hand across both — no shared catalogue, no central control
- ×Wholesale customers got product data via manual exports, reformatting, and email back-and-forth
- ×Stock and pricing drifted between SwaggMerch and customers — order errors and angry phone calls
- ×Every new wholesale partner multiplied the export work — onboarding capped real growth
Manual sharing doesn't scale past a handful of customers.
SwaggMerch had grown into a serious wholesale operation — two brands, 19,000+ SKUs, a steady stream of new wholesale partners asking for live product, pricing and stock data. The retail side ran beautifully on two WordPress / WooCommerce sites. The wholesale side ran on email, spreadsheets and goodwill.
Every new partner started the same conversation: “Can you send me a CSV? Can you re-send it tomorrow with stock? Can you tell me when your prices change?” SwaggMerch was being asked to behave like an API while shipping data by hand.
It wasn’t sustainable. Onboarding a new wholesale customer added export work, reformat work, and a steady stream of “your price doesn’t match what’s on your website” tickets. Growth was capped not by sales — by spreadsheet maintenance.
Mirror, don't expose. WordPress stays put.
The first decision was the most important: don’t expose WordPress directly. WooCommerce wasn’t built to be a high-volume read API for wholesale partners — and any change SwaggMerch made to the catalogue would ripple instantly into customer integrations, with no rollback.
We designed a mirror layer instead. WordPress remains the source of truth. AppBox builds a separate Supabase database that mirrors both stores, plus a Next.js API that wholesale customers consume. One direction, by design — data only flows out from WordPress, nothing the API or portal does can corrupt the catalogue.
The internal team keeps working exactly as they do today. SwaggMerch never sees the API unless they want to.
Two sync mechanisms. One real-time. One bulletproof.
WooCommerce webhooks fire on every product, price and stock change. A Next.js endpoint receives them, verifies the signature, and writes to Supabase. Updates land in seconds — that’s the live experience SwaggMerch is selling to wholesale customers.
Running in parallel is a nightly reconciliation job: a full pull from the WooCommerce REST API, diffed against Supabase, with any drift corrected automatically. This is the safety net — it catches missed webhooks, network failures, and any manual edits done in WordPress when AppBox’s endpoint was down. Customers never see the messy reality underneath. (We’ve documented this whole architecture pattern in our supplier API integration guide.)
On top of that sits the portal SwaggMerch actually uses — toggle products, categories or whole brands on or off per customer, apply tier-based pricing, issue and rotate API keys, watch usage analytics, and read an audit log of every sync, error and override. Internal product management stays in WordPress. Customer management stays in the portal. The two never collide.
The numbers, after six months.
Wholesale partners stopped asking us for spreadsheets. They started asking us for API keys. Same product team, same WordPress workflow, but suddenly we look like a much bigger operation than we are.