Case Studiesamp, connected fitness ยท Operations & Logistics

amp's order flow, from one spreadsheet to a system it owns.

amp sells connected fitness equipment that has to be surveyed, scheduled, installed and activated, not just shipped. As amp scaled it bought Salesforce and NetSuite, and we built the integrations that made them agree on one order record. About 18 months later, with most of the logic living in that integration layer, Salesforce was mostly a ~$300k a year screen over it. We replaced the screen with a system amp owns, hosted for ~$30 a month. The order record underneath did not change, which is why the switch was a low-risk move.

Chapter 1The integrationsamp chose the systems. We made them agree.
~35%
relative drop in the cancellation rate between purchase and install (~8% to ~5%)
~9 โ†’ ~4 days
from order to scheduled install, with the same ops team
~$300k โ†’ ~$30
a year on Salesforce, to a month hosting a system amp owns (chapter 2)
The situation

A hardware business scaling on a spreadsheet that broke a little every day.

Every order needed a site survey approved, a carrier booked, an install confirmed, a serial number logged and a subscription switched on. Each of those came from a different export, so the master sheet was a stack of tabs joined by lookups: orders from Shopify, surveys from Typeform, serials from the warehouse, and a tab that was really a CSV the team exported every morning to upload to the carrier. When a lookup missed, the customer heard nothing between paying and delivery, and some of them cancelled in that silence.

As amp grew it did what a fast-growing ops team should do and bought real systems: Salesforce for cases and installs, NetSuite for inventory and finance. Those were the right calls. The problem was that nothing connected them, so the sheet stayed on as the join.

โ–ฆ
amp orders MASTER (do not sort!!)
File ยท Edit ยท View ยท Insert ยท Format ยท Data
C2=IFERROR(VLOOKUP(A2,'Surveys export'!A:F,5,0),"pending")
ABCDEFG
1order_idcustomersurvey (lookup)carrierinstallserial (lookup)sub
248213Okafor, JApprovedJB Hunt 10/1410/18 AMAMP1Sโ€ฆ0096Active
348220Ruiz, Mpending#N/A
448224Chen, AApprovedFedExno date#N/A
548224Chen, AApproveddup, see row 410/21#N/A
648231Patel, RApprovedJB Hunt 10/15resched x3AMP1Sโ€ฆ0112not activated
748237Levine, SApprovedFedEx 10/1610/20 PM#N/AActive
848240Haddad, N#REF!
MASTEROrders exportSurveys exportSerials (WH)JB Hunt uploadFedEx uploadSubscriptionsOLD do not use+

Where it stood. Seven tabs joined by lookups, two of them exported to CSV each morning for the carriers. Illustrative rows. Every error cell is a customer who is not hearing anything right now.

What we built

amp had picked the systems. We built the integrations so one order flowed through all four, and the team only touched exceptions.

The systems already knew everything about each order; nobody had wired them together. We built the integration layer between Shopify, NetSuite, the 3PL and Salesforce: order, inventory and status events sync automatically, one record carries the truth, and a delivery date reaches the customer without anyone opening a sheet.

Event-driven, not batch
Order and status events sync across the four systems in minutes, replacing nightly exports and re-keying
One order record
Status, location and promise date live once, and every system reads the same record
Exceptions, not everything
Orders that flow clean never need a human. The ones that cannot reconcile land in a queue, with the reason attached
In their stack
Built on the systems they already pay for, mappings and logic in their repo. No middleware platform to subscribe to
One order, checkout to doorstep, no re-keyingHow it works
The order
Shopify checkout
Inventory & finance
NetSuite
Fulfillment & tracking
The 3PL
Customer & CX
Salesforce
One order flow
Every status change syncs within minutes, and all four systems read the same record
Anything that cannot reconcile lands in an exception queue with a reason, not in a spreadsheet
For the customer
A delivery date at checkout, updated automatically when anything about the order changes
For the fulfillment team
An exception queue instead of a 40-column sheet. Clean orders never need a person
For finance
Shopify, NetSuite and the 3PL reconcile to the same numbers, without the month-end hunt
The sheet from the situation above did not get cleaned up. It got retired: orders run themselves, and the team's day is the exceptions.
What it changed

Order volume grew from hundreds a day to thousands through the same team, and customers stopped cancelling in the silence.

The automation was the enabler; these are the outcomes it bought:

Cancellations, down roughly a third
The ~35% is the relative change in amp's own cancellation rate before and after, from ~8% to ~5%. We attribute most of it to customers no longer hearing nothing between order and install, and we did not isolate other changes over the same period.
Same team, higher volume
Volume grew from hundreds of orders a day with overtime to thousands with the same ops team size, because the team's time went to the exceptions rather than to every order.
Concierge, kept
The human steps customers valued survived the automation. The system drafts and pre-stages, a person still makes the call and sends the message.
Before and after the backboneDraft figures
MeasureSheets eraOn the backbone
Cancellation rate~8%~5%
Orders handled per dayHundreds, with overtimeThousands, same team
Order-to-scheduled-install~9 days~4 days
Orders touched by handAll of themExceptions only
Chapter 2Replacing SalesforceAbout 18 months later
The situation

Salesforce had become a ~$300k a year front end that nobody could change.

Salesforce was the right tool when amp bought it: a fast-growing ops team with no engineers needed a system for cases and installs, and it was the one people knew. By now, though, the order record, the events and the logic all lived in the integration layer and the warehouse. Salesforce was mostly the screen the team looked at them through, at around ~$300k a year. The flows inside it had been built by an admin who had since left, so any change meant a ticket to an agency and a wait, and the team had quietly gone back to copy-paste for the things the flows did not cover. Carrier status, order imports and support sync were being re-typed roughly 40 to 50 times a day.

We did not recommend replacing Salesforce at the start, because at that stage it was the right tool and amp had no engineers. We recommended it once the order record, the events and the logic all lived outside Salesforce, so the switch no longer put any of that at risk. What was left to build was a front end around how amp's ops team actually works, with AI on the same governed data, handed to the people who use it.

~$300k / yr
Salesforce licence, used mostly as a front end
โ†’
~$30 / mo
hosting on amp's own AWS, not counting the build or ongoing engineering time
#ops-systems Slack ยท illustrative
Tuesday
AL
Alin 9:12 AM

can we add "relocation" as a case type? we're logging them as installs and it's throwing off the calendar

DV
David 9:40 AM

that flow was built by the old admin. I'll raise it with the agency, they quoted 2 to 3 weeks last time

AL
Alin 9:41 AM

ok. in the meantime I'll keep the relocation sheet going

Thursday
MK
Mike 2:05 PM

fyi the FedEx statuses didn't come through again overnight, CS is pasting tracking into cases by hand this morning

DV
David 2:30 PM

renewal notice attached. higher again, same seats.

The pattern, not a transcript: a change request, an agency wait, a side spreadsheet, and the licence going up anyway.

What we built

An order and service system amp owns, on its own AWS, writing to the warehouse the reporting already reads.

OpsDeskamp ยท production
OrdersServiceExceptions 11FlowsAdmin
Order #51904 ยท J. Okafor
Shopify ยท placed Oct 14 ยท promise Oct 22
StatusShipped
CarrierJB Hunt ยท polled 08:40
SurveyApproved Oct 15
InstallOct 22, AM window
SerialAMP1Sโ€ฆ0442
SubscriptionActivates on install
Service events on this order
Oct 15Site survey approveddone
Oct 19Carrier pickup confirmed, ETA matched to promisedone
Oct 22Installation, AM window, tech assignedbooked
Oct 22Customer confirmation emailstaged
Exceptions 11 open ยท reasons attached
#51877 Install booked before survey approved
review
#51860 Carrier shows delivered, no install on calendar
review
#51891 Relocation requested, original install still open
review
#51902 Intercom case open 3 days, order not updated
review
Flow: install_confirmation ยท last edited by Alin, Oct 9 ยท if survey approved and carrier ETA within promise window, stage customer email and book AM/PM slot

OpsDesk, the system amp's ops team works in. Demo data. Carrier status, order imports and Intercom sync run on schedule; the queue holds only what needs a decision.

Built around how amp's ops run

Installation scheduling, relocations, survey approval and subscription changes are first-class parts of the system. Service events live on the order, so the install date is in one place and the calendar, the order and the customer agree.

Changes in days, not tickets

amp's ops lead is the admin. Business rules are visual pipelines the people who run them can open, test and change, and they are documented, so a change is a conversation on Tuesday and live by Thursday.

The re-typing is gone

FedEx and JB Hunt status is polled and matched to the order, cancellations and status changes sync once, Intercom stays in step on a schedule, and exceptions are flagged instead of found. Carriers see the same payloads and IDs they always did.

Theirs, on their cloud, with AI on the same data

It runs in amp's own AWS account, writes to their Snowflake, and the code sits in their repo. Because it writes to the warehouse the reporting reads, the governed AI setup amp's team already asks questions in can answer ops questions too, and new flows can be drafted with it rather than ticketed. Hosting is ~$30 a month. If Meridian disappeared tomorrow, the system would not.

How the cutover ran

Nothing switched off until the people using it signed off.

Read-only audit

Before building anything, we read every flow, rule, API user and credential in the Salesforce org, including the things nobody had written down. At amp that turned up a nightly Intercom push and internal 3PL emails that would have broken silently if the licence had just been cancelled.

Build, ~4 months

Orders, service cases, carrier tracking and surveys moved over in that time, backfilled from the warehouse so history came with them.

Shadow run

The new system recorded every email, booking and update it would have sent, without sending any of it, and the two were compared daily until they matched.

Switch, flow by flow

Each flow moved with a one-step rollback, and the Salesforce licence came off last. Typeform and Klaviyo stayed, because they were doing their jobs.

Shadow run, daily comparison illustrative ยท week 3
FlowSalesforce sentOpsDesk would have sentMatchNote
Install confirmation email142142100%cleared for switch
Carrier ETA update389389100%cleared for switch
Relocation case171989%2 were on the side sheet, never in Salesforce. OpsDesk is right.
Nightly Intercom push11100%found in the audit, kept
Internal 3PL email6583%one hardcoded recipient had left. Fixed, re-run.

The shape of the comparison that ran until it matched. Each mismatch turned out to be a rule nobody had written down, which is why the run was worth the weeks it took.

What it changed

The licence saving got amp's attention. What it kept is a system its own team can change.

The number people remember is the licence. The thing that changed the day to day is that the ops team stopped working around their tools: the side sheets went, the agency queue went, and a wrong rule can be fixed the same week it is spotted by the person who spotted it.

Before and after draft figures
MeasureOn SalesforceOn the system amp owns
Who can change a flowAn agency, by ticketThe ops lead, same week
Carrier and support updatesRe-typed, ~40 to 50 a daySynced on schedule
UsersPer-seat licence20, admin held by ops
Where the data livesSalesforce objectsTheir own warehouse
Since then

What held, what needed rework.

Held

The backbone carried peak season without added headcount, and the exception queue stayed the whole job.

Needed rework

Early exception rules were too cautious and queued too much for human review. Thresholds were retuned once real volume showed where judgment actually mattered.

Where it went next

The engagement grew from fulfillment into the metric layer and governed AI self-serve, on the same embedded model. The Salesforce replacement in chapter 2 came out of that same engagement, and the system it produced is amp's to keep.

Get in touch.

Tell us what you are trying to figure out. If we can help, we will say how. If we are not the right fit, we will say that too, and point you somewhere better.

01
Free work first
We start by doing a real piece of work on your data, free, so the first thing you judge is output, not a pitch.
02
First build, fixed scope
One piece of work at a fixed price, scoped to a few weeks: a metric layer, a tracking plan, one agent or one pipeline, whichever gap you came with. Small enough to be safe, real enough to matter.
03
Scale when it earns it
Month to month from there, from a few thousand a month. You own every model, dashboard and definition.