DC

Insights

15 findings, ordered by commercial weightEvidence from the live BC tenant, 11 Aug 2026
Replaces: the audit deck nobody opens twice, and the spreadsheets built around it
4,500item locations priced below cost or with no cost at allRead the finding
1.5%of the forecasting engine's buying advice reaches an orderRead the finding
41.5average days late across 400 released ordersRead the finding
0 of 5approval workflows running, since June 2025Read the finding
Ask the findingsOne question, answered from the figures on this page and nowhere else.15 findings, all cited
The answer is built only from the figures above, each of which names the file and row it came from. Where the page does not hold an answer it says so rather than reaching for one, and no figure is ever estimated, extrapolated or rounded for effect.

What the evidence says is going wrong, ordered by what it costs, each with the action that closes it. Every number names the file it came from.

01Pricing and marginHighest impact

MSC are selling part of the range at a loss and the system does not stop them.

Defects by count, against 70,400 item locations4,500item locations priced at or below cost,or carrying no usable cost at allout of 70,400 across the two sitesSelling price at or below costapprox 2.5kCost price zero or negativeapprox 2.0kProduct description missingapprox 2.8k6.4 per cent of the item location estate, and any of it can be quoted, ordered and invoiced without a warningNetstock data quality dashboard, 11 Aug 2026. The 6.4 percent is the two red rows, 4.5k over 70.4k. Missing descriptions are a separate defect and are not in that count.
What to do

A margin floor on the price record, checked at the point of sale. It turns silent defects into a queue somebody clears once.

Why it ranks 01

Ranked first: it loses margin on every affected line today, and nothing stops it.

Source · msc-bc-audit/netstock-functionality-register.csv row NSF-012: score 97.75 percent, cost price <= 0 approx 2.0k, selling <= cost approx 2.5k, product descriptions missing approx 2.8k. Total item locations from NSF-016, approx 70.4k (EAST approx 27.9k, WEST approx 26.6k).
02Buying and stockHighest impact

MSC pay for a forecasting engine and then buy almost none of what it recommends.

5,300supplier recommendations generated in six months
78downloaded and keyed into BC by hand
1.5%of the engine's buying advice that lands
0transfer recommendations used
Six months of recommendations, and what happened to themGenerated by Netstockapprox 5,300Downloaded by planners78Written back automaticallynone, there is no write backTransfer recommendations used0The six months to 11 Aug 2026, across three buyer and planner users.
Why it matters

Every recommendation that does not land is stock bought late or cash tied up in stock nobody needed.

What to do

Bring the recommendation in as a working queue rather than a download. Close the transfer gap first, it is the cheapest stock MSC already own.

Why it ranks 02

Ranked second: the licence and three planners are paid for, then overruled by hand.

Source · msc-bc-audit/pain-points-and-opportunities.csv rows PP-018 (78 of approx 5.3k downloaded in 6 months) and PP-017 (0 DC orders downloaded in 6 months while BC shows daily transfers); netstock-used-unused-matrix.csv rows 6 and 7; bc-netstock-integration-map.csv row 4 (no automated write back observed, 3 buyer and planner users).
03Pricing and marginHighest impact

Two customers can hold two different prices for the same product and nothing in Business Central raises it. The pricing work already built finds them, and it treats a ten per cent spread as the point where somebody should look.

30%spread the rule calls high severity
15%the medium band starts here
2prices minimum before a SKU is looked at
max, minthe spread is measured against the lowest price
Severity bands, as the rule already defines themHigh, 30 per cent spread and above30%+Medium, 15 to 30 per cent15 to 30%Low, 10 to 15 per cent, the reporting floor10 to 15%The bands are the code's own, not a proposal. Variance is (max minus min) divided by min, so a line sold at 100 and at 200 reports 100 per cent.
Why it matters

Two buyers comparing notes is how this gets found today. The rule to find it first already exists and it is ours.

What to do

Run it on a schedule, group it by SKU and put the output in front of the person who owns the price. Carry the caveats with it: the rule buckets on the SKU alone, so unit of measure, currency, quantity break and effective date are not yet part of the key.

Why it ranks 03

Ranked third: it is the defect the pricing project was built to find, and the rule is already written.

Source · msc-data-project lib/pricing/discrepancyRules.ts lines 7 to 11 (variancePct >= 30 high, >= 15 medium, else low), line 15 (minVariancePct default 10), line 42 (a SKU needs at least 2 prices), lines 59 to 61 (averages to 4 decimal places, variance to 2). Same default at pages/api/reports/discrepancies.ts lines 13 to 14. Bucketing on SKU alone is visible in the same file.
04Pricing and marginHigh impact

The pricing estate behind the ladder runs to roughly 650,000 sales price lines, and the comparison that checks them holds no tolerance at all.

2,600pages per segment to read them, at 250 a page
4decimal places the unit price is held to
0tolerance in the price comparison
80price lists deep filled on every sync run
Why it matters

An exact comparison at that scale is honest but unforgiving. A rounding difference of a hundredth of a penny reads the same as a real conflict, so the tolerance is a business decision that has not been taken yet.

What to do

Set the tolerance where the business wants it, in one place, and state it on every report that uses it. The platform carries the figure so a finding cannot be argued with.

Why it ranks 04

Ranked fourth: it sizes every other pricing finding on this page.

Source · msc-data-project pages/reports/price-conflicts.tsx line 314: "Per-segment OData page cap. ~650k lines at pageSize 250 needs >= 2,600 pages per segment." This is the project's own working figure, written to size a page cap, and it is the only scale statement the repository commits. lib/pricing/comparePriceLists.ts line 39 compares with === and no tolerance. prisma/schema.prisma holds BcPriceLineCache.unitPrice as Decimal(12,4). lib/bc/sync.ts line 235 caps the page size at 250 and line 238 targets 80 price lists a run.
12Buying and stockModerate

The two sites are not running the same business. West turns stock nearly twice as fast as East and still misses its fill rate, which is the transfer gap showing up in service.

93%fill rate at EAST, target 96 percent
87%fill rate at WEST, same target
5.4stock turns at EAST
8.9stock turns at WEST
Fill rate against targetTarget, both sites96%EAST93%WEST87%Netstock network performance, 11 Aug 2026. EAST approx 27.9k item locations, WEST approx 26.6k.
Why it matters

Orders nobody could serve, from a business that had the goods somewhere. The same money, in the wrong building.

What to do

Fix the transfer path before buying more stock. The engine already produces the transfer recommendations nobody uses.

Why it ranks 12

Ranked twelfth: real service loss, and the visible face of the transfer gap.

Source · msc-bc-audit/netstock-functionality-register.csv row NSF-016 (5 locations, approx 70.4k item locations, EAST approx 27.9k and WEST approx 26.6k, fill rate EAST 93 percent vs target 96 and WEST 87 percent vs 96, stock turns EAST 5.4 and WEST 8.9), confidence high; pain-points-and-opportunities.csv row PP-017. Close this finding
The remaining 10 findingsSame evidence, lower commercial weight. Open one for the full read
RankFindingThe figureWeight
What it adds up toIf you read one thing on this page
Stop the leak

A margin floor checked at the point of sale. Highest value change on this page, and it is a rule, not a rebuild.

Show the price

Name the winning level on every line. Thirteen levels of precedence stop being a liability and start being the asset they should be.

Buy what the engine says

Moving stock MSC already own between two sites they run is the cheapest service fix available. Today none of it happens.

Bill sooner, prove control

Late orders, uncounted quotes and stalled approvals all fix the same way: the work goes back on a screen with a name against it.

Where these figures come fromIncluding how the order was decided

Two sources, and every card names its own. The pricing work already built at gitlab.personify.tech/msc/msc-data-project, read directly, file and line quoted. And the read only audit of the live MSUPPLY LIVE Business Central tenant of 11 Aug 2026, the Netstock UI audit of the same day, the AL source read from the tenant's own extensions, and Product Scope chapter 14.

The data project publishes rules, not results. Its findings tables are declared and never written, its seed creates nothing and every count it shows is computed live and discarded, so what it contributes here is its thresholds, its comparison rules and its own record of what is still to build. Its mock fixtures are never shown as findings.

Two caveats travel with the audit numbers and both stand on their cards. The 999 plus open quotes is a display ceiling, so a floor rather than a count. The 400 delayed orders was recorded at medium confidence. The 650,000 price lines is the data project's own working figure for the size of the job, written to size a page cap, not a verified count.

The order is a commercial judgement, not a measurement. Each finding states the basis for its placing, built only from the figures cited on it. No pound value is attached to a finding the source did not price.