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.
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.
=IFERROR(VLOOKUP(A2,'Surveys export'!A:F,5,0),"pending")| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | order_id | customer | survey (lookup) | carrier | install | serial (lookup) | sub |
| 2 | 48213 | Okafor, J | Approved | JB Hunt 10/14 | 10/18 AM | AMP1Sโฆ0096 | Active |
| 3 | 48220 | Ruiz, M | pending | #N/A | |||
| 4 | 48224 | Chen, A | Approved | FedEx | no date | #N/A | |
| 5 | 48224 | Chen, A | Approved | dup, see row 4 | 10/21 | #N/A | |
| 6 | 48231 | Patel, R | Approved | JB Hunt 10/15 | resched x3 | AMP1Sโฆ0112 | not activated |
| 7 | 48237 | Levine, S | Approved | FedEx 10/16 | 10/20 PM | #N/A | Active |
| 8 | 48240 | Haddad, N | #REF! |
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.
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.
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:
| Measure | Sheets era | On the backbone |
|---|---|---|
| Cancellation rate | ~8% | ~5% |
| Orders handled per day | Hundreds, with overtime | Thousands, same team |
| Order-to-scheduled-install | ~9 days | ~4 days |
| Orders touched by hand | All of them | Exceptions only |
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.
can we add "relocation" as a case type? we're logging them as installs and it's throwing off the calendar
that flow was built by the old admin. I'll raise it with the agency, they quoted 2 to 3 weeks last time
ok. in the meantime I'll keep the relocation sheet going
fyi the FedEx statuses didn't come through again overnight, CS is pasting tracking into cases by hand this morning
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.
An order and service system amp owns, on its own AWS, writing to the warehouse the reporting already reads.
Order #51904 ยท J. Okafor
Service events on this order
Exceptions 11 open ยท reasons attached
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.
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.
| Flow | Salesforce sent | OpsDesk would have sent | Match | Note |
|---|---|---|---|---|
| Install confirmation email | 142 | 142 | 100% | cleared for switch |
| Carrier ETA update | 389 | 389 | 100% | cleared for switch |
| Relocation case | 17 | 19 | 89% | 2 were on the side sheet, never in Salesforce. OpsDesk is right. |
| Nightly Intercom push | 1 | 1 | 100% | found in the audit, kept |
| Internal 3PL email | 6 | 5 | 83% | 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.
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.
| Measure | On Salesforce | On the system amp owns |
|---|---|---|
| Who can change a flow | An agency, by ticket | The ops lead, same week |
| Carrier and support updates | Re-typed, ~40 to 50 a day | Synced on schedule |
| Users | Per-seat licence | 20, admin held by ops |
| Where the data lives | Salesforce objects | Their own warehouse |
What held, what needed rework.
The backbone carried peak season without added headcount, and the exception queue stayed the whole job.
Early exception rules were too cautious and queued too much for human review. Thresholds were retuned once real volume showed where judgment actually mattered.
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.