Skip to content
Build logDigital transformation

How we make a growth platform agree with the ERP before it steers purchasing

A growth platform only speeds up decisions if everyone trusts its numbers. This is how we make it agree with the ERP, month by month, before forecasts and reorders run on it.

Contents
  1. The dashboard that disagreed with itself
  2. The commercial question
  3. Why the ERP became the referee
  4. The check design
  5. Common ways revenue gets overstated
  6. The loop
  7. What a wrong number costs
  8. Guardrails
  9. What it unlocks
  10. Before your next dashboard

A growing distributor soon works with two sources of truth: the ERP, and the dashboards and tools built around it. As long as both show the same figures, decisions move fast.

When they disagree, growth slows down. A reorder waits while two spreadsheets are compared, and a channel decision stalls in a meeting about which figure is right.

So every operating platform we build on an ERP has to agree with the ERP, month by month, before anyone uses it for a decision. Only then do forecasts and reorder lists run on it each morning.

Two things we put in place before the platform steers a reorder.

  • Trust
    Month-by-month audit against the ERP’s database
    counts and amounts per document type
    Differences show up before anyone uses the figure
    Before
    none
    After
    in place, runs daily
  • Trust
    Products with a forecast, across reloads
    found and fixed in our review
    Forecasts hold across reloads
    Before
    unstable
    After
    stable, matches the backend
Both rows describe our method and a fix made in review.
A reorder decision on exports and on a reconciled base Timeline comparing one reorder decision. Before: export data from several tools, merge it in a spreadsheet, argue about which number is right, then decide, After: the reconciled base computes forecasts and reorder suggestions every morning, and a person reviews them and decides. The design aim is to remove the debate step. The chart has no time scale. Where the debate step sits in a reorder decision The same decision, run on exports and on a reconciled base. Before exports and spreadsheets Export from several tools Merge in a spreadsheet Which number is right? Decide After reconciled base Reorder list ready every morning, checked against the ERP. A person reviews and decides. No debate about the number. The design aim: no debate step, because everyone works from the same checked figure. A reorder decision on exports and on a reconciled base Timeline comparing one reorder decision. Before: export data from several tools, merge it in a spreadsheet, argue about which number is right, then decide, After: the reconciled base computes forecasts and reorder suggestions every morning, and a person reviews them and decides. The design aim is to remove the debate step. The chart has no time scale. Where the debate step sits ina reorder decision The same decision, run on exports and on areconciled base. Before After exports andspreadsheets reconciled base Export from several tools Merge in a spreadsheet Which number is right? Decide Reorder list readyevery morning,checked against theERP. A person reviews anddecides. No debateabout the number. The design aim: no debate step, becauseeveryone works from the same checkedfigure.
Where the debate step sits in a reorder decision, run on exports and on a reconciled base. The design aim is to remove that step.

The dashboard that disagreed with itself

On one reload, our forecast page showed 89 products with a forecast, and on the next it showed 210. Our review traced the jump to how the page loaded its data.

The cause was two quiet limits in the database behind the dashboard. It returns at most 1,000 rows per request, which means large tables load in pages, and without a fixed sort order each reload could receive a different mix of rows. That produced the 89 and the 210, and the fix made the count stable.

A second query asked for the whole product table at once, silently received only the first 1,000 rows and showed 141.

Before and after: the dashboard that disagreed with itself Bar chart of the number of products with a forecast, as displayed. Before the fix: 89 on one reload, 210 on another, and 141 from a query silently capped at 1,000 rows. After the fix: 210 on every reload, matching the backend value of 210. The dashboard disagreed with itself Products with a forecast, as shown on the page. The backend value was 210 throughout. 0 50 100 150 200 250 89 Reload A 210 Reload B 141 Capped query 210 Any reload 210 Backend Before: unstable page order, silent 1,000-row cap After: stable order, full pagination Forecast page of the operating platform, fixed across all affected pages. Source: platform release notes. Before and after: the dashboard that disagreed with itself Bar chart of the number of products with a forecast, as displayed. Before the fix: 89 on one reload, 210 on another, and 141 from a query silently capped at 1,000 rows. After the fix: 210 on every reload, matching the backend value of 210. The dashboard disagreedwith itself Products with a forecast, as shown on thepage. The backend value was 210 throughout. Before: unstable page order, silent 1,000-rowcap Reload A 89 Reload B 210 Capped query 141 After: stable order, full pagination Any reload 210 Backend 210 0 50 100 150 200 250 Forecast page of the operating platform, fixedacross all affected pages. Source: platform releasenotes.
Products with a forecast, as displayed, before and after the fix. Source type: platform release notes.

We fixed both on every affected page. Each paged request now has a stable sort order and every large table is read in pages. The page now shows the same number as the backend on every reload.

A dashboard that disagrees with its own backend can do more harm than having none. It undermines trust in the numbers that are correct, and that trust is what makes decisions fast.

The commercial question

A business that sells through its own shop, Amazon and business customers makes the same decisions every week. It decides what to reorder, what to send to Amazon’s warehouses, where to hold the price and which channel gets the next euro.

Each of those decisions builds on a number and scales up any error in it. If the sales figure per product is overstated, the reorder comes out too large and cash sits in the warehouse. If it is understated, the product runs out and the listing loses ground. Steering needs one checked figure per product and channel, and it needs that figure on the morning of the decision.

Why the ERP became the referee

Spreadsheets and automation flows that get patched by hand cost nothing up front, yet they take team time every month and surface silent errors only by chance. A dashboard tool on the ERP’s exports is quick to start. Its figures are only as good as the export, which can calculate some documents differently from the ERP’s own database.

A thin owned layer on the ERP takes weeks to build and needs upkeep. It reads the database itself, though, so the ERP becomes the referee, checks run daily, and forecasts and reorders sit on the same base.

The platform reads the ERP read-only and cannot change a record, and for every figure the ERP remains the master record. The sync jobs run on the client’s own server. The mirror sits in a hosted database that only signed-in users can read.

The mirror keeps a few customer fields per order: name, email, city, country and VAT ID. Street addresses and phone numbers stay in the ERP, and the Amazon reports we read contain no buyer details.

Platform architecture: sources, scheduled connectors, platform database, checks, outputs Five columns from left to right. Sources: the ERP, JTL-Wawi, read only, the Amazon SP-API with aggregate sales, traffic, FBA stock and listing reports. Connectors: scheduled syncs for ERP master data, ERP documents and Amazon reports. Platform database: mirror tables, views such as order revenue without quotes, derived tables for forecast and reorder. Checks: post-sync checks, a daily check run every morning, a checksum line on each page on the key path to the dashboards, and a month-by-month audit against ERP SQL. Outputs: dashboards and the decisions they serve. A dashed line shows that the audit reads ERP SQL directly for comparison. Nothing writes back to the ERP. Platform architecture Direction of data flow left to right. Nothing writes back to the ERP. SOURCES CONNECTORS PLATFORM DATABASE CHECKS OUTPUTS ERP (JTL-Wawi) read only master data, documents Amazon SP-API Reports: sales, traffic, FBA stock, listings ERP master data scheduled, incremental ERP documents scheduled, with re-sync Amazon reports scheduled Mirror tables products, orders, order lines, invoices, credit notes, stock Views order revenue without quotes, channel, country Derived tables forecast, reorder, FBA send Post-sync checks after every job Daily check run every morning Checksum line per page, flag above 1% Month audit counts and amounts Month audit reads ERP SQL directly and compares per document type and month Dashboards behind a login Decisions Controlling Reorder and FBA send Forecast per product Price watch People approve key path for revenue figures other data flow read for comparison only Platform architecture: sources, scheduled connectors, platform database, checks, outputs Five columns from left to right. Sources: the ERP, JTL-Wawi, read only, the Amazon SP-API with aggregate sales, traffic, FBA stock and listing reports. Connectors: scheduled syncs for ERP master data, ERP documents and Amazon reports. Platform database: mirror tables, views such as order revenue without quotes, derived tables for forecast and reorder. Checks: post-sync checks, a daily check run every morning, a checksum line on each page on the key path to the dashboards, and a month-by-month audit against ERP SQL. Outputs: dashboards and the decisions they serve. A dashed line shows that the audit reads ERP SQL directly for comparison. Nothing writes back to the ERP. Platform architecture Direction of data flow left to right. Nothingwrites back to the ERP. SOURCES ERP (JTL-Wawi) read only master data, documents Amazon SP-API Reports: sales, traffic, FBA stock, listings CONNECTORS ERP master data scheduled, incremental ERP documents scheduled, with re-sync Amazon reports scheduled PLATFORM DATABASE Mirror tables products, orders, order lines, invoices,credit notes, stock Views order revenue without quotes, channel,country Derived tables forecast, reorder, FBA send CHECKS Post-sync checks after every job Daily check run every morning Checksum line per page, flag above 1% Month audit counts and amounts Month audit reads ERP SQL directly andcompares per document type and month OUTPUTS Dashboards behind a login Decisions Controlling Reorder and FBA send Forecast per product Price watch People approve key path for revenue figures other data flow read for comparison only
Platform architecture: sources, connectors, platform database, checks and outputs.

The check design

Revenue in an ERP rests on three document types: orders, invoices and credit notes. For each type and each month, we compare counts, line positions and net amounts with the ERP’s own database. That gives a small matrix of month-checks, and every cell must agree with the ERP before the figures carry a decision.

Month-check matrix Rows are the eight measures compared with the ERP: order count and order net amount, invoice count, positions and net amount, credit note count, positions and net amount. Columns are months. A teal cell means the platform agreed with the ERP's database for that document type, measure and month. Counts must match exactly, amounts within one euro. Amber cells mark a flagged month, here a missing credit note. One month-check covers one document type in one month. A month-check matrix Eight measures across three document types, month by month, against the ERP's database. MEASURE MONTHS, MOST RECENT ON THE RIGHT RULE Orders Order count exact Order net amount within €1 Invoices Invoice count exact Invoice positions exact Invoice net amount within €1 Credit notes Credit note count exact Credit note positions exact Credit note net amount within €1 One month-check = one document type in one month, all its measures. Counts must match exactly. Amounts must agree within €1. Teal = agreed with the ERP. Amber = flagged. Month-check matrix Rows are the eight measures compared with the ERP: order count and order net amount, invoice count, positions and net amount, credit note count, positions and net amount. Columns are months. A teal cell means the platform agreed with the ERP's database for that document type, measure and month. Counts must match exactly, amounts within one euro. Amber cells mark a flagged month, here a missing credit note. One month-check covers one document type in one month. A month-check matrix Eight measures across three document types,month by month, against the ERP's database. MEASURE RULE MONTHS, MOST RECENT ON THE RIGHT Orders Order count exact Order net amount within €1 Invoices Invoice count exact Invoice positions exact Invoice net amount within €1 Credit notes Credit note count exact Credit note positions exact Credit note net amount within €1 One month-check = one documenttype in one month, all its measures. Counts must match exactly. Amounts mustagree within €1. Teal = agreed with the ERP.Amber = flagged.
A month-check matrix: measures per document type against months.

The figure shows the layout of the checks, not a dated record. Its amber cells mark a flagged month, like the missing credit note described under Guardrails.

Behind the matrix sits a small data model. Each month-check sums the ERP documents and their mirror records for one type, month and measure. It stores both values, the delta and a status. Counts must match exactly. Amount totals may differ only by rounding, and the audit flags any gap above one euro. We keep that allowance fixed rather than scaling it with volume. A busy month is therefore flagged sooner.

The checksum line on each page is a separate, coarser layer. It compares a page’s displayed total with the platform’s own database and flags a deviation above one percent. It is aimed at display faults such as the paging issue above, while the one-euro audit guards the platform against the ERP.

Orders, not invoices, are the revenue basis, because orders carry the sales platform, destination country and customer type that channel decisions need. Order revenue is a steering figure, not booked revenue. Invoices and credit notes stay in the same audit, so the booked side is checked as well. Each document type is compared only with its own counterpart in the ERP. An order and its invoice can therefore fall in different months without creating a gap.

The audit proves that the mirror matches the ERP. It does not prove that the ERP matches the money. For Amazon, fees and adjustments sit in Amazon’s settlement reports, and checking the ERP against those is a separate reconciliation that this audit does not cover.

Common ways revenue gets overstated

Most reconciliation gaps come from a handful of patterns. None of them breaks a row count. That is why they survive.

  • Quotes in the order table. Many ERPs keep quotes and orders in one table. A sync that does not separate them inflates revenue while every row is real.
  • List price instead of charged price. Where business customers get discounts, storing the list price inflates their revenue in particular. We check the charged price.
  • Refunds filtered by prefix. A filter that looks only at number prefixes can drop a class of refunds. Every refund type needs its own check.
  • Foreign currency read as euros. Orders in other currencies must pass through the ERP’s exchange-rate factor before they count.
  • Orders without a product link. They fall into an “unknown” bucket unless a rule assigns them, for example by sales platform.

Each pattern becomes a gate on the way from an ERP document to the figure on a dashboard.

Lineage of the revenue figure: the gates between an ERP document and a dashboard number Lineage from left to right. ERP documents pass five gates before they become the revenue on a dashboard. Gate 1: document prefix, quotes are excluded. Gate 2: price actually charged, discounts applied instead of list prices. Gate 3: currency, amounts divided by the ERP's exchange-rate factor. Gate 4: business unit, inferred from the sales platform when the product link is missing. Gate 5: credit notes, every refund type checked. Then the order revenue view feeds the dashboard figure with its checksum line, and the month audit compares the result with ERP SQL. Each gate guards one common way revenue gets overstated. Where the revenue number comes from Each gate guards one common way revenue gets overstated. ERP documents orders, invoices, credit notes 1 Prefix quotes out 2 Price charged price, not list price 3 Currency exchange-rate factor 4 Unit inferred when product missing Order revenue view, quotes excluded 5 Credit notes every refund type checked, unreturned items count as 0 Dashboard figure checksum line, flag above 1% Month audit compares with ERP SQL, per type and month vs the audit reads the ERP again, independently Gates as implemented in the sync and the revenue views. Lineage of the revenue figure: the gates between an ERP document and a dashboard number Lineage from left to right. ERP documents pass five gates before they become the revenue on a dashboard. Gate 1: document prefix, quotes are excluded. Gate 2: price actually charged, discounts applied instead of list prices. Gate 3: currency, amounts divided by the ERP's exchange-rate factor. Gate 4: business unit, inferred from the sales platform when the product link is missing. Gate 5: credit notes, every refund type checked. Then the order revenue view feeds the dashboard figure with its checksum line, and the month audit compares the result with ERP SQL. Each gate guards one common way revenue gets overstated. Where the revenue numbercomes from Each gate guards one common way revenuegets overstated. ERP documents orders, invoices, credit notes 1 Prefix quotes out 2 Price charged price, notlist price 3 Currency exchange-ratefactor 4 Unit inferred whenproduct missing 5 Creditnotes every refundtype checked,unreturned itemscount as 0 Order revenue view, quotes excluded Dashboard figure checksum line, flag above 1% vs Month audit compares with ERP SQL, per type andmonth the audit reads the ERP again, independently Gates as implemented in the sync and the revenueviews.
Where the revenue number comes from: the gates between an ERP document and a dashboard figure.

The loop

We run the same loop for every source and every document type.

  1. Mirror. Sync the ERP read-only into the platform.
  2. Compare. Check count and amount month by month against the ERP’s database.
  3. Explain. Trace each gap to the documents that cause it.
  4. Fix the rule. Correct the sync or the view, never the report.
  5. Re-run. Repeat the comparison until the gap is down to rounding.
  6. Lock in. Add a check so that the gap cannot return unnoticed.
  7. Build on it. Only then use the figure for forecasts, reorders or pricing.

Steps three and six carry the method. We explain a gap before we fix it, and we keep a fix only when a check guards it.

What a wrong number costs

A wrong figure costs money before anyone notices it. Reorders follow demand, and an overstated demand figure makes every purchase order buy too much.

Capital tied up by an overstated demand figure Bar chart. For every 100,000 euros of planned purchasing, reorders scaled on an overstated demand figure buy too much stock. A 2 percent overstatement ties up about 2,000 euros extra, 7 percent about 7,000 euros, and a figure twice too high about 100,000 euros. Assumption: reorder quantities scale linearly with the demand figure. Real reorder logic nets out stock on hand and safety stock, so these are upper bounds. What a wrong number costs before anyone notices Extra stock bought per €100,000 of planned purchasing, if reorders follow an overstated demand figure. €0k €40k €80k €120k €160k €2k 2% too high €7k 7% too high €100k 2× too high Upper bound: assumes reorders scale linearly with demand and ignores stock on hand. Capital tied up by an overstated demand figure Bar chart. For every 100,000 euros of planned purchasing, reorders scaled on an overstated demand figure buy too much stock. A 2 percent overstatement ties up about 2,000 euros extra, 7 percent about 7,000 euros, and a figure twice too high about 100,000 euros. Assumption: reorder quantities scale linearly with the demand figure. Real reorder logic nets out stock on hand and safety stock, so these are upper bounds. What a wrong number costsbefore anyone notices Extra stock bought per €100,000 of plannedpurchasing, if reorders follow an overstateddemand figure. €0k €40k €80k €120k €160k €2k 2% too high €7k 7% too high €100k 2× too high Upper bound: assumes reorders scale linearly withdemand and ignores stock on hand.
Extra stock bought per €100,000 of planned purchasing, if reorders follow an overstated demand figure. An upper bound that assumes reorders scale linearly with demand.

In this sketch, a 2 percent error ties up at most about €2,000 per €100,000 of purchasing. Real reorder logic nets out stock on hand and safety stock, and the true figure is usually lower. Counting quotes as sales can inflate the demand figure far more. Whether the build pays off depends on purchasing volume and on how large the gap is. So the first step is to measure the gap.

Guardrails

GuardrailWhat it does
Read-only ERP accessThe platform cannot change the ERP. The client’s team maintains the master data.
Month-by-month auditCompares counts and net amounts per document type and month with the ERP’s database. Counts must match exactly, amounts within one euro.
Daily checksEvery morning a fixed set of checks covers row counts, freshness, completeness, references, cross-source agreement, values and computation. After each sync, the checks for that job run too.
Checksum linePages show the displayed total next to the platform database’s total. A deviation above one percent is flagged.
A way backWhen we move a data source to a new connection, the old tasks stay disabled, not deleted, until the new path has proved itself.
A validated referenceNew planning logic must match the team’s validated spreadsheet row for row before it replaces it.

The audit showed its value later, when a re-run found one credit note missing. The audit named the document, so the fix was a wider sync window, not a search. For us, reconciliation is a practice we keep running rather than a number we print once.

What it unlocks

A reconciled base earns nothing on its own. It is the base we put forecasts, reorders and pricing on.

On the same base, forecasts, reorder lists and FBA send quantities can run every morning. A price watch can use the business’s own listing prices as the reference, next to the Buy Box share from Amazon’s own sales and traffic report.

Margins come next, and before they drive decisions, cost prices, reference prices and lead times have to be complete. When they are, we re-verify every margin view with the same loop. The morning run can then show what earns money, not only what sells.

Before your next dashboard

  1. Reconcile before you optimise. A growth decision is only as good as the number under it.
  2. Let the ERP’s own database be the referee. Exports and reports can calculate some documents differently.
  3. A check that keeps running beats a perfect number once. Gaps appear after go-live too.
  4. Show coverage next to every figure. A margin to the cent means little when the cost field under it is empty.
  5. Build the smallest owned layer that answers the question. Keep the ERP as the master.

Pick one month and compare the revenue in your ERP with the revenue in your reports. If the two differ, that difference is the first thing we would trace with you.

Credits

Built by the Capcelerate team. Thanks to the client’s team for access and time.

Tell us what you want to grow. The intro call is free.

Request a free intro callFree, up to 30 minutes. No obligation.