← All case studies Case study · Fathom Cookware · 3 locations 2024 → ongoing Two custom apps
Case study02 of 02

How Fathom's product pages started telling the truth about stock across three locations.

Fathom sells cookware and tableware across three inventory locations. Bundle pages showed "ships in X days" placeholders, and the stock math missed components split across locations. I built two custom Node.js apps that now keep per-location stock and pre-order arrival dates accurate for a 2,238-variant catalog.

The result
74 74
What changedSKUs resolved across 7 active purchase orders — zero errors, in a full production dry-run.
What didn't changeThe theme stayed. No new SaaS subscription.
DurationOngoing partnership — 7+ milestones since 2024.
Engagement
Client

FathomAustralian cookware + tableware, 3 inventory locations

Engagement shape

Ongoing partner7+ milestones since 2024

Stack touched

Shopify Bundles · PredikoNode.js · Dawn 15.2

What it replaced

StockyMigrated before Shopify's sunset deadline

01The challenge.

Fathom homepage — Australian cookware and tableware storefront
Fig. 01 · fathom.com.au — retail + wholesale, three physical inventory locations.

Fathom is an Australian multi-location retailer carrying cookware, tableware, and bundle products across three physical inventory locations — a Crown Street store, a warehouse, and pre-order stock arriving from purchase orders.

Three inventory problems stacked on top of each other. First, customers shopping the storefront couldn't see per-location stock for bundle products composed of multiple variants — generic "ships in X days" placeholders were costing trust on product pages. Second, bundle components were often split across locations — forks at Pre Order, knives at the Warehouse — so the real question wasn't "how much is at this location?" but "can I assemble this bundle from stock across any combination of locations?" Third, Shopify announced Stocky was being sunset, forcing a migration of the existing purchase-order sync before the deadline.

Off-the-shelf apps couldn't handle the cross-location bundle math, and Shopify's native Bundles feature didn't expose per-location stock at the customer-page level.

The question a customer actually has isn't "how much stock is at this location?" — it's "can this bundle ship to me, and when?"
Fathom bundle product page showing per-location stock and a pre-order arrival date
Fig. 02 · Bundle product page — per-location stock and pre-order arrival date, in place of the old placeholder copy.

02What I tried first.

The first version of the purchase-order sync worked for simple variants — but hit a 250-product pagination wall as Fathom's catalog grew past 2,238 variants. The app would hang retrieving inventory one variant at a time, restart, and repeat. Catching that meant owning the scope correction and rewriting the data-fetching strategy for catalog scale.

The first bundle stock calculation computed per-location stock independently for each component — and missed the cross-location case entirely. A bundle with forks at Pre Order and knives at the Warehouse would show "available for immediate dispatch" when the customer actually had to wait. The fix wasn't "more accurate per-location math" — it was a different question altogether: which components combine across locations to make a complete bundle?

03The fix.

Two coordinated Node.js apps running on a single small cloud server.

  • Pre-Order Sync pulls active purchase orders from Prediko (the post-Stocky migration target) and writes per-variant pre-order quantities and arrival dates to the storefront. Rebuilt for catalog scale: it skips deleted and archived products, processes only variants from active POs, and handles rate limits cleanly. The migration off Stocky completed before Shopify's deadline.
  • Bundle Stock Sync calculates true availability for every bundle product across all three locations, including the cross-location case — summing each component's stock across locations to answer "can this bundle actually ship?", and subtracting in-stock quantities so pre-order counts never double-count.

Both apps ship with diagnostic scripts as reusable audit tools, so any future formula change can be verified against live data before it goes live.

Pipeline diagram: Prediko purchase orders feed the Pre-Order Sync, which feeds bundle stock calculations and customer pages across three locations
Fig. 03 · The pipeline — Prediko POs → Pre-Order Sync → bundle stock → customer pages, across 3 locations.
Fathom cart page showing accurate bundle stock and arrival messaging
Fig. 04 · Cart page — accurate bundle stock and arrival messaging.

04The result.

Product and cart pages now show accurate per-location stock and accurate pre-order arrival dates for both regular variants and bundle products across all three inventory locations. Verified against live data: the Bistrot Cutlery Horn Set bundle pre-order count corrected from 25 to 24 after the double-counting fix; the Asparagus Knife displays the correct 8-unit available count; a full production dry-run resolves 74 of 74 SKUs across 7 active purchase orders with zero errors. Both apps have been stable in production since early 2026.

Before · double-counted
25
pre-order count
Bistrot Cutlery Horn Set bundle — in-stock units counted twice in the pre-order figure.
After · verified live
24
the true count
The double-counting fix, verified against live data — pre-order now subtracts in-stock quantities.

05Built for this project.

  • Pre-Order Sync — Node.js app on a webhook + 30-minute schedule. Pulls active purchase orders from Prediko, writes per-variant pre-order quantities and arrival dates to the storefront. Rebuilt for catalog scale (2,238+ variants).
  • Bundle Stock Sync — Node.js app on a webhook + 30-minute schedule. Calculates per-location bundle stock and arrival dates for every Shopify Bundle product, including cross-location math for split-component bundles.
  • Integrations — Prediko (purchase-order management, replaced Stocky), Shopify Bundles, Shopify Admin API.
  • Theme — Dawn v15.2, customized: frontend bundle stock display, pre-order arrival messaging, cart-page bundle status.
What I'd do differently

Two things this engagement got wrong, in retrospect.

Every case study should end with this section. The part I'd do differently is the part worth writing down.

Mistake 01

I didn't plan for catalog scale on day one.

The first version of the purchase-order sync retrieved inventory one variant at a time and hit a 250-product pagination wall as the catalog grew past 2,238 variants — hang, restart, repeat. Catching it meant owning the scope correction and rewriting the data-fetching strategy for catalog scale. Catalog growth is now part of every sync design from the start.

Mistake 02

My first bundle math missed the cross-location case.

The first calculation computed per-location stock independently for each component, so a bundle with forks at Pre Order and knives at the Warehouse showed "available for immediate dispatch" when the customer actually had to wait. The fix wasn't tighter per-location math — it was asking a different question: which components combine across locations to make a complete bundle?

In their words

What the client said.

Eric is a highly competent and thorough developer.

Tim GordonFathom
Read all 32 reviews
Tim Gordon's five-star review of the work
Fig. 05 · Tim's five-star review, as posted.
Author
Erick Kagai

Erick Kagai

Independent Shopify consultant. I write case studies the same way I write proposals — with the bad news in the same room as the good. About Erick

Discovery call · 30 minutes

Is your storefront showing stock numbers you don't trust?

Bring it. The first ten minutes are for working out whether it's a build job, an app-settings job, or a process job. Some asks turn out to need none of the above.