#CANON — binding decisions for the RestaurantBrain deliverable
Status: authoritative. Every other document in this deliverable MUST use these phase names, stack choices, scope tiers, numbers and terminology verbatim. Where an appendix (r01–r09) or a critique (c01–c03) disagrees with this file, this file wins and the appendix is treated as superseded input.
Date: 2026-08-18. Label key: [verified] = checked with a source in the research session · [known] = training data ≤ May 2026 · [estimate] = reasoned guess.
#1. Recommended shape
Decision: build the full POS, sell it CRM-first, in Czechia only, to counter-service chains of 2–8 sites in Prague and Brno. Ukraine is the engineering and support base and customers #2–10, not the revenue thesis. Do not enter a second paid market before the first is at 50 paying sites.
- Own the POS, or do not do this. A CRM on someone else's POS caps identity coverage at ~24% of checks against 30–38% at v1 (A4 true) / 22–28% (A4 false), rising to ~52% at v2 core when we own the order flow, and ~20 points of that gap is high-quality; more decisively, a CRM overlay has no switching cost, churns at 40–60%/yr, and clears only 3–37% gross margin through middleware. Defensibility here is installed base × switching cost × payment contract. The CRM is why the first 100 customers buy; the POS and the payment rail are why the next 700 stay.
- Czechia is the only correct first market. Zero fiscalization since 1 Jan 2023
[known], no producer liability, no local entity required, the widest Stripe Terminal reader roster in CEE (WisePOS E + S710 + S700 + Verifone)[verified], one language, one wage level, one installer pool, everything drivable in three hours. The hard rule that generates this: enter only markets whose time-to-first-legal-invoice is under 60 days. That admits CZ, UA, NL, UK, DE, AT and FR (self-attest); it excludes PL-via-GUM, BE, PT, SK, HU, GR, and it permanently excludes Spain, where LGT art. 201 bis fines the software producer and the 29 Jul 2025 producer deadline was not postponed by RD-ley 15/2025[verified]. - CZ + NL is rejected. A Dutch-speaking support FTE is EUR 4,200–5,200/mo loaded against EUR 2,500 in CZ, cannot be served from Kyiv, and drags a second entity, a second accounting-export format, a second acquirer and a second installer network. CZ + NL is two companies sharing a repository.
- Counter-service only, single-station first. This removes table plans, coursing, seat-level splits, transfers and waiter handhelds, and it takes the offline core from full multi-station (48–58 eng-months) to single-station (17–20). It also matches the ICP: 2–8 site chains, not single sites, because the holdout-attribution feature — the demo that closes deals — is statistically undetectable below ~1,500 treated guests and therefore tells a single-site café to cancel.
- The brief's S1 (founder + 2–4 engineers, 24 months) cannot produce a sellable POS+CRM and must be re-framed. The reconciled scope is 125 eng-months for an S1-cut v1; S1 delivers ~126 eng-months only over 36 months at 3.5 average effective engineering FTE. The canonical bootstrapped plan is therefore 5 engineers over 36 months on EUR 1.8–2.4M, not 3 engineers over 24 on EUR 900k. If that capital is not available, the only honest alternatives are (a) POS-only with no CRM beyond a loyalty ledger, or (b) first-party ordering + loyalty for delivery-heavy concepts as a wedge, and neither is the product in this brief.
#2. Canonical phases
These names are fixed. No document may invent, rename, merge or renumber a phase. Durations are stated for S1 with the S2 equivalent in brackets.
| Phase | Name | S1 months (S2) | Eng-months consumed, cumulative S1 | Exit gate — all must be true |
|---|---|---|---|---|
| P0 | Foundations | M0–M4 (M0–M3) | 14 | ≥8 of 40 Prague/Brno operators place a EUR 200 refundable deposit at ≥EUR 89/site/mo · ≥1 written payments term sheet at ≥25 bps residual, no merchant-ownership clause, no volume minimum unreachable by M36 · Czech counsel opinion signed on e-receipt join lines, loyalty T&C structure under Art. 7(4), and VAT on points redemption · Teya/Storyous/Dotykačka ownership conflict confirmed by direct call · device lab standing and the fsync power-cut test run · Kotlin-vs-TypeScript engine decision recorded as an ADR · one reconciled work-breakdown replacing the nine appendix effort tables · Tech E&O + Cyber bound |
| P1 | Design-partner pilot | M5–M17 (M4–M9) | 56 | MVP (§4) complete · 5 CZ design partners live, invoiced and VAT-charged · ≥3 sites run unattended (no founder or engineer on site) through 4 consecutive Saturdays · zero manual production data repairs in the trailing 30 days · ≥1 full service run with WAN deliberately cut, reconciled to the cent · median tickets/site/week ≤3 by week 6 post-install |
| P2 | First paying market — Czechia | M18–M31 (M10–M18) | 125 | v1 sellable (S1 cut, §4) complete · 40–60 paying CZ sites · ≥60% of sites from outside the founder network · gross churn on the first-20 cohort <20% annualised · fully-loaded CAC <EUR 2,000 and falling QoQ · tickets/site/month <1.4 · contribution margin per site >EUR 25/mo · ≥1 referenceable chain of ≥4 sites |
| P3 | Second market + payments attach | M32–M46 (M19–M30) | 190 | v2 core (§4) complete — S1 ships v2 core only, 58–65 eng-months against P3's 65 eng-months of capacity; S2 ships full v2 in the same phase · Ukraine (PRRO via Checkbox/Vchasno) then Poland (kasa-online printer partner + KSeF) live · payments residual invoiced on ≥30% of new logos · 150–250 sites · NRR >95% · support cost/site/month <EUR 40 |
| P4 | Scale or sell | M47+ (M31+) | — | v3 (§4) starts here and not before · S1: EUR 1.5M+ ARR and breakeven trajectory, or sell to Nexi / Teya / Worldline / SumUp at 3–6× ARR. S2: EUR 6M ARR, gross churn <18%, ≥25% of new logos from channel |
P3 scope, S1 vs S2. P3 is the only phase whose scope differs by scenario. S1's 65 eng-months in M32–M46 buy v2 core (§4): T2 LAN multi-station, the two second markets, guest ordering + QR PWA + Wallet passes, card-linked identity, Brand Vouchers, WhatsApp/Viber, segmentation and the payments-attach machinery. Everything else that used to sit in v2 — table service, the handheld waiter app, the customer-facing display, Apps-on-Devices, the HubRise delivery module, cashback and subscriptions, DE+AT, the second cell — is v3 and is P4-and-later for S1. Table service and the handheld serve a different ICP than §1's counter-service, single-station beachhead and cannot be funded before the counter-service base is at ~150 Sites. S2, on ~132 eng-months/year, ships full v2 (+86.5 → +96.5, §5.1) inside the same phase. Cumulative eng-months at P3 exit stays 190 for S1.
Hard stops, at any time, in any phase: a fiscal or tax defect that causes a customer to be fined; a breach of guest PII; two consecutive quarters in which support headcount grows faster than site count.
Financing gates. S1: pre-seed of EUR 900k–1.1M before P0; extension of EUR 900k–1.3M at the P2 entry gate; and — stated here because the plan does not end at profitability — a third financing event at M47, because peak capital through M47 (EUR 1.8–2.4M) is not capital to breakeven (EUR 3.0–3.5M, §5.2). S2: EUR 7M before P0; EUR 15–25M Series A term sheet at M20 on EUR 1.2–1.6M ARR — if that term sheet does not exist, S2 switches immediately to a profitability plan (freeze hiring, one country, EUR 3M ARR at breakeven by M40).
#3. Canonical stack
One row per layer. Chosen is chosen; the runner-up exists only to name the reversal path and its trigger.
| Layer | CHOSEN | Runner-up (and the trigger that would flip it) |
|---|---|---|
| Counter clients (POS, KDS, expo, CFD) | Kotlin 2.x + Jetpack Compose, Android-only, min SDK 26, laid out as Compose Multiplatform modules (:domain :data :ui-core :ui-pos :android-app) with an inert :ios-app seam | React Native (New Architecture, bridgeless). Flip if the beachhead moves to US/Western EU with >40% iPad attach, or if 2 senior Kotlin/Android engineers cannot be hired in 8 weeks |
| Shared money engine (pricing, tax, modifier resolution, fold) | One Kotlin :domain module, compiled to JVM for the backend and to Android for the counter. Pure, no I/O, integer minor units, no bare dates. This resolves the r05-vs-r08 contradiction against r05 | Rust → WASM core with FFI both sides (+3.5–5.0 eng-months). Running a TypeScript engine inside the Kotlin app is rejected |
| Backend services | Kotlin/JVM, Ktor, modular monolith, OpenAPI-first REST, generated clients | TypeScript/Node 22 + Fastify. Flip only if the shared-engine decision is reversed |
| Web clients (back office, internal support console) | TypeScript + React + Vite, desktop-first 1280px+ | — |
| Guest surfaces (v2 core: web ordering, QR PWA) | TypeScript + React with SSR (Next.js), one multi-tenant PWA on the restaurant's own domain, plus Apple/Google Wallet passes | — . Per-restaurant white-label native apps are prohibited (Apple Guideline 4.2.6) |
| Local device store | SQLite via SQLDelight + SQLCipher, append-only event log + transactional outbox in the same transaction | — |
| Device ↔ cloud sync | Bespoke: HTTPS + WebSocket carrying our own event envelopes, server-assigned per-site monotonic seq, resume/backfill/snapshot horizon | PowerSync as pure opaque transport (licence resolved: FSL, converted to Apache-2.0 since 2026-05-31) [verified]. Saves ~2 eng-months; only adoptable if the event log stays the wire format |
| Device ↔ device (LAN) | Not in v1. T0 single-station only. When T2 lands: bespoke mTLS 1.3 + CBOR framing, elected coordinator with durable monotonic epochs as fencing tokens | — . The T3 dedicated hub SKU (Raspberry Pi) is cancelled permanently |
| Conflict semantics | Event sourcing with per-device append-only streams (UUIDv7 event_id, gapless device_seq, HLC ordering) and a pure deterministic fold. The conflict table is the spec | CRDT (Automerge/Yjs) — rejected for money, permitted only for free-text order notes if ever needed. Field-level LWW (Firestore/Realm) is disqualified |
| Primary database | PostgreSQL 17, shared schema, org_id as the leading column of every composite PK and index, RLS as backstop, order/order_line/order_event RANGE-partitioned monthly on business_date | — . DB-per-tenant and schema-per-tenant are rejected |
| Analytics | Postgres read replica + materialised views to 200 sites, then self-hosted ClickHouse fed from the domain-event outbox (never CDC) | ClickHouse Cloud / BigQuery. Rejected for v1 cost and Schrems II exposure |
| Realtime | Own WebSocket gateway, one connection per device, per-site monotonic seq with bounded gap replay; Postgres LISTEN/NOTIFY fanout to 200 sites | NATS JetStream — deferred until 200 sites, not before |
| Jobs / durable workflows | Postgres transactional outbox + SELECT … FOR UPDATE SKIP LOCKED workers; the four long-running flows written as explicit state machines | Temporal / Restate / DBOS — rejected for S1, revisit above 8 long-running flows |
| Card-present payments (CZ/EU) | Stripe Terminal, semi-integrated, server-driven + local SDK. Devices: Stripe Reader S700 and S710 (two-SKU plan, not one) [verified]. Zero EMV L2/L3 work, ever | Adyen Terminal API (the hedge, and the only confirmed source of PAR [verified]). Nexi/Worldline/ZVT only if a domestic rail is forced |
| Payments economics rail | A separate ISV/referral agreement, term-sheeted in P0. Primary candidate Viva.com ISV Partner Program (ISV sets its own per-transaction markup, 24 European markets) [verified]; then Nexi, Worldline, Global Payments via ČSOB/KB, Nuvei, Adyen for Platforms | — . Teya is structurally unavailable in CZ (owns Storyous, majority of Dotykačka). We never become a payfac: break-even is ~EUR 333M TPV and PSD3/PSR applies H2 2027–early 2028 [verified] |
| Payments (Ukraine, P3) | monobank + PrivatBank Android terminals behind the same PaymentTerminal port. Our payments revenue in UA is EUR 0 | — |
| Fiscal signing | Buy. FiscalProvider interface owned by us; fiskaly / Deutsche Fiskal / EFSTA behind it for every signing market. The argument is co-defendant risk transfer, not price. CZ needs none. UA PRRO via Checkbox or Vchasno Kasa as intermediary — we never hold a merchant's КЕП key. PL via a GUM-homologated kasa-online printer partner (Posnet/Elzab/Novitus), never our own GUM certification | Direct national implementations (~18–22 eng-months for DE+AT+FR+IT+ES+PT plus ~1.5 FTE/yr). Reconsider per country above ~2,000 registers |
| PCI posture | Semi-integrated only, zero PAN, ever. Merchants land on SAQ B-IP; we run SAQ D-Service Provider with evidence collection started in month 1. All "SAQ P2PE" claims are struck from every document and every sales asset | — |
| Printing | Raster-only (HTML/Canvas → 1-bit bitmap → GS v 0), raw TCP 9100 from the native Android app for the till printer, Star CloudPRNT pull for kitchen printers where the SKU allows. No text fast path, no code-page matrix | Epson Server Direct Print. A browser-based print path is rejected: no browser opens a TCP socket, and Chrome's Local Network Access permission (Chrome 142+) [verified] merely adds a second install-day silent-failure prompt with no WebView UI on Android |
| Fleet / MDM | Base-tier MDM for enrolment + kiosk lock-task + OS update window only (Hexnode or Mosyle, ~EUR 5.5/site/mo), with remote config, feature flags, telemetry, log capture, printer health and device health in our own in-app agent | Esper Bridge (USD 4/device/mo) — only above 200 sites or with a kiosk fleet |
| Infrastructure | Hetzner, one EU cell (Falkenstein/Nuremberg), self-hosted. Hard rule: capacity planning is horizontal only — the CCX line repriced +113–176% on 15 June 2026 and any rescale reprices [verified] | AWS eu-central-1 — only when a signed enterprise contract funds the second cell |
| Observability / errors | Self-hosted GlitchTip + Grafana/Loki/Prometheus from day one | Sentry Business (Sentry Team at 50k errors is one bad release across 500 sites × 6 devices) |
| Feature flags / config | OpenFeature + self-hosted Unleash, evaluated synchronously offline from a signed, monotonically-versioned config bundle the device refuses to downgrade, last-known-good cache, 7-day TTL that warns rather than fails | — . LaunchDarkly per-MAU pricing is rejected |
| AI | Anthropic API through one internal ai-gateway; nothing else imports the SDK. claude-opus-5 for menu/POS-migration/invoice ingestion and NL-analytics tool-calling; claude-sonnet-5 for narrative, replies and copy; claude-haiku-4-5 for classification; Batch API (50% off) for anything nightly. Per-feature global spend cap requiring a human to raise it, in addition to per-tenant caps | — . NL analytics is tool-calling over a fixed, parameterised, tenant-scoped metric layer; text-to-SQL over the open schema is prohibited |
| Messaging transport | Local aggregator first (CZ aggregator, SMSAPI in PL, TurboSMS in UA) with Twilio as failover; SES or Brevo for email; per-tenant sending subdomains with own DKIM/SPF | — . Viber and WhatsApp senders are per-tenant only. We never aggregate one sender across tenants in Poland (PKE art. 398 fines scale to the sender's revenue: 3% of prior-year turnover or PLN 1,000,000, whichever is higher [verified]) |
| Billing | Stripe Billing until multi-entity invoicing across three countries is real | Chargebee |
#3.1 Non-negotiable architecture invariants
These are decisions, not guidance. Any document that contradicts them is wrong.
- All money is integer minor units. Never a float, anywhere, in any language.
unit_price_minor,tax_rate_bpandmenu_snapshot_idare snapshotted onto the Line at order time and never recomputed.- Fiscal Document numbers are allocated only by the certified fiscal component, never by application code. Check numbers come from coordinator-leased blocks; kitchen Ticket numbers are cosmetic.
- Business Day is leased from the coordinator, never stamped from a device wall clock. A device more than 5 minutes from coordinator HLC-physical time may take orders but may not close or tender. The fiscal adapter refuses to sign outside a trusted-time threshold.
- Every coordinator-issued lease and every print job carries a durable monotonic
epoch. Coordinator identity derives from(persisted_epoch, boot_id, monotonic_start); a claim needs majority ack from reachable peers or cloud confirmation; in a two-device venue with no WAN the election loser freezes print dispatch for 60 s. - Terminal ownership is a lease with the same fencing epoch as print dispatch, plus nightly PSP reconciliation by idempotency key. This is base scope, not optional.
payment_attempthas an explicitunknownstate and an idempotency key keyed to{check_id, attempt_seq}.unknownis never rendered as "failed". SCA soft-declines (online_or_offline_pin_required) are classified as in-flight, never terminal, and are filtered before reconciliation matching[verified].- The acquirer transaction reference is persisted forever on every Payment. Referenced refunds are mandatory.
- Guest PII lives in a separate crypto-shreddable store keyed by
guest_id; the financial event log holds onlyguest_id. Erasure tombstones replicate over the same sync channel with per-device ack tracking and per-device revocable data keys. Rendered ticket bitmaps are never persisted beyond a 24h retry window. consent_record.ui_surfaceis an enum with nopos_staffvalue and the API rejects it. The cashier-consent button does not exist and cannot be added as a custom field.- The migration importer sets marketing suppression by provenance, and the segment builder cannot clear it. Aggregator-sourced guests are never marketing targets.
- Fiscal logic lives in a slow-release, separately-versioned module, architecturally isolated from the fast app, because certificates bind a named software version.
- The property suite is written by a human before the fold exists, and the fold is accepted only by the property suite, never by review. Anything touching money is implemented with AI assistance and property-tested by a human who did not write the implementation.
- Release freeze Thursday 12:00 → Monday 10:00. Rollout cohorts: lab → 3 friendly sites → 10% → 40% → 100%, minimum 24h soak spanning a dinner service at each step. Android rollback does not exist; kill switches are the only mitigation path.
- On-device retention is 7 days of closed Checks plus all open Checks, hard alarm at 500 MB. Cloud is the archive.
- No query outside an explicit transaction (lint-enforced), or Postgres RLS is not a backstop.
- Offline manager PINs are Argon2id-derived, tuned to ~250 ms on the slowest certified SKU, salted per
(org, employee), wrapped with the device-bound Keystore key, and scoped to managers at that Site.
#4. Canonical scope tiers
Anything not listed in a tier is out of scope for that tier. There is no implicit inclusion.
#MVP — the P1 pilot build (56 eng-months)
Order domain: counter-service Check aggregate (open, add/void/comp Line, Option selection, quantity deltas, discount, additive payments, over-tender, close), deterministic fold, conflict table, invariants P1/P3/P4/P7/P8 as plain property tests, single-station T0 only · local SQLite + SQLCipher + forward-only migrations · outbox + device↔cloud sync · Business-Day lease, clock-skew guard, check-number leasing.
POS Android app: shell, PIN auth, roles, menu grid, Option/Option-Group UI, search, ticket, payment UI, cash management, X/Z, drawer, offline-degradation UX.
Printing: raster core, raw TCP 9100, discovery + static-IP wizard + MAC-keyed rebinding, one printer SKU (Epson TM-m30III all-interface, C31CK50152), basic health/failover/dedupe with a verify queue.
Payments: PaymentTerminal port, Stripe Terminal adapter, unknown state, idempotency, error taxonomy including SCA soft-decline.
Fiscal/tax: FiscalProvider interface, CZ VAT (12% reduced / 21% standard), CZ receipt renderer with golden files, CZK 1 cash rounding on the cash tender only.
Back office: menu management core, staff/PINs/roles, device + printer settings, X/Z view.
Platform: multi-tenancy, auth, RBAC, config resolution, entitlements + release flags, signed monotonic config bundle, kill switches, staged rollout, CI/CD, IaC, observability, backups.
AI: menu ingestion from PDF/photo with citations, confidence scoring and a human review UI that never auto-publishes.
CRM: deterministic identity (phone E.164 / email / loyalty ID), POS phone capture, points + stamps ledger, append-only consent record schema with versioned policy text.
Fleet: in-app agent (remote config with LKG cache, log ring-buffer upload, Device Health screen), QR provisioning wizard, installer runbook.
Design system: one token set, Compose + React component libraries.
Device lab + CI on real hardware; fsync power-cut test.
#v1 sellable — the P2 exit build
Two scopes are canonical. S1 cut = 125 eng-months is what the bootstrapped plan actually ships. Full = 168.5 eng-months is what S2 ships — 167 plus the 1.5 eng-months for in-app staff self-onboarding, funded into Full on 2026-08-18 (see the Full-only list below). The S1 cut is unchanged at 125 because that item is deferred there. Any document still quoting 167 predates this decision.
Included in both, on top of MVP:
- Offline core: injected-fault deterministic simulator, production divergence detector, venue replay + force-resync + audited surgical repair, snapshot/backfill/tombstones/purge, coordinator role for print dispatch.
- Menu engine: variant matrices, nested Option Groups (depth ≤3) with free-count policies, per-channel price lists with recurrence, 86 overrides, per-Station routing and language, image pipeline, publish/diff.
- Reporting: metric layer, Daily Close (immutable, hash-chained, per Site per Business Day), cash reconciliation, the 10 canonical reports.
- KDS + expo mode + bump bar, with an on-screen last-heartbeat age and a full-screen state change after 45 s without a coordinator heartbeat.
- Printing: Star CloudPRNT pull driver, routing engine (Station fan-out, per-Station language, void/modify slips, reprint job IDs), full health/failover/dedupe.
- Payments: reconciliation, referenced refunds and the batch-boundary UX, Tip capture and per-employee attribution,
payment_methodmodel with nullablepar. - Compliance: allergens (EU FIC 1169/2011), compliance test harness, consent-gated dual receipt renderer (fiscal-only vs promotional), DORA contract addendum, EU Data Act export/switching.
- CRM: capture surfaces (POS phone lookup, SMS e-receipt, QR join landing), loyalty ledger (append-only, hash-chained, points/stamps/tiers/expiry), signed offline-redeemable Vouchers (Ed25519/COSE, pinned key set, trusted clock, local spent-set), promo rules engine (config-schema, ~8 rule types, one shared JSON spec, 500-case golden corpus in CI), consent & preference centre with double opt-in, DSAR/erasure with offline tombstone propagation, six templated automation flows, holdout-based incrementality reporting.
- Commercial: Stripe Billing, payments-partner integration, onboarding workflow tool, AI tier-0 support agent with device telemetry, contracts (MSA/DPA/SLA) that expressly do not warrant third-party connector availability.
- Integrations: Google Business Profile (reviews, hours, order-link repoint), Dotypos migration importer, generic CSV/Excel menu importer.
Included in Full only (deferred in the S1 cut): full injected-fault simulator suite, publish/diff rollback UI, internal support console beyond a read-only impersonation view, KDS beyond a bump-capable ticket list, segmentation query builder UI, multi-channel adapters beyond one SMS aggregator + email, campaign power-analysis UI, residual/margin ledger, Storyous importer, accounting export beyond one CZ format, i18n beyond cs/uk/en, in-app staff self-onboarding (1.5 eng-months, Domain C).
In-app staff self-onboarding is a decided item, not a floating one. It is the named mitigation for 60–100%/yr front-of-house churn and for A20's ≤1.4 tickets/Site/month ceiling. It is in v1 Full at 1.5 eng-months and deferred in the S1 cut, and it is the first Full item the S1 cut repays if A20 trips at the P2 gate. The Storyous importer sits in the same list with its own documented swap trigger: ≥25% of the 40 P0 discovery Sites on Storyous swaps it into the S1 cut against a named 1.0-eng-month Full item.
#v2 core — the P3 build
S1 ships v2 core and nothing beyond it in P3: 58–65 eng-months against P3's 65 eng-months of capacity (§2, §5.1). S2 ships full v2 — v2 core plus every v3 item below — inside the same phase, because S2 carries ~132 eng-months/year. The names v2 core and v3 are canonical; no document may write bare "v2" for the S1 P3 build.
T2 LAN multi-station (elected Coordinator, epochs, fencing, peer rediscovery on subnet change) · Ukraine PRRO via Checkbox/Vchasno · Poland kasa-online printer partner + KSeF + JPK_V7M · guest web ordering + QR PWA + Wallet passes · card-linked identity (PAR, enrolment-only, gated on A6) · Brand Vouchers (single-brand, face value, no top-up, no cash-out) · WhatsApp and Viber channels (per-tenant senders) · segmentation, journeys, RFM/lapse modelling, CRM reporting · the payments-attach machinery including the residual/margin ledger.
Plus repayment of the "Full only" v1 deferrals the S1 cut skipped and v2 core depends on, named here so P3 does not rediscover them: the residual/margin ledger (payments attach cannot be invoiced or reconciled without it) · the segmentation query builder UI (segmentation, journeys and RFM have no operator surface without it) · multi-channel adapters beyond one SMS aggregator + email (WhatsApp and Viber ride on them) · accounting export beyond one CZ format (PL JPK_V7M and the UA export) · i18n beyond cs/uk/en (Polish UI and receipts). These are inside the 58–65, not additional to it.
What was cut out of v2, and why. Table service and the handheld waiter app serve a different ICP than §1's "counter-service only, single-station first" and cannot be funded before the counter-service base is at ~150 Sites. The two things that are load-bearing for P3's own exit gate are kept: Site count (T2 LAN plus the two second markets) and identity capture / CRM renewal (guest ordering + QR PWA + Wallet passes, which are what move blended capture from 30–38% at v1 to ~52% at v2 core). Cutting either of those would break a thesis this deliverable states as proven elsewhere; cutting full-service does not.
#v3 — P4 and later
Table service (courses, seats, splits by item/seat, merges, transfers, floor plan) · handheld waiter app · customer-facing display · Apps-on-Devices (our POS running on Stripe S700/S710) · HubRise-resold delivery module, then a native Glovo connector only when HubRise costs a named deal · cashback and subscriptions · DE+AT with fiskaly or Deutsche Fiskal in the chain · second cell / data residency.
No v1 tier contains any v3 item. In particular the HubRise-resold delivery module is v3, not v1 Full and not v2 core — that settles the three-way tier assignment it currently carries, and Domain I's v1 Full total must be reached without it.
#Out of scope — permanently, or until a named trigger fires
| Cut | Trigger that reinstates it |
|---|---|
| Self-order kiosk and unattended EMV | Never in this plan. It is 4.5 eng-months of app plus 5–8 of unattended EMV certification plus 1.0–1.5 of EAA/ADA kiosk accessibility |
| Drive-thru | Never |
| Spain, any activity including a Spanish-language website | Never, until a Spanish counsel opinion on RD 1007/2023 conformance is signed and producer liability is insured (it is not insurable) |
| Basque TicketBAI | Never. Deleted, not deferred |
| United States | Never in this plan |
| T3 dedicated hub SKU | Never |
| iPad / iOS target | Never in v1–v3. Keep the CMP module seam; activating it costs +6–10 eng-months |
| Store-and-forward offline card payments | Never. The claim is "orders, kitchen, cash and receipts keep working with no internet; card depends on your acquirer" |
| Surcharge / service-fee engine | Never in the EU (PSD2 Art. 62(4)–(5)). Mandatory service charge is modelled in the tax engine as a distinct VAT-able entity |
| Gift cards / multi-merchant stored value | Never. Brand Vouchers replace them |
| Payfac / PI licence | Above EUR 300M annual TPV, and not before the PSD3/PSR final text |
| Scales, legal-for-trade weighing | First deli/bakery customer who pays, and only price-computing legal-for-trade scales that hand us a completed line |
| Label printing | ZPL-only when a customer needs it |
| Reservations / table management | Integrate, never build. The minimal waitlist has its own row below and is itself out of scope until its trigger fires |
| Tip pooling / distribution | A paying UK or US Customer, plus a German Steuerberater opinion on the payroll-tax treatment. Tip capture and per-employee attribution is in v1 sellable and is not the same thing |
| Detractor routing + service-recovery Voucher (~1.0 eng-months) | ≥3 design partners or paying Customers ask for it in writing, or review/NPS response becomes a named term in a chain deal. Not in MVP, v1 or v2 core |
| Minimal waitlist + walk-in SMS (~1.5 eng-months) | A signed Customer whose queue is the stated reason they will not buy, or the first table-service Site at v3. Not in MVP, v1 or v2 core |
| Live inventory / stock counting | v3. Ship theoretical COGS only |
| Scheduling and payroll | Never. Integrate |
| Probabilistic identity matching | 500 tenants, and a labelled evaluation set first |
| Visual journey builder, BTYD/CLV | Deleted |
| Partner/reseller portal | 200 sites |
| NATS JetStream, ClickHouse | 200 sites |
| Per-restaurant white-label native guest apps | Never (Apple Guideline 4.2.6) |
| Cross-brand consumer wallet / network (controller model B) | Never in v1–v3. Schema is partitioned so it is addable; behaviour is not built |
| In-parcel "win your customers back from Glovo" QR | Only if we decide in writing not to build aggregator connectors. The two cannot both be safe |
| Toast, Aloha, Brink, Revel, TouchBistro, SpotOn, Olo, Micros 3700, Omnivore, Deliverect | Never |
#5. Canonical numbers
These exact figures must appear in the roadmap and risk documents. Do not re-derive them.
#5.1 Reconciled engineering effort by domain
One roll-up, double-counting removed, critics' upward revisions applied. This total is materially higher than any single appendix headline — that is the point of reconciling.
| Domain | Owns | MVP | v1 sellable (S1 cut) | v1 sellable (Full) | full v2 delta (S2) |
|---|---|---|---|---|---|
| A Order domain + offline core (T0) | fold, conflict table, invariants, local store, outbox, cloud sync, business-day/clock/numbering, simulator, divergence detector, ops replay | 10.6 | 16.0 | 19.6 | +9.0 |
| B Backend platform | tenancy/auth/RBAC/config/flags, menu & catalog engine, tax engine, payments orchestration, realtime gateway, reporting metric layer, Daily Close, cash reconciliation, accounting export, AI gateway + ingestion + analytics, platform/CI/DR | 12.0 | 23.0 | 28.0 | +12.0 |
| C Client apps | design system, POS app, back-office console, KDS + expo, fleet agent, provisioning, internal support console, release engineering, i18n/a11y | 17.0 | 28.0 | 36.5 | +18.0 |
| D Hardware, printing, peripherals | raster core, transports, discovery, routing, health/failover/dedupe, drawer/scanner/CFD, certification matrix, installer tooling, device lab | 5.0 | 10.0 | 13.0 | +4.0 |
| E Payments + PCI | terminal port, Stripe adapter, splits, voids/refunds, reconciliation, tips capture, tokenization, PCI programme | 4.0 | 11.0 | 13.5 | +6.0 |
| F Fiscal + regulatory (CZ only in v1) | FiscalProvider, receipt framework, CZ, allergens, compliance harness, DORA/Data Act | 2.5 | 8.0 | 9.5 | +11.0 |
| G CRM / loyalty / privacy | identity, capture, loyalty ledger, offline Vouchers, rules engine, consent, DSAR/erasure, flows, attribution | 2.5 | 19.0 | 29.0 | +11.0 |
| H Commercial machinery | billing, payments-partner integration, onboarding tool, AI tier-0 support, contracts | 0.0 | 8.0 | 10.5 | +5.0 |
| I Integrations | connector runtime, Google Business Profile, migration importers | 0.0 | 4.0 | 8.5 | +10.5 |
| TOTAL | 53.6 → 56 | 127 → 125 | 168.1 → 168.5 | +86.5 → +96.5 |
How the v2 column splits by scenario. +86.5 → +96.5 is full v2, and it is the S2/Full figure — S2 absorbs it inside P3 on ~132 eng-months/year. S1 cannot: P3 (M32–M46) has 65 eng-months of capacity, so S1 builds v2 core only, 58–65 eng-months (§4), and every v3 item is P4-and-later. The +86.5 → +96.5 delta is not deleted and not re-derived per domain here; §4 defines v2 core and v3 by contents, and S1's P3 budget is the 65 eng-months in the §2 phase table. Cumulative S1 eng-months at P3 exit stays 190.
Domain C Full now carries in-app staff self-onboarding at 1.5 (v1 Full, deferred in the S1 cut), which is why the Full column is 168.5 and not the 167 quoted before 2026-08-18. The S1-cut column is unchanged.
Domain E includes the whole PCI programme, one-off and ongoing: SAQ D-Service Provider evidence collection, QSA scoping and the run cost of 0.3 eng-months per quarter (1.2/yr). That run cost sits inside the 11.0 S1-cut figure; it is not additive to it, and any document quoting ~0.3 eng-months per month is wrong by a factor of three.
Domain H sub-split (S1 cut, 8.0): billing 1.5 · payments-partner integration 1.5 · onboarding workflow tool 1.5 · AI tier-0 support agent 2.5–3.0 · contracts (MSA/DPA/SLA) 0.5 — 7.5–8.0 against the 8.0 line. Every document quotes the AI tier-0 agent at 2.5–3.0 eng-months, never as the whole of Domain H.
Domain I post-v1 restatement: the column reads +10.5, not the +9.0 originally reconciled. The HubRise-resold delivery module (1.50) moved from v1 Full to v3 under §4, while the three Ukrainian migration importers (Poster 1.25, r_keeper 1.5, iiko/Syrve 1.5) stayed in v2 core because Ukraine entry depends on them. Post-v1 splits v2 core 5.5 / v3 5.0; v1 Full stays at 8.50, reached without HubRise by re-costing the mapping-UI framework and the drift/contract harness to 1.75 each. The full-v2 TOTAL is therefore +86.5 → +96.5. See 06 — Integrations §2.2.
Domain I sub-split (S1 cut, 4.0): connector runtime 1.00 · Google Business Profile 1.25 · Dotypos migration importer 1.00 · generic CSV/Excel menu importer 0.75 = 4.00 exactly. The Dotypos importer is 1.00 eng-months everywhere; no document may price it at 1.5–2.5 without moving this total.
AI-assist multipliers, already baked in above, stated per domain so nobody re-applies them: D ≈ 1.25× · A ≈ 1.10× · B ≈ 1.50× · C ≈ 1.35× · E/F/G legal-and-correctness rows ≈ 1.0–1.10×. Certification queues, field sales, physical install, RMA logistics and trust compress by 0%.
#5.2 Scenario S1 — bootstrapped
| Item | Canonical value |
|---|---|
| Team | Founder (0.4 eng-FTE) + 2 engineers at M0 rising to 3 by P0 exit and 5 by M13 + 0.5 fractional product designer (EUR 2.5–4k/mo) + 1 QA owning the device lab + first support hire at site #40, not site #150 + 1 field/install person by site #10 |
| Effective engineering capacity | 3.5 eng-FTE average, after a 15–25% on-call tax from |
| Calendar | MVP at M17. v1 sellable (S1 cut, 125 eng-months) at M31. v2 core (§4, 58–65 eng-months) at M46 — not full v2. The brief's 24-month framing is not achievable |
| Capital | Peak capital through M47: EUR 1.8–2.4M (not EUR 850–950k). Structure: EUR 900k–1.1M pre-seed, EUR 900k–1.3M extension at M20. Capital to breakeven: EUR 3.0–3.5M over 5–7 years and ~800 Sites. These are two different numbers and both must be quoted; the first is not the cost of reaching profitability |
| Breakeven | Not before year 5, at ~800 sites (800–850), on EUR 3.0–3.5M of capital over 5–7 years. The modelled mid case at M47 is ~220 Sites and ~EUR 475k ARR still burning ~EUR 450–550k/yr, so M47 is a third financing event, not profitability: a Series A that requires S2-shaped metrics S1 will not have, or a strategic sale at 3–6× ARR (≈EUR 1.4–2.9M on EUR 475–600k ARR) — roughly the capital invested. This gap is not closed by re-forecasting revenue upward |
| Y3 exit ARR | EUR 550–750k, where Y3 means the third year of revenue, M44–M48 (r09's EUR 982k corrected for cohort churn, corrected CAC and 30–40% payments attach). This band is the stretch case. The modelled base is ~EUR 475k at M47 on ~220 Sites; only the high case (~250 Sites) reaches the bottom of the band. Quote EUR 475k as the expected outcome and EUR 550–750k as the upside, never the reverse |
| Probability of reaching Y3 alive | 35–45% [estimate] |
#5.3 Scenario S2 — funded
| Item | Canonical value |
|---|---|
| Team | 13 product engineers + 2 designers + 1 QA + field ops + sales + support = 22 → 34 → 55 |
| Effective engineering capacity | 11 eng-FTE → ~132 eng-months/year |
| Calendar | MVP at M9. v1 sellable (Full, 168.5 eng-months) at M18. Full v2 — v2 core plus every v3 item (§4) — inside P3; P3 second/third markets by M30 |
| Burn | EUR 13–15M over 3 years (r09's EUR 11.33M plus c03's CAC and support corrections) |
| Y3 exit ARR | EUR 4.5–5.5M |
| Financing gate | EUR 15–25M Series A term sheet at M20 on EUR 1.2–1.6M ARR. Binary |
| Probability of reaching Y3 alive | 30–40% [estimate] |
#5.4 Unit economics — canonical inputs
| Metric | Canonical value |
|---|---|
| CZ list price | POS EUR 79/site/mo + CRM EUR 39/site/mo + KDS EUR 25/station/mo |
| Target subscription ARPU, CZ, at v1 sellable — POS + CRM + KDS only | EUR 110–130/site/mo. Downside case EUR 95. This is subscription revenue only. Any figure that also includes the payments residual or messaging is a different metric and must be labelled "total recurring revenue per Site" — never "blended ARPU", and never compared against this line |
| Fully-loaded CAC, CZ, Y1–Y2 | EUR 2,200–3,200 (includes onboarding, install day, travel, demo kit, and absorption of the 15–25% of signed deals that never go live). Target <EUR 2,000 by M31 |
| Install cost per site | EUR 550–1,400 (CZ), 5–8 on-site hours × 2 people. Plus network remediation the customer did not budget |
| Onboarding labour | 22–55 h manual, 16–34 h with AI menu ingestion (~40% reduction, not 80%) |
| Support hours sold | 07:00–01:00 local, 7 days, as standard. 24/7 is a paid tier at +EUR 25/site/mo |
| Support ticket rate | 2–4/site/month for the first 6 months post-install, decaying to 0.8–1.2; use 1.4 blended for the first 24 months |
| Support ticket mix | ~45% of tickets are hardware-caused; ~60% of those hardware tickets are printing (≈27% of all tickets). Use these two shares verbatim — "60% of tickets are printing" is wrong |
| Support cost per site per month at 500 sites | EUR 40–55 at CZ wages; EUR 25–32 with the AI tier-0 agent deployed |
| Support FTE at 500 sites | 8–11, or 3 plus escalation with AI tier-0 filing tickets from telemetry before the restaurant calls |
| Gross logo churn by cohort | cohort 1 40%, cohort 2 30%, converging to 22–25% by cohort 4 |
| Payments attach, Y3 blended | 30–40% (70–85% on new openings, 20–30% on displacement wins blocked by 36–48-month terminal leases with EUR 300–900 early-termination fees) |
| Payments residual required | ≥25 bps, no merchant-ownership clause. EU net spread available: 60–90 bps gross in CZ/PL against a ~0.51% + EUR 0.135 cost base |
| Net payments gross profit per site per year | Poland EUR 1,620 · Germany EUR 670 · Ukraine EUR 0 to us · US USD 10,150 (reference only) |
| Fiscal signing COGS | EUR 10–15/register/month in DE/AT [verified] = 15–25% of a EUR 59 ARPU. Price DE at EUR 89–129, never EUR 59 |
| Infrastructure | EUR 6.90–7.90/site/month at 100 sites, EUR 5.40–6.80 at 1,000, EUR 3.65–4.85 at 10,000. 3–8% of revenue. Never the constraint |
| AI spend | EUR 0.30–1.50/site/month steady state, plus EUR 0.50–3.00 one-off per onboarding |
| MDM | EUR 5.5/site/month (base tier, 4–6 managed endpoints) |
| Contestable market | CZ POS-relevant universe ~30,000 sites; Prague+Brno counter-service 2–8 site chains ≈ 1,200–2,000; annually contestable 200–500 (new openings 8–12% + ownership changes 5–8% + acute-pain switchers 3–6%) |
| Chain sales cycle | 9–14 months signed-to-fully-deployed. Y2 chain revenue lands in Y3 |
| Realistic exit | EUR 40–90M strategic sale in years 6–9 to Nexi, Teya, Worldline, SumUp or Lightspeed. Anchor: orderbird → Nexi, EUR 130–140M for ~14,000 clients [verified] |
#5.5 Canonical hardware BOM per site
Reseller model only: sell at cost + 15%, never subsidise. Hardware gross margin 10–13% after freight, spares and DOA — cost + 15% is 13.0% of revenue before freight, spares and DOA, so 13% is the arithmetic ceiling of the pricing rule and the previously stated 15–25% was not derivable from it. Model hardware COGS at a 12% gross margin. Sold as a branded bundle of OEM-branded devices — our box, quick-start card, pre-provisioned config, SIM, support number — because the device stays legally Sunmi's/Epson's and CE, GPSR, WEEE, EU Battery Regulation and the Cyber Resilience Act stay with them.
Tier A — counter-service café/bakery, 1 till (the canonical ICP site)
| Role | SKU | EUR ex VAT |
|---|---|---|
| Till | Sunmi D3 Mini GMS 10.1" (integrated 58 mm printer) | 579 [verified] |
| Card reader | Stripe Reader S710 (or WisePOS E) | 230–320 |
| Cash drawer | Safescan SD-4141, 24 V | 85 |
| Router | Teltonika RUT241 (4G failover built in) | 155 |
| UPS | APC BE850G2 | 125 |
| Cabling | Cat6, 2–3 runs | 200–500 |
| Total | EUR 1,374–1,764 |
The EUR 465 anchor this table previously carried was the non-GMS SKU, which the GMS/EDLA rule below forbids; the compliant GMS SKU is EUR 579 [verified], and the Tier A total moves with it to EUR 1,374–1,764 (low = 579+230+85+155+125+200; high = 579+320+85+155+125+500). Both ends are pending distributor quotes at P0 exit. Budget Tier A at the top of the range.
Tier B — counter-service, 2 tills + kitchen
| Role | SKU | Qty | EUR ex VAT each |
|---|---|---|---|
| Till | Sunmi D3 Pro GMS 15.6" | 2 | 639 |
| Front receipt printer | Epson TM-m30III, C31CK50152 all-interface | 1 | 314.87 [verified] |
| Kitchen printer | Epson TM-U220II impact, Ethernet | 1 | 280–340 |
| Bar printer | Star TSP143IV LAN (CloudPRNT) | 1 | 230–280 |
| KDS | Elo I-Series 4 15.6" Android, wall mount | 1 | ~1,150 |
| Bump bar | Logic Controls KB1700 | 1 | 250–350 |
| Card readers | Stripe S710 / WisePOS E | 2 | 230–320 |
| Cash drawer | APG Vasario 1616, 24 V | 1 | 110–150 |
| Network | RUT241 + 8-port PoE switch + 1–2 UniFi U6 Lite | 1 set | 400–650 |
| UPS | APC BE850G2 or EcoFlow River 2 | 1 | 110–350 |
| Cabling | 200–500 | ||
| Total | EUR 4,900–5,800 |
Rules that are part of the BOM, not commentary: buy GMS/EDLA SKUs for anything running our app (non-GMS costs an own MQTT push transport at 1.8–2.2 eng-months, an own OTA pipeline and a frozen WebView) · anything that prints gets a cable; Wi-Fi printers are "unsupported, best effort" · kitchen printers are impact, never thermal · the router and a validated AP are a hard requirement of the install, not a recommendation — without them peer sync cannot establish and we owe 1.5–2.0 eng-months of cloud-relayed peer path nobody costed · networking is 20–35% of the hardware bill and the customer never budgets it · spare pool 5–8% in-region, 1 spare terminal per 25 live units, 2–4% RMA/DOA reserve · device lab capex EUR 8–12k for rig 1, a second CI rig at EUR 8–10k by M12 · re-certify the hardware matrix every 18 months at 0.25 eng-months/quarter forever.
#6. Canonical terminology
Use the left column. The right column is banned in every document, schema, API and UI string.
| Canonical term | Definition | Banned synonyms |
|---|---|---|
| Customer | The restaurant business that pays RestaurantBrain | never the diner |
| Guest | An identified person who eats | customer, client, patron, diner, consumer |
| Org | Billing and contract entity; one legal owner, one data cell | account, company, tenant (in prose) |
| Brand | Menu namespace, branding, default locale, tax classes | concept, chain (in schema) |
| Site | One physical restaurant location | location, venue, store, outlet, branch, restaurant (in schema) |
| Site Group | Free-form many-to-many tag over Sites (region, franchise cohort) | region, cluster |
| Device | One physical hardware unit with a serial | terminal, unit |
| Station | The logical role a Device holds: TILL, KDS, EXPO, CFD, HANDHELD | terminal, till (as a schema name), POS (as a schema name) |
| Check | The financial container for one party at one Site on one Business Day. The canonical noun of the domain | order (in-house), bill, tab, ticket, sale, transaction |
| Order | An inbound order from an external channel (own web, QR, aggregator) that becomes a Check | never used for in-house service |
| Ticket | A kitchen work instruction produced by firing part of a Check to a Station. Never a financial object | kitchen order, chit, docket, KOT |
| Line | One sellable item on a Check | line item, order line, item |
| Item / Variant / Option / Option Group | Catalog entities. Size is a Variant, never an Option. An Option belongs to an Option Group | modifier, modifier group, product, addon, extra, SKU (a field on Variant, not an entity) |
| Menu Snapshot | The immutable, content-hashed, compiled artefact a Device downloads and swaps atomically | menu version (in prose only), catalog |
| Tender | One payment instrument applied against a Check | payment method (reserved for the stored instrument) |
| Payment | A Tender that reached a terminal state at the PSP | charge, txn |
| Tip | Discretionary gratuity. Outside VAT scope | never interchangeable with Service Charge |
| Service Charge | Mandatory charge. VAT-able revenue | never called a tip |
| Discount | Reduces the taxable base | — |
| Comp | Zero-price authorisation with an actor and a reason | free, void (a Comp is not a Void) |
| Business Day | Site-configured 24h accounting window, default 04:00–04:00 local, leased from the Coordinator | trading day, service day |
| Shift | One employee clock-in → clock-out | — |
| Cash Drawer Session | One drawer open → count | till session |
| Daily Close | The immutable, hash-chained, sequentially-numbered per-Site per-Business-Day close | EOD, end of day, Z-Bon (a DE rendering of it), cashup |
| Z-report | The printed/exported rendering of a Daily Close | — |
| Fiscal Document | The legally-numbered artefact issued by the certified fiscal component | receipt (a Receipt is the rendering, not the document) |
| Receipt | The printed, emailed or QR rendering handed to a Guest | — |
| Coordinator | The single-writer role for print dispatch, number leasing and terminal ownership | hub, server, master, leader, primary |
| Epoch | The durable monotonic fencing token stamped on every Coordinator-issued lease and print job | term, generation |
| Event / Command / Fold | Immutable fact / intent / the pure function Events → CheckState | mutation, action, reducer |
| Identity | One identifier: phone (E.164), email, loyalty ID, hashed PAR | — |
| Cluster | The derived set of Identities believed to be one Guest | golden record, master record, profile (Profile is the display projection) |
| Member | A Guest enrolled in a Loyalty Program | — |
| Consent Record | Append-only record per (Identity, channel, purpose) with the hash of the exact wording shown | opt-in, permission |
| Voucher | A signed, single-use, offline-redeemable entitlement (Ed25519/COSE) | coupon, promo code, offer code |
| Brand Voucher | Single-brand, face-value, no top-up, no cash-out instrument | gift card, stored value, wallet |
| Campaign / Audience / Holdout / Treated | Campaign, its frozen audience snapshot, the randomised control bucket, the sent bucket | control group (use Holdout) |
| Incremental revenue | (mean margin treated − mean margin holdout) × n treated, with a bootstrapped 95% CI, net of channel and discount cost | attributed revenue, ROI (unqualified) |
#7. Standing assumptions and their owners
Every row is an assumption the plan rests on, an owner who must resolve it, a deadline, and what changes if it is false. Unowned assumptions do not appear here because they are not allowed to exist.
| # | Assumption | Owner | Due | If false |
|---|---|---|---|---|
| A1 | CZ counter-service 2–8 site chains will pay ≥EUR 89/site/month for POS+CRM | Founder — 40 discovery calls, 20 real order forms with a EUR 200 refundable deposit | P0 exit (M4) | Fewer than 8 of 40 deposit → do not write code. Re-run the model at EUR 95 ARPU (breakeven slips to Q4-Y5, peak capital ~EUR 2.6M) or pivot to first-party ordering + loyalty for delivery-heavy concepts |
| A2 | At least one acquirer or ISV programme gives ≥25 bps residual, no "we own the merchant" clause, no volume minimum unreachable by M36 | Founder — written term sheets from Viva.com, Nexi, Worldline, Global Payments (ČSOB/KB), Nuvei, Adyen | P0 exit | Stop. SaaS-only CEE is 0.65–0.95× LTV/CAC. The economics do not exist and no engineering fixes it |
| A3 | Teya owns Storyous and holds a majority of Dotykačka, making it unavailable as a CZ payments partner | Founder — one direct call | M1 | If wrong, Teya becomes the cheapest on-ramp and A2 gets materially easier |
| A4 | A neutral "join here" line inside a transactional e-receipt is not obchodní sdělení under zák. 480/2004 in CZ | Czech counsel, EUR 3–5k | M2 | The highest-volume capture channel disappears. Blended identity capture at v1 drops from 30–38% to 22–28% — the ~52% figure is v2 core, reached only once guest ordering, the QR PWA and Wallet passes ship, and it is never the v1 number. The CRM value case and the ARPU assumption both weaken |
| A5 | PL PKE art. 398 forbids the same line in Poland, and forbids one aggregated Viber/SMS sender across PL tenants | Polish counsel | before P3 PL entry | Already assumed true. PL e-receipts are a fiscal-only template with zero promotional content; PL tenants hold their own sender or the channel is not offered |
| A6 | Stripe Terminal card-present in CZ does not need to emit PAR for v1 | Backend lead — one-day sandbox test against Stripe and Adyen | M1 | Informational only. If Stripe emits PAR, card-linked identity moves from v2 core to v1.1. If not, it stays in v2 core and we do not switch PSPs for it. Adyen returns PAR for Visa/Mastercard on Terminal API [verified] |
| A7 | fsync is honest on the certified Android SKUs and the Pi-class hardware | QA — write intent, cut power at 1,000 random offsets on the smart PDU, count survivors | week 3 of build (M1) | The intent log alone cannot be trusted. The printed monotonic per-Station Ticket number becomes the only dedupe primitive; print health rises +1.0 eng-months |
| A8 | Under 40% of the CZ beachhead segment runs 2+ POS stations | Founder — 30 discovery calls counting actual station counts | M3 | T2 LAN multi-station moves from v2 core into v1 sellable: +9.0 eng-months, MVP slips ~3 months, and the T2 election/fencing/epoch-reuse work becomes critical path |
| A9 | No PSP will permit store-and-forward offline card auth on acceptable terms | Payments owner — written answers from 2 PSPs | M4 | Irrelevant either way — we do not build it. This exists only to fix the sales claim, which is: "orders, kitchen, cash and receipts keep working with no internet; card payments depend on your acquirer" |
| A10 | A fiskaly/EFSTA multi-country quote lands under EUR 8/register/month at 500 registers | Founder — direct sales quotes from two vendors | before DE/AT entry (v3, P4+) | Build-vs-buy flips. DE+AT entry rises from ~4.5 to 18–22 eng-months plus 1.5 FTE/yr, and DE+AT is deferred out of the plan |
| A11 | Czechia does not reintroduce a cash-register obligation before 2029 | Compliance owner — quarterly review | continuous | CZ stops being a zero-fiscal market: +2.5–3.5 eng-months and a certification calendar we do not control, landing on the only market with revenue |
| A12 | PL gastronomy can be served by driving a GUM-homologated kasa-online printer (Posnet/Elzab/Novitus) without GUM-certifying our software | Compliance owner + one PL vendor | before P3 | PL requires GUM: 6–12 months, PLN 50–150k, plus a Windows/Linux bridge box at +EUR 200–350/site. PL is deferred and DE+AT becomes market 3 |
| A13 | UA PRRO can be served via Checkbox or Vchasno Kasa as intermediary, so we never hold a merchant's КЕП key | Compliance owner + UA counsel | before P3 UA | UA fiscal rises from ~1.75 to 5–6 eng-months and carries custody liability in an incident. UA reverts to engineering/support base only |
| A14 | Google Business Profile API allowlist is granted | Product — apply in M1 | M6 | Review management degrades to manual paste. Drop it from v1 sellable; it has no engineering workaround |
| A15 | 2 senior Kotlin/Android engineers can be hired in Kyiv/Lviv/Prague within 8 weeks at ≤EUR 4,500/mo | Founder | M2 | The entire stack decision reopens. React Native becomes the pick and +5.5 eng-months of vendor-SDK bridging plus 0.15–0.25 eng-months/quarter forever applies |
| A16 | HubRise stays independent and clears >50% gross margin at EUR 27–35/site | Founder — partner agreement review | before the v3 delivery module | Build Glovo natively (+3.5 eng-months) or drop the delivery module. The Omnivore→Olo→Thoma Bravo sequence is the precedent |
| A17 | For a white-label guest ordering page, the restaurant is the EAA service provider, not us | EU counsel — a 2-hour question | before v2-core guest ordering | The microenterprise exemption never applies. Every guest surface must be EN 301 549 / WCAG 2.1 AA from day one: +1.5 eng-months and a permanent audit obligation |
| A18 | Tech E&O + Cyber at EUR 1–2M limit is obtainable at EUR 8–25k/yr for an EU SaaS operating in fiscalised markets | Founder | before customer #1 | It is a procurement gate for any chain. Note it never covers producer-side fiscal fines |
| A19 | Our merchants' PCI landing zone is SAQ B-IP, and SAQ C applies if our app runs on the reader | QSA scoping opinion, EUR 5–10k | before any Apps-on-Devices deployment (v3) | Nothing changes for v1. Remove every "SAQ P2PE" claim from sales material now; Stripe is not on the PCI SSC P2PE listing |
| A20 | Blended support ticket rate stays ≤1.4/site/month through the first 24 months | Support owner — instrumented from site #1 | P2 exit gate | Support cost/site exceeds EUR 55 against a EUR 110–130 subscription ARPU. Freeze sales and fix the product; this is the r09 open question that decides breakeven. The named mitigation is in-app staff self-onboarding (§4, v1 Full, 1.5 eng-months, deferred in the S1 cut) — if this assumption trips, that deferral is the first thing the S1 cut repays |
| A21 | Payments attach on displacement wins is capped at 20–30% by 36–48-month terminal leases with EUR 300–900 early-termination fees | Sales — capture "acquirer + rate + contract end date" on every discovery call | continuous | If lower, the LTV thesis requires new openings to be >50% of pipeline, which reorders lead-gen toward fit-out contractors, equipment distributors and the trade-licence register |
| A22 | The AI-assist multipliers in §5.1 hold in practice | Engineering lead — measured per sprint against the reconciled work-breakdown | M12 | Re-baseline the effort plan; do not re-forecast the revenue. AI compresses code, never the certification queue, the install, the sales meeting or the support rota |
| A23 | Sub-merchant KYB does not stall more than 10–20% of applications, and merchant chargeback/negative-balance exposure stays under EUR 15–40k/yr at 300 sites | Ops owner (not an engineer) | before P3 payments attach | Budget rolling reserves, delayed payout on prepaid sales, and an ops hire. A signed customer who cannot take cards for 9 days is a churn event |
| A24 | We can define and price a fiscal-archive handover artefact for churned merchants without inheriting a decade of availability obligations | Legal + compliance owner | before customer #1 | Holding a churned merchant's fiscal archive under DE §147 AO (8–10 yrs), FR signed archives or a UA КЕП is an unpriced, unbounded liability. Nothing in the research models it |
End of canon. Anything not decided here is not yet decided, and no writer may decide it.