Connecting commerce infrastructure to scale merchant operations
A multi-brand merchant group needed a unified way to connect their Shopify stores to internal ERP, CRM, and fulfillment systems. Orders, inventory, and customer data lived in silos; manual CSV exports and ad-hoc scripts led to sync failures and delayed fulfillment. The goal was to design and build custom Shopify apps and integrations that would keep commerce data flowing reliably and in real time.
Timeline: 4 months (discovery through launch and iteration). Role: Lead developer — architecture, API design, app build (Node.js), Liquid theme extensions, and webhook pipelines. Tech stack: Shopify Partner API, Polaris (React) for embedded app UIs, GraphQL Admin API, REST Admin API, webhooks (orders, products, customers), Node.js backend, PostgreSQL for app data, and serverless workers for event processing.
Integration complexity came from several directions. Data was fragmented: orders in Shopify, inventory in the ERP, customer history in a separate CRM. Manual workflows — downloading reports and re-uploading elsewhere — were error-prone and didn’t scale. Third-party sync tools often failed under load or didn’t support custom logic (e.g. splitting orders by warehouse, applying business rules before pushing to the ERP). We needed a solution that could handle high order volume, respect rate limits, and give the merchant full control over what got synced and where.
How the custom app sits between the merchant’s Shopify Admin and external systems.
From order placement to ERP sync and customer notification.
From app install to dashboard-ready state.
Registered the app in Shopify Partners, configured OAuth scopes (orders, products, customers, read/write), and implemented the install callback to store the merchant’s access token and shop domain securely.
Built the merchant-facing UI as an embedded app using Polaris so it felt native inside Shopify Admin. Included settings for webhook selection, API keys for ERP/CRM, and a simple dashboard for sync status.
Incoming webhooks (order/create, order/updated, product/create, etc.) were validated, parsed, and pushed to an event queue. Workers consumed the queue and applied idempotency and retries to avoid duplicates and handle transient failures.
Used the Shopify Billing API for one-time and recurring charges where the app added paid value. Stored app-specific config in metafields so settings survived theme changes and could be read from Liquid when needed.
Added a small theme app extension so merchants could surface app-driven content (e.g. delivery estimates, custom fields) on the storefront without editing Liquid by hand.
// Validate HMAC, parse body, push to queue
app.post('/webhooks/orders/create', (req, res) => {
if (!verifyShopifyHmac(req)) return res.status(401).send('Invalid');
const payload = req.body;
eventQueue.push({ topic: 'orders/create', shop: req.headers['x-shopify-shop-domain'], payload });
res.status(200).send('OK');
});
"The custom app and integrations gave us one source of truth. We no longer chase orders across systems — everything flows automatically."
— Merchant operations lead (client)Building commerce integrations or custom Shopify apps? Let's connect.
Get in Touch