Tell us about your storeContact
Case study 01 · Dropship order automation

Every order placed by API. None by hand.

How a Shopify Plus store stopped retyping supplier orders and cut median fulfillment from 3.15 to 1.24 days, with no added headcount.

2.5xfaster median fulfillment, 3-month window before and after
4% → 41%orders shipped same or next day
54% → 23%orders shipped after three days

The problem

The store sells its own products from one warehouse and a long tail of dropship items from two national distributors. Every dropship order was typed into a supplier portal by hand: find the item, pick the pack size, paste the address, wait for the confirmation email, then paste the tracking number back into Shopify. That works at a few orders a day. At thousands of orders a month it meant a queue that grew over weekends, a median of more than three days from order to shipment, and nobody knowing which orders were stuck where.

Two more wrinkles. The distributors sell the same item under different codes and pack sizes, and prices move, so the cheaper supplier changes line by line. And a supplier can reject a line after the order is placed, which a person then has to notice.

Role and constraints

Bart Grudka designed, built and ran the system as the store's Head of E-commerce, and operated it day to day. CANDEV applies the same approach for clients.

  • Live store, no downtime, no change to the customer-facing checkout.
  • Two supplier APIs with different authentication, item codes, units and error semantics.
  • Orders can split across suppliers and across the store's own warehouse.
  • Every failure needs a state a person can act on, not a log line.
  • Everything ships behind switches, so each capability can be turned on, watched, and turned off without a deploy.

How it works

Shopify order webhook Intake validate, map items Router cheaper supplier in stock Distributor A OAuth2 API Distributor B OAuth2 API Shopify fulfillment + tracking Exception queue states a person can work place place tracking invalid rejected, backorder
Built for this systemExisting platform or partnerA person decides
1Intake

Shopify sends an order webhook. The service records it, validates the address and maps each line to supplier items and pack sizes.

2Routing

For each line, the router picks the supplier that has stock at the lower landed cost, and splits the order when lines need different suppliers.

3Placement

Orders go to the supplier APIs over OAuth2. Confirmations, rejections and backorders come back as explicit states, not emails.

4Tracking

When a supplier ships, tracking numbers sync back to Shopify as fulfillments, so the customer gets the normal notification.

5Exceptions

Anything that can't complete lands in a queue in an admin console, grouped by state: validation failed, rejected by supplier, backordered, needs a person. One person clears it in minutes instead of working every order.

Rollout

Nothing went live all at once. A master switch and per-capability toggles let intake run in shadow mode first, then routing, then placement for one supplier, then the other. Each step was compared against the manual process before the next was switched on, and any step could be pulled back without a deploy.

Results, and how they were measured

MeasureBeforeAfterWindow
Median order to shipment3.15 days1.24 days3 months before and after launch
Shipped same or next day4%41%3 months before and after launch
Shipped after three days54%23%3 months before and after launch
Headcount added00since launch

Measured from Shopify order and fulfillment timestamps on all dropship orders, comparing the three months before launch with the three months after. No dashboard screenshots here by design: the store's figures stay private, the architecture and the deltas don't.

What it took

Next.jsTypeScriptPostgresShopify Admin APIWebhooksOAuth2 supplier APIsCloud RunGitHub Actions
Have the same problem? Tell us what's manual, what's breaking, what Shopify won't do. One email is enough to start. We reply within one business day with questions or a plan.