Retail Operations Integration

Store, ERP, and POS agree on stock and orders, ending oversells and manual reconciliation.

Store staff checking an inventory list on a tablet
Sector
D2C · Omnichannel retail
Built with
  • Node.js
  • Webhooks
  • PostgreSQL
  • AWS

01 · Discover

What the client needed

An omnichannel retailer sold through an online store and physical shops. The store, ERP, and POS each had their own version of stock, and staff reconciled them by hand.

Requirements

  • One source of truth for stock across store, ERP, and POS
  • Near real-time inventory sync to stop overselling
  • Online orders flowing into the ERP for fulfilment and accounting
  • Support for buy online, pick up in store
  • Alerts when a sync fails, not silent drift
  • Reports that show what changed and why

Constraints

  • The ERP and POS stay in place
  • Some systems only offer batch exports or rate-limited APIs
  • No interruption to trading while we connect them

02 · Pitch

What we proposed

We mapped every record that moved between systems and agreed which system owns each one.

Options we weighed

  • Recommended

    Custom integration service with clear record ownership

    Handles each system’s quirks and gives full visibility into every sync.

  • Off-the-shelf connector app

    Quick to install, but couldn’t handle the ERP’s rules or show why a sync failed.

  • Nightly batch sync

    Simple, but stock would still be wrong for most of the day.

What we agreed

  • An ownership map: which system is the source of truth for each record
  • Event-driven sync where APIs allow, scheduled sync where they don’t
  • Monitoring and reconciliation from day one

03 · Build

How we built it

A small integration service sits between the systems and moves every change through a queue that can be retried and audited.

Every requirement, and what we built for it

RequirementWhat we built
One source of truthAn ownership map enforced in code, so each system only writes the records it owns
Stop oversellingWebhook-driven stock updates, with scheduled catch-up for systems without events
Orders into the ERPOnline orders pushed to the ERP with status updates flowing back to the store
Pick up in storeStore-level stock shown online and reserved when an order is placed
No silent driftRetries with backoff, a dead-letter queue, and alerts when something fails
VisibilityDaily reconciliation reports comparing stock and orders across systems

Platform and architecture

Integration service
Node.js workers with a queue for every change
Data
PostgreSQL for mappings, sync state, and an audit log
Hosting
AWS, with scheduled jobs for batch-only systems
Connections
Shopify webhooks and APIs, ERP and POS APIs and exports

04 · Handover

Launch and handover

We ran the new sync alongside manual checks until the reports matched, then switched over fully.

  1. Parallel run against manual reconciliation
  2. Runbook for each alert and how to fix it
  3. Dashboard access for the operations team
  4. Ongoing support for system changes and upgrades

05 · Outcome

The outcome

Store, ERP, and POS agree on stock and orders, ending oversells and manual reconciliation.

Store, ERP, and POS now agree on stock and orders, and the team spends its time on exceptions, not spreadsheets.

  • Overselling from stale stock has stopped
  • Manual reconciliation replaced by daily reports
  • Failures surface as alerts instead of customer complaints

Have a project like this?

A few lines is enough. You’ll hear back from an engineer, not a salesperson.