The sync guarantee
How sync actually works
A ratified menu is only worth something if someone keeps checking it stayed ratified. Here is the exact mechanism, stage by stage — not a metaphor for it.
Scan → Ratify → Canon → Feed → Drift-watch
Five stages from first connection to a standing check that never stops running.
Scan
Connect Square, Clover, or Toast (read-only). MenuCanon pulls live menu data across every location and runs a cross-location diff — every price, name, and modifier that doesn't match its peers becomes a finding.
Ratify
Every finding goes to the operator in /review with full evidence (location, exact name, price, screen path). One of four calls gets recorded: canonical (pick the right value), intentional (the variation is deliberate), structure change (it's not a price error), or skip.
Canon
Ratified decisions join back to their evidence into one record at /canon: a canonical name, a canonical price where one applies, any per-location overrides the operator explicitly allowed, and the timestamp of the last ratification. This join has exactly one implementation, shared by the screen and the feed below — there's no second code path to drift out of sync with itself.
Feed
The canon publishes as a versioned JSON contract at GET /api/canon/feed: a schema_version, a generated_at timestamp, every canonical item, and a modifier price dictionary. This is the shape a partner integration — or your own recurring job — reads to know what “correct” currently means.
Drift-watch
Pull a fresh export any time after cleanup and run it against the feed. The drift check re-locates every canonical item by name and compares its live price and name to the ratified value, location by location — and flags the exact item and location where it no longer matches. Sync isn't a one-time fix; it's a standing check against the same record every time.
What the feed actually contains
Not a summary of the product — the literal contract at GET /api/canon/feed.
Feed schema
v1.0.0
versioned — partner integrations don't break silently on a shape change
Canon record
4 fields
canonical name · canonical price · per-location overrides · last-ratified timestamp
Drift check
name + price
re-verified per location against the same ratified value
Toast policy
Detect & prescribe
no automatic write-back to Toast — a change list for your team
{
"schema_version": "1.0.0",
"generated_at": "2026-08-02T18:04:11.000Z",
"last_ratified_at": "2026-07-12T21:35:51.577Z",
"items": [
{
"finding_id": "f-0001",
"item_key": "50 piece charcoal tshirt lg",
"type": "price_drift",
"canonical_name": "50 Piece Charcoal T-Shirt - LG",
"canonical_price": 89.0,
"per_location_overrides": {},
"decided_at": "2026-07-12T21:35:51.576Z"
}
],
"modifiers": [ /* canonical modifier-option price dictionary */ ]
}What this is — and isn’t — yet
The feed and the drift check run against a POS export you provide; Toast remains detect-and-prescribe only — MenuCanon does not write back to Toast. The feed itself has no access control yet, so treat it as an internal contract until a partner integration is live.
Get your free drift scan
See the drift before you decide whether the guarantee is worth it.