#Integrations: living with the hardware and software restaurants already have
TL;DR
- We do not build live connectors into incumbent POS systems. We build one-shot migration importers. An importer costs ~40% of a live connector, needs no partner approval where an export path exists, has ~0.1 eng-months/year of maintenance instead of 0.35–0.6, and cannot be revoked mid-contract. It also kills the hardest objection in POS sales ("I'll lose three years of history") in a 30-minute onboarding step.
- The five that ship first, in order: Google Business Profile → Dotypos migration importer → generic CSV/Excel menu importer → Storyous migration importer (v1 Full) → HubRise-resold delivery module (v3). Total canonical budget for the domain is 4.0 eng-months in the S1-cut v1 sellable, 8.5 in Full, +5.5 in v2 core and +5.0 in v3 (canon §5.1, domain I books +9.0 for all post-v1 integration work; the +1.5 difference is the HubRise module moving out of Full — §2.2). None of the first three needs a partner's permission; GBP needs an allowlist and HubRise needs a reseller agreement.
- CRM-on-someone-else's-POS is not a cheaper version of this business, it is a different and worse one. Not because of the identity gap alone (
24% of Checks against 30–38% at v1 with A4 true — 22–28% if false — and **52% (v2 core)** once QR PWA ordering and Wallet passes ship, canon §1 and 05 — The CRM Product and Scope Tiers §3.2) but because an overlay has zero switching cost, churns at 40–60%/yr[known]against a POS's 22–25%, and clears 3–37% gross margin once middleware COGS lands[known, r07 §4.1]. The engineering is the easy part; the business is unfixable. - Middleware is a purchase, never an architecture. HubRise is the only vendor with acceptable economics (EUR 35/site/mo standard, EUR 30 at 6–30 sites, EUR 27 at 31+, no setup fee for standard locations, self-funded and independent as of today
[verified, hubrise.com/pricing, 2026-08-18]) and the only one with a first-class customer + loyalty model. Deliverect, Otter, Chowly and Omnivore are permanently out of scope (canon §4). - Aggregators give you an operational win and zero CRM value, and the "win your customers back from Glovo" QR is a connector-revocation risk, not a feature. Canon puts it out of scope unless we decide in writing never to build aggregator connectors. Since canon still plans a delivery module (v3 under the v2-core/v3 tier split), treat the in-parcel QR as dead and remove it from every sales asset now.
- Maintenance drag is the number that decides the portfolio size: 5 connectors = 1.8–3.0 eng-months/yr (4–7% of S1's 42 eng-months/yr); 15 = 5.3–9.0 (13–21%); 40 = 17.5–30 eng-months/yr plus a non-engineering partner-relations owner — arithmetically impossible for S1 and a dedicated pod for S2. The portfolio ceiling for S1 is ~8 live surfaces, forever.
Sibling docs: strategy and go/no-go in 01 — Feasibility verdict · adapter/port mechanics and the event log in 02 — System architecture · printers, terminals and device fleet in 03 — Hardware, peripherals and the device fleet · PSP, fiscal-provider and accounting-export obligations in 04 — Payments, fiscalisation, privacy and security · identity, consent and messaging channels in 05 — The CRM Product and Scope Tiers · sequencing and budget in 07 — Roadmap, Team and Budget · risk register in 08 — Pros, cons, difficulties and risks.
Scope boundary for this document. Messaging channels (SMS aggregators, WhatsApp, Viber, Telegram) are not integrations in the canon's accounting — they sit in domain G (CRM) and are specified in 05 — The CRM Product and Scope Tiers. Fiscal providers (fiskaly, Checkbox/Vchasno, GUM kasa-online printer partners) sit in domain F and are specified in 04 — Payments, fiscalisation, privacy and security. Payment terminals sit in domain E. This document owns exactly one thing: third-party systems whose availability we do not control and whose breaking changes we must survive.
Unit convention throughout: 1 eng-month ≈ 4.3 eng-weeks, senior engineer with the canon §5.1 AI-assist multipliers already applied.
#1. The strategic verdict, and what it costs you in data
#1.1 Three paths, priced
Canon §1 already decides this: own the POS, sell it CRM-first. This section exists to state why the other two lose, in numbers a due-diligence reader can check.
| Dimension | A. CRM overlay on incumbent POS | B. Own POS, no CRM | C. Own POS, sold CRM-first (CANON) |
|---|---|---|---|
| Time to first invoiced customer | 2–4 months [known, r07] | 14–18 months | ~M17 (S1) / ~M9 (S2), canon §2 |
| Identity coverage of Checks | ~24%, canon §1 | n/a (loyalty ledger only) | 30–38% at v1 (A4 true; 22–28% if A4 is false), rising to ~52% (v2 core) once QR PWA ordering and Wallet passes ship — canon §1, 05 §3.2 |
| Revenue under management, corrected for member behaviour | 35–45% [estimate, c03 C11] | — | 65–75% [estimate, c03 C11] |
| Realistic ARPU — subscription only (POS+CRM+KDS) | EUR 39–59/site/mo [known] | EUR 79/site/mo (canon §5.4) | EUR 110–130/site/mo (canon §5.4). Payments residual and messaging sit outside this figure and are only ever quoted as total recurring revenue per Site, never as blended ARPU |
| Gross margin after COGS | 63–83% direct; 3–37% via middleware [known, r07 §4.1] | 70–85% + payments | 70–85% + payments |
| Gross logo churn | 40–60%/yr [known, c03 C10] | 22–25% by cohort 4 (canon §5.4) | 22–25% by cohort 4 |
| LTV at those inputs | ~EUR 840 against EUR 600–1,000 CAC [known, c03 C10] | — | canon §5.4 |
| Supplier concentration | 100%, and the supplier is a competitor | none | none on POS; contained on aggregators |
| Defensibility | near zero — anyone can call the same API | installed base × switching cost × payment contract | same, plus the CRM is why the first 100 buy |
The argument that actually carries the decision is not the identity gap. c03 C11 is right that identified Guests are not a random sample — loyalty members visit 1.5–2.5× more often and spend 10–25% more per Check [known], so 24% of Checks is worth more than 24% of revenue and the true value gap is 1.7–2.0×, not 3×. The decisive facts are the two rows in bold: an overlay has no switching cost and no payment rail. Cancelling a loyalty tool costs the restaurant nothing; cancelling a POS closes the restaurant. That is canon §1's "installed base × switching cost × payment contract", and no amount of connector engineering changes it.
#1.2 The capability ladder — grade every vendor on this, not on "we have an API"
| Tier | Capability | What it unlocks for us | Availability |
|---|---|---|---|
| T0 | Batch export of closed Checks (CSV/SFTP/nightly report) | Sales BI. Zero CRM. Sufficient for a migration importer. | Everything, including systems with no API |
| T1 | Real-time push on Check close, Line-itemised, with Site + timestamp | Post-visit messaging if you already know the Guest | Most cloud POS |
| T2 | A Guest Identity on the Check — loyalty ID scanned at the Station, phone, email, or a stable card token | This is the product. Without T2 the CRM is a spreadsheet. | Rare, and crippled for third parties by design |
| T3 | Write to an OPEN Check before Tender: apply a Discount, redeem a Voucher, add a Line, adjust the total | Without it, "redeem your reward" is a manual staff workflow and adoption collapses inside two weeks | Rarest; almost always requires code on the Station or the back-office server, not a cloud call |
| T4 | Order injection, Menu Snapshot write, Station UI, Tender control | Aggregator injection, QR ordering, kiosk | Only where the vendor wants a channel partner |
Two structural consequences:
- T3 is embedded software, per vendor, per runtime. iiko/Syrve = a .NET Front plugin; Oracle Simphony = an Extension Application on the workstation; Aloha = a DLL on the BOH file server; Clover = an Android app on the device
[known]. A cloud team cannot ship T3 without becoming four embedded teams. At S1's 3.5 effective eng-FTE (canon §5.2) that is not a trade-off, it is a category error. - T2 for in-store card is the one thing every incumbent reserves for its own loyalty product, because it requires being the processor. Toast, Square, Clover, Lightspeed and PAR all sell their own CRM/loyalty; PAR owns Punchh; Olo owns Wisely and Omnivore; iiko ships iikoCard; r_keeper ships Farcards
[known]. We would be building the single highest-margin attach product each platform most wants to keep.
#1.3 What you can and cannot learn about a Guest, per data source
Coverage is share of a Site's Checks attributable to a known, contactable, deduplicated Guest.
| Source | Identity obtained | Coverage of Checks | Stability | Note |
|---|---|---|---|---|
| Our own web/QR ordering (v2 core) | phone + email + name + consent provenance | 100% of channel; channel is 10–30% of SMB revenue [estimate] | High | The only clean source we fully control |
| In-store card, we own the PSP | PSP card token → stable person key; PAR where available | 55–70% of in-store Checks [estimate] | High | The entire argument for owning the POS. Adyen returns PAR on Terminal API; Stripe's card-present object is not documented to [verified per canon §3] |
| In-store card, someone else's POS | last4 + brand + name-on-card | Useless for dedup — last4+brand collides constantly | Low | Toast / Lightspeed / Brink tier |
| Loyalty ID scanned at the Station | our loyalty ID | 5–25%, entirely a function of whether staff prompt [estimate] | High | Collapses without T3 write-back |
| Delivery aggregator | first name + last initial, relayed/expiring phone, no email | 0% durable identity, on 15–40% of revenue [known] | None | §4. And onward marketing use is contractually prohibited |
| Incumbent POS "customer table" via importer | whatever the operator typed, with no consent provenance | varies | Low legally | See the trap below |
| Reservations (TheFork/OpenTable/own) | name + phone + email | 100% of booked covers; booked covers are 5–40% of covers | High | Out of scope — canon: integrate, never build |
| Wi-Fi captive portal | 5–15% opt-in, 30–50% junk [estimate] | Low | Do not build a business on this |
The importer trap, stated as a rule. An imported customer table gives you identifiers but not the Art. 7(1) evidence that the Guest consented — no policy-text hash, no timestamp, no ui_surface, no channel scope. Canon invariant 11 is therefore not a nicety: the migration importer sets marketing suppression by provenance and the segment builder cannot clear it. The concrete failure it prevents (c02 M7): a Customer migrates from Dotypos, we import 18 months of Glovo-sourced Orders, the segment builder includes them, the first win-back SMS goes to people who only ever ordered through an aggregator, and it is an unlawful-processing complaint with the Customer's name on it and our infrastructure underneath. Imported Identities land suppressed; they become marketing-eligible only by re-consenting on a surface we own.
#1.4 The seven questions the Customer actually asks
This is the demo. Map it against what each path can answer. The JTBD is canon-adjacent: "I own four cafés, I cannot tell you which of my regulars stopped coming, and I cannot tell you which of my four managers is discounting."
| Question | Own POS (canon) | Overlay on Dotypos | Overlay on Storyous | Overlay via HubRise |
|---|---|---|---|---|
| Which of my regulars stopped coming? | Yes — on 30–38% of Checks at v1 (A4 true; 22–28% if false), ~52% (v2 core) once QR PWA ordering and Wallet passes ship | Partial — only scan-identified Checks | Partial | Partial |
| Which of my four managers is discounting? | Yes — Discount events carry actor + reason (canon terminology: Comp ≠ Void) | Only if the export carries the employee on the discount row [estimate: often not] | [estimate: unknown] | No — HubRise models orders, not staff actions |
| Did the September campaign make money? | Yes — Holdout vs Treated, bootstrapped 95% CI | No — cannot randomise a population you cannot see | No | No |
| Is this person a Member? At the counter, in 2 seconds, with the WAN down | Yes — local Cluster + offline Voucher verify | No — cloud round trip at best | No | No |
| Redeem the free coffee without a staff workaround | Yes | Only with T3 write-back [estimate: not available] | [estimate: not available] | No |
| Same Guest across my 4 Sites? | Yes — Identity is Org-scoped | Only if the incumbent scopes customers per Org, not per Site | [estimate: unknown] | Yes within HubRise's own customer model |
| What does my top spend decile actually buy? | Yes — Line-level × Guest | Line-level yes, Guest link no | Same | Same |
Four of seven are unanswerable on any overlay, and they are the four that close deals. That is the product argument for canon §1, independent of the coverage arithmetic.
#2. Incumbent POS integration table
RT = real-time push of Check events. ID = usable Guest identifier for in-store card. WB = write a loyalty Discount to an open Check pre-Tender (T3). Eng-weeks = our cost for a live production connector including mapping UI, backfill, retries, reconciliation and a support runbook — a hypothetical for every row whose verdict is "Never".
| System | Region | API type | RT | ID | WB (T3) | Partner fee | Cert wall-clock | Terms risk | Eng-wks | Verdict |
|---|---|---|---|---|---|---|---|---|---|---|
| Dotypos / Dotykačka | CZ/SK/PL — beachhead incumbent #1 | REST API v2, OAuth-style Client ID/Secret via request form; v1 discontinued; no public sandbox, integrator gets a partner licence key as dev env; requires the Customer to hold a FULL/UNLIMITED licence [known, search-corroborated 2026-08-18: manual.dotykacka.cz, api.dotykacka.cz] | Yes [estimate] | Weak — no card token | No [estimate] | Marketplace/partner, unpublished [estimate] | 4–10 weeks [estimate] | Teya holds a majority (canon A3) — our payments competitor gates our importer's credentials | 9–13 | Importer only, in v1. Never a live connector |
| Storyous | CZ/SK/PL — beachhead incumbent #2 | REST, docs moved from Apiary to docs.api.storyous.com; webhooks + a sandbox environment [known, search-corroborated 2026-08-18]; GitHub org is registered as Teya Czech Republic s.r.o. [known, search-corroborated] | Yes | Weak | Limited [estimate] | Partner deal [estimate] | 2–4 weeks with public docs [estimate] | Teya-owned. Same conflict | 9–13 | Importer only. v1 Full in canon §4; see the §10 trigger to pull it into the S1 cut |
| Other CZ local vendors (Septim, Agnis, Conto, Markeeta and similar) | CZ | Unverified — I will not guess. | ? | ? | ? | ? | ? | ? | assume 9–17 each | Do not commit until P0 discovery names them. See §9 |
| Poster (joinposter) | UA/PL/CEE SMB | Fully public REST + OAuth + webhooks + app marketplace, dev.joinposter.com [known] | Yes | Own customer table, readable | Yes, via the discount/loyalty API [known] | Marketplace takes 30%, developer keeps ~70% [known, search-corroborated 2026-08-18] | 2–6 weeks [estimate] | Ships its own loyalty; friendly to marketplace apps | 6–11 | Importer only, v2 core (UA entry). The 30% marketplace cut plus c02 C8b's "the merchant contracts with the marketplace, not us" kills the live-connector case |
| iiko / Syrve | UA/CEE/UK | iikoCloud/Syrve Cloud REST (api-eu.iiko.services) plus a .NET Front plugin SDK [known] | Yes | Yes, if we own the loyalty prompt in the plugin | Yes — the best T3 story on this list | Dealer network, unpublished [estimate: 0–20%] | 1–3 months [estimate] | iikoCard competes, but the plugin interface is explicitly built for third-party loyalty. Note the 2022 iiko(RU)/Syrve(intl) split [known] | 13–22 (+17 for the Front plugin) | Importer only, v2 core. Front plugin only against a signed chain deal |
| r_keeper (UCS) | UA/CEE, large legacy base | XML over TCP (r_keeper 7 midserver) + newer cloud APIs [known] | Poll | Via loyalty interface | Yes, via the loyalty/discount interface | Dealer margin [estimate] | 1–3 months via a friendly dealer | Ships own CRM | 11–17 | Importer only, v2 core. Largest UA rip-and-replace target |
| Loyverse | global long tail, free POS | Public REST + webhooks, free [known] | Yes | Own customer table | Limited | Free | Days | Neutral | 4–7 | CSV importer covers it. Do not build a dedicated one |
| Lightspeed K-Series / O-Series | K: AU/BE/NL/FR/CH · O (ex-Gastrofix): DE/AT/CH | Two separate partner-gated REST APIs — O-Series work does not reuse K-Series work [known] | Yes | Weak | Partial [estimate] | Partner programme, unpublished | 2–4 months [estimate] | Curated loyalty partner list; pushes Lightspeed Payments | 13–22 each | No. Only reconsider on a DE/AT entry decision |
| Toast | US (+small CA/IE/UK) | Gated partner API, OAuth2 client-credentials, webhooks; dedicated Loyalty Program Integration API [known] | Yes | last4 + brand + name only | Yes | ~USD 25/site/mo Partner Connect charged to the merchant [known] | 8-stage process, 3–7 months [estimate] | Licence forbids use of Toast Data "for the benefit of any competitor of Toast" [known]; realistic outcome is de-certification on 30 days' notice, not litigation (c02 C8b) | 17–26 | Never (canon §4) |
| Square | US/CA/UK/IE/AU/JP/FR/ES | Fully public, free, excellent docs | Yes | card.fingerprint, stable per card per seller [known] — best of the US set | Partial | Free | days → ~6 wks for marketplace listing [estimate] | Permissive, but Square Loyalty competes head-on | 11–17 | Never in this plan. Cheapest first build if the US is ever entered |
| Clover (Fiserv) | US/CA/UK/IE/DE/AT/NL/PL | REST + OAuth + webhooks and an on-device Android SDK | Yes | Device app can hook payment intents; token exposure limited [estimate] | Yes-ish, device-side | App Market 70/30 [known, docs.clover.com] | 4–10 weeks [estimate] | Marketplace distribution means the merchant contracts with Clover, not us — structurally wrong for a product whose thesis is owning the Guest data relationship (c02 C8b) | 22 (two codebases) | Never |
| Oracle Simphony | global enterprise | Transaction Services Gen2 REST + workstation Extension Application [known] | Poll/limited push | Only via the loyalty driver prompt | Yes, via Extension App + loyalty driver | OPN fees [estimate: USD 500–3,000/yr]; sandbox billed per API call [known] | 6–12 months [estimate] | Oracle sells Gift & Loyalty (iCare) | 35–61 | Never. Metered sandbox alone makes CI-on-every-push impossible |
| Micros 3700 / RES | global legacy, still common in CEE hotels | No API. ISL/SIM scripts, COM Transaction Services, or ODBC into the Sybase micros DB [known] | No | No | Via SIM script + serial/TCP loyalty interface | None — and no support either | n/a, you reverse-engineer | You are unsupported by construction | 26–43, and it never stops | Never (canon §4) |
| NCR Voyix Aloha | US + EU enterprise | Aloha Connect (gated) + ATG + Voyix BSP REST [known] | Yes via ATG | Weak | Yes, via a DLL on the BOH file server | Reported 30–50% of ISV per-location revenue [known, secondary, directional] | 4–9 months [estimate] | NCR sells Aloha Consumer Engagement | 35–52 | Never. Negative margin at any EU ARPU |
| PAR Brink | US/UK enterprise | SOAP/XML, per-location access token [known] | Near-RT polling | Weak | Yes, via the loyalty interface Punchh uses | Integration fee + per-location [estimate: USD 15–40/site/mo] | 3–6 months [estimate] | PAR owns Punchh — integrating into a competitor's parent | 26–39 | Never |
| Revel / TouchBistro / SpotOn / Olo | US | gated / minimal / partner / enterprise | mixed | weak | mixed | mixed | 2–6 months | TouchBistro owns TouchBistro Loyalty; Olo owns Wisely and Omnivore, PE-owned since Sept 2025 [known] | 13–35 | Never (canon §4) |
#2.1 Two facts from this table that change the plan
Teya gates both beachhead importers. Canon A3 says Teya owns Storyous and holds a majority of Dotykačka, which makes Teya structurally unavailable as a CZ payments partner. The consequence nobody wrote down: Teya also controls the credentials our Dotypos importer needs. Dotykačka's API requires a partner licence key issued on request and is only available to Customers on FULL/UNLIMITED licences [known, search-corroborated 2026-08-18]. A single policy decision at Teya turns off our best migration path in our only market.
The mitigation is a design decision, not a negotiation. The Dotypos importer must accept two input paths of equal standing: (a) the API, when a partner key exists; (b) the CSV/XLSX export the Customer generates themselves from the Dotykačka back office, which requires nothing from Teya. This promotes the generic CSV/Excel importer from a fallback to a load-bearing v1 component — which is exactly where canon §4 already puts it, and now for a stated reason. Every importer we write targets the file path first and the API path second.
#2.2 What we build, and what it costs (canon §5.1 domain I, reconciled)
| Tier | Item | Eng-months | Eng-weeks | Why |
|---|---|---|---|---|
| v1 sellable, S1 cut | Connector runtime — credential vault, token refresh, per-partner token buckets, inbound raw-envelope log, replay. Reuses the platform outbox + GlitchTip/Grafana, does not rebuild them | 1.00 | 4.3 | Built once or every connector reinvents it |
| Google Business Profile — locations, hours, special hours, reviews + AI-drafted replies, order-link repoint | 1.25 | 5.4 | §5 | |
| Dotypos migration importer (file path + API path) | 1.00 | 4.3 | §2.1 | |
| Generic CSV/Excel Menu + Guest importer | 0.75 | 3.2 | Covers every vendor we will never integrate | |
| S1-cut subtotal | 4.00 | 17.2 | matches canon §5.1 domain I | |
| v1 sellable, Full (S2) | Storyous migration importer | 1.00 | 4.3 | Second CZ incumbent |
| Reusable mapping-UI framework (Item/Option/tax/Site mapping with diff + bulk edit) | 1.75 | 7.5 | Halves every subsequent importer; now carries three v2-core importers, not one | |
| Connector observability + drift detector + contract-test harness at scale | 1.75 | 7.5 | §7 | |
| Full subtotal | 8.50 | 36.6 | matches canon §5.1 domain I | |
| v2-core delta (P3) | Poster importer (UA) | 1.25 | 5.4 | UA is customers #2–10 |
| r_keeper importer (UA) | 1.50 | 6.5 | Largest UA rip-and-replace target | |
| iiko/Syrve importer (UA/CEE chains) | 1.50 | 6.5 | The chains worth winning | |
| Apple Business Connect | 0.50 | 2.2 | Cheap parity | |
| Connector-platform hardening: per-connector kill switches, tenant-scoped quotas, partner-outage runbooks | 0.75 | 3.2 | §7 | |
| v2-core subtotal | 5.50 | 23.7 | ||
| v3 delta (P4+) | HubRise-resold delivery module (one adapter, reseller plumbing, per-Site provisioning tool) | 1.50 | 6.5 | §3 |
| Native Glovo connector (only if HubRise costs a named deal — canon A16) | 3.50 | 15.1 | §4 | |
| v3 subtotal | 5.00 | 21.5 |
Two arithmetic notes on this table, because both totals moved.
- Why the Full column still lands on canon's 8.50. Under the canon tier split the HubRise-resold delivery module is v3, not v1 Full, so its 1.50 leaves this column: 4.00 (S1 cut) + 1.00 (Storyous) + 1.00 (mapping UI) + 1.00 (observability) = 7.00 against canon §5.1's 8.50. The 1.50 of headroom goes to the two lines that were plainly under-costed as bare 1.00 placeholders — the mapping-UI framework and the observability / drift-detector / contract-test harness, each to 1.75 — because each now has to carry three v2-core importers instead of one. New subtotal: 4.00 + 1.00 + 1.75 + 1.75 = 8.50, matching canon.
- The post-v1 total no longer matches canon and is not fudged to. v2 core (5.50) + v3 (5.00) = 10.50 against canon §5.1's +9.0 for domain I. The 1.50 difference is exactly the HubRise module moved out of Full. Either canon §5.1 domain I is restated as 8.5 Full / +10.5 post-v1, or the module is re-costed; do not close the gap by shaving an importer.
The Full-tier lines P3 must repay. The S1 cut skips the Storyous importer (named in canon §4's "Full only" list), plus the mapping-UI framework and the connector observability harness (Full-tier in this table's split of canon §5.1 domain I; canon §4 does not itemise them). The last two are prerequisites for the v2-core UA importers — Poster, r_keeper and iiko/Syrve are three mapping-heavy builds landing in one phase — so 1.75 + 1.75 = 3.50 eng-months of Full-tier deferral has to be repaid inside P3, before or alongside the 5.50 of v2-core work. The Storyous importer does not have to be, unless the §10 trigger fires.
Not in this budget, by canon: messaging channels (domain G), accounting export (domain B), fiscal providers (domain F), payment terminals (domain E).
#3. Middleware: make-vs-buy
| Vendor | What it normalises | Exposes Guest identity? | Pricing | Verdict |
|---|---|---|---|---|
| HubRise (FR) | A genuine neutral data bus: catalog, orders, customers, loyalty, inventory. Public documented API, ~100+ EU apps | Yes — first-class customer + loyalty model, unique on this list | EUR 35/site/mo standard · EUR 30 at 6–30 sites · EUR 27 at 31+ · no setup fee for standard locations · dark-kitchen tiers EUR 35/55/75 by order volume + EUR 25 one-off per brand per platform [verified, hubrise.com/pricing, 2026-08-18]. Self-funded, no investor ownership stated [verified, same page] | BUY and resell. The only middleware in canon scope |
| Deliverect (BE) | Aggregator ↔ POS injection + Menu sync. EU category leader | No — Orders carry aggregator-masked identity | Not published; one-off setup + per-location subscription + a transactional fee, auto-renewing 30/90/180/365-day terms [known, search-corroborated 2026-08-18: deliverect.com/pricing]. Street ~USD 99–300/site/mo [estimate] | Never (canon §4). Transactional fees on a fixed-ARPU product is a margin leak that grows with our success |
| Otter (CloudKitchens) | Aggregator aggregation + own POS + own marketing | No | Bundled/aggressive [known] | Never. We would be feeding a direct competitor our install base |
| Omnivore (Olo → Thoma Bravo) | The only true POS read/write abstraction — the thing you'd actually want | Ticket-level only | Enterprise, historically ~USD 50–150/site/mo [estimate] | Never. Renting our core capability from a competitor whose PE owner is optimising for cash |
| Chowly / Cuboh | US aggregator ↔ POS | No | volume-scaled [known] | Never. Wrong geography |
| n8n / Make / Zapier | Glue for the tail | — | EUR 20–100/mo | Fine for a Customer's own accounting/marketing tail. Never for Check data |
#3.1 The margin stack, recomputed at canon ARPU
r07 computed this at a EUR 59 CRM-only price. Canon §5.4 sets CZ subscription ARPU (POS+CRM+KDS) at EUR 110–130/site/mo, so the arithmetic changes and only one column survives. The delivery module is an add-on priced on top of that subscription, and it is now a v3 line, not v1 Full (canon tier split).
| Cost line, per Site/month | HubRise resold as a delivery module | Deliverect | Omnivore | Direct connectors we own |
|---|---|---|---|---|
| Module list price we charge | EUR 59 (add-on, not bundled — repriced from EUR 39–49, see below) | 59 | 59 | 59 |
| Middleware COGS | 27–35 | 99–300 | 50–150 | 0 |
| Incremental support allocation | 3–6 [estimate] | 6–12 | 6–12 | 6–12 |
| Gross margin before support allocation | EUR 24–32 (41–54%) | strongly negative | negative | EUR 59 (100%) |
| Gross margin after support allocation, standard EUR 35 COGS | EUR 18–21 (31–36%) | strongly negative | negative | EUR 47–53 (80–90%) |
| Gross margin after support allocation, EUR 27 COGS (31+ sites) | EUR 26–29 (44–49%) — 54% before support | negative | negative | — |
Decision recorded, and it is a reprice: the delivery module lists at EUR 59, not EUR 39–49. At the old EUR 39–49 the module was break-even to ~35% and canon A16's ">50% gross margin at EUR 27–35/site" gate was arithmetically unreachable. At EUR 59 the gate becomes reachable, but only at the bottom of the COGS band: 54% at the EUR 27 tier (31+ sites), 49% at EUR 30 (6–30 sites), 41% at EUR 35 standard, all before the support allocation. Clearing >50% across the whole EUR 27–35 band would need a EUR 70–75 list price, which is not sellable as an add-on against a EUR 110–130 subscription. So the gate is restated as ">50% GM at the EUR 27 COGS tier against a EUR 59 module price, with a 40% hard floor at EUR 35" — below that floor the module is dropped or Glovo is built natively, it is not discounted further (§11, A16).
It is explicitly not a 0%-margin closing concession. A concession would look free and is not: HubRise bills per Site per month, so the cost scales with exactly the thing we are trying to grow, and a zero-margin line item on every delivery-taking Site is an unbounded liability rather than a one-off discount. HubRise resale is still not a profit line — it is a feature we buy to stop losing deals — but at EUR 59 it at least pays for its own support.
What HubRise genuinely buys, and it is not margin:
- One integration instead of four, saving ~11–13 eng-months against building Glovo + Bolt Food + Wolt + Uber Eats natively
[known, r07]. - The sentence "we already connect to 100+ systems" in a chain RFP, on day one, truthfully.
- A customer + loyalty data model, so a Guest identified through the delivery channel can at least be analysed — never marketed to (§4.3).
What it does not buy: control. If HubRise is acquired by a POS or an aggregator, this flips from wedge to trap overnight — that is the Omnivore precedent exactly. Canon A16 owns that assumption; the mitigation is that the HubRise adapter sits behind our own OrderIngress port (§7) so a native Glovo connector is an adapter swap, not a rewrite.
#4. Delivery aggregators
#4.1 Capability and onboarding
| Aggregator | Beachhead relevance | Menu push | Order injection | Pause / 86 | Onboarding gate | Guest identity given | Eng-months if built natively |
|---|---|---|---|---|---|---|---|
| Wolt | CZ (real), UA, DE, Nordics, CEE | Menu API: push + fetch full menu, item price updates, real-time availability without a full menu round-trip [known, search-corroborated 2026-08-18: developer.wolt.com] | Order API, webhook + accept | Venue online/offline endpoints | Self-Service Integration Onboarding (SSIO) — the merchant activates the integration one venue at a time from a Wolt-provided UI embedded in our system [known, search-corroborated]; public developer portal, no BD gate to read the docs | First name + last initial, relay phone. No email | 2.5–3.5 |
| Bolt Food | UA, RO, PL, Baltics; thin in CZ [estimate] | Partner API, docs behind login [known] | Webhook | Yes | Integration agreement, 6–12 weeks [estimate] | Masked | 2.5–3.5 |
| Glovo | UA, PL, RO, ES, PT; present but not dominant in CZ [estimate] | Public partner docs at api-docs.glovoapp.com/partners; Stock & Price API for bulk item management; OAuth2 client-credentials [known, search-corroborated 2026-08-18]. Docs now sit under the Delivery Hero umbrella [known, search-corroborated] | Order API webhook + accept/reject | Store status + product availability | Register, sign an agreement, integrate, test [known, search-corroborated]; 6–12 weeks [estimate] | Name + masked/relayed phone. No email | 3.5 |
| Uber Eats | PL, FR, ES, PT, UK | PUT /v2/eats/stores/{id}/menus, full menu replace [known] | orders.notification webhook → POST /v1/eats/orders/{id}/accept_pos_order [known] | POST /v1/eats/stores/{id}/status | Developer account + integration certification; has forced breaking menu-API migrations historically [known] | First name + last initial, relay phone | 4.0 |
| Deliveroo | UK, FR, BE, IT, IE — not CZ, not UA | Menu API (brand/site/menu tree) | Order webhook + accept/reject | Site status API | Approved-partner queue, 8–16 weeks — slowest of the set [estimate] | Masked | 4.0 |
| Just Eat Takeaway | NL, DE, PL (Pyszne), IE, UK | Market-by-market; several markets still on an Orderpad tablet or email [known] | Partner API where it exists | Yes | Effectively a BD negotiation per market, 3–9 months [estimate] | Masked | 3–6, high variance |
| DoorDash / Grubhub | US/CA/AU | — | — | — | — | Masked | Never (canon §4) |
Canon position: none of these is built natively in v1, v2 core or v3 unless HubRise's coverage costs us a named deal (canon A16). Wolt's SSIO is the one that would be cheapest to add later if that trigger fires in CZ, because the merchant-linking step — which is 10% of the build and 90% of the operational pain — is done by Wolt's own UI rather than by our ops team.
#4.2 Where the eng-months actually go (if we ever build one)
| Work item | Share | Why it is hard |
|---|---|---|
| Menu/catalog mapping UI | ~35% | The models differ structurally: Glovo attribute groups vs Uber modifier groups vs Wolt options, mapped onto our Option Group / Option / Variant model where Size is a Variant, never an Option (canon §6). Plus min/max selection rules, nesting depth, per-channel price uplifts (+15–30% to offset commission), per-channel visibility, allergen fields, image size rules |
| Order ingest, idempotency, reconciliation | ~20% | Duplicate webhooks, out-of-order events, cancellation after acceptance, partial refunds, aggregator-side edits, courier reassignment. Every one of these must land as an append-only Event and fold deterministically into a Check |
| Store status / availability / 86-ing | ~15% | One "sold out" toggle must fan out to N channels with per-channel error handling. This is the top operational complaint in the category |
| Per-Site credential provisioning | ~10% | Each Site links by the aggregator's store ID. Restaurant staff cannot do this; it needs an internal ops tool. Wolt SSIO is the exception |
| Certification + sandbox + review | ~10% | Wall-clock, not eng-time, but it blocks release |
| Monitoring, replay, support runbook | ~10% | We will be blamed for every missing Order, forever |
#4.3 The CRM truth, and the feature we must not ship
Every aggregator withholds Guest identity, in every market, deliberately. First name, last initial, a relayed phone that expires, a sometimes-truncated address. No email, no stable customer ID across Orders, and terms that prohibit onward marketing. A Customer doing 35% of revenue through Glovo has 35% of its business permanently outside its own Guest database, and we cannot fix that.
Three consequences to put in writing:
- Aggregator Orders create a separate, marketing-suppressed Identity, linked into the Cluster for analytics only (spend, frequency, item mix), never as a marketing target — unless the Guest independently joins on a surface we own with the same phone. Canon invariant 11; enforced in the schema, not in a policy note.
- Sell aggregator data as analytics, not CRM. Delivery-zone heatmaps, channel mix, item cannibalisation, per-channel margin after commission. That is genuinely useful and entirely lawful.
- The in-parcel "win your customers back from Glovo" QR is out of scope (canon §4). Aggregator partner agreements standardly prohibit using the integration to solicit the platform's customers or divert Orders off-platform
[known, c02 C8b — must be re-verified against the actual Glovo/Wolt/Bolt agreements if ever reconsidered]. The penalty is not a warning letter, it is connector revocation across every one of our Sites simultaneously, in the exact channel that is 15–40% of the Customer's revenue. Canon's trigger is that we may only build it if we decide in writing never to build aggregator connectors. Since canon still plans the delivery module (v3 under the tier split), that trigger will not fire. Delete the claim from every deck and demo script now, before a salesperson promises it.
#5. Google and Apple surfaces
| Surface | Status, 2026-08 | What we do with it | Gate | Eng-mo | Value |
|---|---|---|---|---|---|
| Google Business Profile API | Live and actively maintained. The monolithic My Business API was retired in April 2022 and replaced by five separate purpose-built APIs; the Business Calls API is deprecated; the Performance API has migrated to locations.fetchMultiDailyMetricsTimeSeries [known, search-corroborated 2026-08-18] | Locations, hours, special hours, attributes, menus, posts, media, read + reply to reviews, performance metrics, and repoint the "Order Online" link away from an aggregator to the Customer's own channel | New Cloud projects start at zero quota. A formal access request with a demonstrated use case is mandatory; Basic API Access review runs 7–10 business days, with heavy per-project quota limits [known, search-corroborated 2026-08-18] | 1.25 | Highest ROI non-POS integration in the plan. Review management is a top-3 unprompted SMB ask and is completely POS-independent — it sells before our POS exists and keeps selling after |
| Order with Google | Dead. End-to-end ordering ended 2024-07-01; the button now links out to an external provider [known] | Nothing to build. The residual value is the order-link repoint above | GBP ownership | 0 (inside the 1.25) | The 10-minute demo that closes: "your Google button currently sends your Guests to Glovo at 30% commission; we point it at your own page" |
| Apple Business Connect | Live, free portal; bulk/API management aimed at multi-location brands [known] | Place cards, hours, photos, Showcases, action links | Apple ID + place verification | 0.50, v2 core | Low–medium. Cheap parity; Apple Maps traffic in CEE is a fraction of Google's |
| Reserve with Google | Live via the Actions Center partner portal [known] | Availability feeds + a booking server | Approved RwG partner; slow and opaque | 2.5–3.5 | Out of scope. Canon: reservations are integrated, never built. Revisit only if a reservations product ever exists |
| Apple/Google Wallet passes | Live | Loyalty passes for Members | Developer account | — | Owned by domain G; see 05 — The CRM Product and Scope Tiers |
Canon A14 update. A14 assumes the GBP allowlist is granted, owner = Product, apply in M1, due M6. The 7–10 business-day Basic Access SLA [known, search-corroborated] is materially better than r07's "days–weeks, opaque" framing, but the quota is the real constraint, not the approval: per-project quotas are tight and review-reply automation across dozens of Sites is a documented pain point in Google's own developer forums [known, search-corroborated 2026-08-18]. Design consequence: review sync is a scheduled, quota-budgeted pull with per-Org fairness, never a per-page-load fetch, and the quota-increase request goes in at the same time as the access request, not after the first customer complains.
#6. Accounting, payroll, inventory
The rule that saves 6–8 eng-months: in CEE, a correctly-formatted export file beats an API integration. Accountants want a file they can import into the package they already run. They do not want OAuth, they do not want a portal, and they will not maintain a token. A template-driven export engine — configurable CSV/XML per country per package — is a single build that covers ~80% of demand across the whole beachhead.
This work sits in domain B (canon §5.1: "accounting export"), not domain I. Canon scope: one CZ format in the S1-cut v1; more formats are Full-only. Listed here for completeness because it is the connector question Customers actually ask.
| Market | Packages that must be satisfied | Mechanism | Canon tier |
|---|---|---|---|
| CZ (v1) | Pohoda (Stormware) — XML import, the default for CZ accountants; then Money S3, iDoklad, Fakturoid [known] | One Pohoda-compatible XML export of Daily Close + VAT summary + Tender breakdown | S1-cut v1: exactly one format. Pick Pohoda unless P0 discovery says otherwise |
| CZ (Full) | iDoklad / Fakturoid REST | Thin REST shims over the same canonical export document | Full |
| UA (v2 core) | BAS Бухгалтерія, M.E.Doc, Vchasno [known] | File export; PRRO is a fiscal concern, not an accounting one — see 04 — Payments, fiscalisation, privacy and security | v2 core |
| PL (v2 core) | Comarch Optima/ERP XT (file), wFirma / Fakturownia / iFirma (REST) [known]; JPK_V7M + KSeF are compliance, not accounting | File export + one REST shim | v2 core, and KSeF belongs to domain F |
| DE/AT (deferred) | DATEV — non-negotiable, plus DSFinV-K | DATEV-format export + DSFinV-K bundle. This is a market-entry gate, ~2.5–4.0 eng-months, and it is a compliance project not an integration [known] | Out of plan until canon A10 resolves |
| Payroll / scheduling | 7shifts, Planday, Papershift, Combo, Deputy [known] | Push worked hours + sales-per-hour, read schedule. 0.75–1.25 eng-months each | Never build. Canon: scheduling and payroll are integrated, never built — and not before a Customer pays for a named one |
| Inventory / recipe | Apicbase, MarketMan, Growyze, Nory [known] | Push Line-level sales for theoretical usage; read stock for 86-ing | Not before 200 Sites. Canon ships theoretical COGS only; live inventory is v3 |
The one non-obvious build here is free. Canon requires an EU Data Act export/switching capability in v1 sellable (Regulation (EU) 2023/2854, applicable since 12 Sep 2025, switching charges withdrawn by 12 Jan 2027 [known]). That is the migration importer run in reverse. Same canonical bundle format, same Item/Option/tax/Guest/Check schema, same validation. Build the bundle format once and you have satisfied a dated regulatory obligation, a procurement checkbox and a sales objection with one artefact. Do not let these be two projects.
#7. Connector-platform design
#7.1 The shape
Two rules make this survivable and both are non-negotiable:
normalise()is a pure function from a recorded envelope to canonical facts. No network, no clock, no database. That is what makes contract tests run on every PR, offline, in milliseconds, with no sandbox — which matters enormously given Dotykačka has no public sandbox[known, search-corroborated]and Oracle's is billed per API call[known].- The raw envelope is stored before it is parsed. Every support ticket in this category is "what did they actually send us". Without the log you are guessing; with it you are answering. Cost ~0.25 eng-months, saves that in the first quarter.
#7.2 The four ports
// :integrations-api — vendor types never cross this boundary.
// Money is integer minor units everywhere (canon §3.1 invariant 1).
data class ConnectorKey(val vendor: String, val apiMajor: Int) // ("dotypos", 2)
/** One-shot read. The v1 workhorse. Never live, never write-back. */
interface Importer<C : ConnectorConfig> {
val key: ConnectorKey
suspend fun probe(cfg: C): ProbeResult // creds, scope, clock skew, entity counts
suspend fun pull(cfg: C, cursor: Cursor): Page<RawEnvelope>
fun normalise(raw: RawEnvelope): List<StagedFact> // PURE. Contract-tested on fixtures.
fun provenance(): Provenance // drives marketing suppression, canon inv. 11
}
/** External Order -> Check. HubRise in v3; a native aggregator only if canon A16 fires. */
interface OrderIngress<C : ConnectorConfig> {
val key: ConnectorKey
fun normalise(raw: RawEnvelope): InboundOrder // PURE
suspend fun ack(cfg: C, orderRef: ExternalRef, decision: AcceptOrReject): AckResult
suspend fun statusUpdate(cfg: C, orderRef: ExternalRef, s: OrderStatus): AckResult
}
/** We push outward: Menu Snapshot, availability, Site status. */
interface CatalogPublisher<C : ConnectorConfig> {
val key: ConnectorKey
fun render(snapshot: MenuSnapshot, channel: ChannelId): VendorPayload // PURE
suspend fun publish(cfg: C, payload: VendorPayload): PublishResult
suspend fun setAvailability(cfg: C, deltas: List<AvailabilityDelta>): PublishResult
}
/** Non-transactional presence surfaces: GBP, Apple Business Connect. */
interface ProfileSurface<C : ConnectorConfig> {
val key: ConnectorKey
suspend fun pushProfile(cfg: C, p: SiteProfile): PublishResult
suspend fun pullReviews(cfg: C, since: Instant): Page<Review>
suspend fun replyToReview(cfg: C, id: ReviewId, body: String): PublishResult
}Importer is deliberately the richest port and the only one in the S1 cut. OrderIngress and CatalogPublisher exist from day one as empty seams so the HubRise adapter in v3 is an addition, not a refactor.
#7.3 Sandbox, replay and contract tests
| Mechanism | What it is | Cost | What it prevents |
|---|---|---|---|
| Recorded fixtures (VCR-style) | Every live call ever made in dev/staging is recorded as a raw envelope + response, scrubbed of PII, committed | 0.2 eng-mo | Needing a sandbox at all. Mandatory for Dotypos (none exists) |
| Pure contract tests | normalise(fixture) == expected canonical facts, one golden file per fixture. Runs on every PR, no network | 0.15 eng-mo/connector | Silent semantic drift when we refactor |
| Replay harness | Point any connector at a tenant's stored envelope log and re-run normalise + fold; diff against what production produced | 0.25 eng-mo | "Why is this Customer's imported history wrong" turning into archaeology |
| Nightly live-shape probe | One authenticated call per connector per night against a real account; diff the response shape (not values) against the recorded schema; open a ticket on drift | 0.2 eng-mo | Finding out about a breaking change from a Customer on a Saturday |
| Lenient parsing, strict tests | Unknown enum values parse to Unknown(raw) and never throw. Unknown fields are logged once per shape-hash per day | inside adapters | A new Dotykačka discount type taking the importer down mid-migration |
| Per-connector kill switch | An OpenFeature/Unleash flag per ConnectorKey, evaluated offline from the signed config bundle (canon §3) | inside runtime | Canon invariant 14: Android rollback does not exist; kill switches are the only mitigation path |
#7.4 Versioning and surviving a breaking change
ConnectorKey carries apiMajor. Two majors may be live simultaneously; each tenant's connector binding pins one; migration between them is a data migration on the binding row plus a staged rollout through the canon §3.1 cohort ladder (lab → 3 friendly Sites → 10% → 40% → 100%).
The playbook, in order, when a partner breaks something:
| Step | Action | Owner | Target |
|---|---|---|---|
| 0 | Nightly shape probe or a live error-rate alert fires | automated | before any Customer notices |
| 1 | Kill-switch the connector for all tenants; the product degrades to a documented state, never to a wrong number | on-call | <15 min |
| 2 | Post to the in-product status surface; the AI tier-0 agent files tickets from telemetry rather than waiting for calls | automated | <30 min |
| 3 | Record the new shape as a fixture; write the failing contract test first | integrations owner | same day |
| 4 | Ship the adapter fix in the fast app; connectors never live in the slow-release fiscal module (canon invariant 12) | integrations owner | 1–5 days |
| 5 | Replay the envelope log for the outage window to backfill | automated | same release |
The contractual half of this matters more than the engineering half, and it is not in any appendix. From the first invoice, the MSA must state that third-party connector availability is expressly not warranted, is excluded from the SLA, and is never a condition of the subscription; if a platform revokes access we owe migration assistance, not refunds (c02 C8b). ~EUR 3–5k of drafting. Absent that clause, one platform revocation converts into refund liability and SLA credits across the whole affected base simultaneously. Canon §4 already lists "contracts (MSA/DPA/SLA) that expressly do not warrant third-party connector availability" in v1 sellable — this is the reason.
#8. Maintenance drag
Per live connector per year, steady state:
| Failure mode | Frequency | Cost per event |
|---|---|---|
| Auth/token/secret rotation, certificate expiry | 1–2×/yr | 0.5–2 eng-days |
| Undocumented schema drift (new enum, field becomes nullable) | 2–4×/yr | 1–3 eng-days + a production incident |
| Rate-limit or quota change | 0.5×/yr | 2–5 eng-days |
| Forced API version migration | every 18–36 months | 5–20 eng-days |
| Sandbox rot / re-certification | 0.5×/yr | 3–8 eng-days |
| Support escalations traced to the connector | continuous | 0.5–1 eng-day/month |
| Total per live connector | 0.35–0.6 eng-months/yr [estimate, r07 §9.2] |
Scaled, with the coordination overhead that appears above ~15:
| Live connectors | Direct drag (eng-mo/yr) | Coordination + partner relations | Total | % of S1 capacity (42 eng-mo/yr) | % of S2 capacity (132) |
|---|---|---|---|---|---|
| 5 | 1.75–3.0 | 0 | 1.8–3.0 | 4–7% | 1–2% |
| 15 | 5.25–9.0 | +0% (still absorbable) | 5.3–9.0 | 13–21% | 4–7% |
| 40 | 14.0–24.0 | +25% — a non-engineering partner-relations owner, an on-call rotation that is not the product team, per-partner SLAs and quarterly reviews | 17.5–30.0 | 42–71% — impossible | 13–23%, i.e. a dedicated 1.5–2.5 FTE pod |
Importers do not appear in this table, and that is the whole point. A one-shot importer's maintenance is deferred until the next time we run it; if the vendor breaks their API between migrations we discover it during a migration we are being paid for, and the fix is scoped to one Customer. Realistic drag: ~0.1 eng-months/yr per importer [estimate], and it is demand-driven rather than calendar-driven.
Canon-scope check. The S1-cut v1 has exactly two live surfaces (Google Business Profile, and the connector runtime itself) plus two importers. Steady-state drag ≈ 0.5–0.9 eng-months/yr — 1–2% of S1 capacity. Full v1 adds only the Storyous importer: ≈ 0.6–1.0 eng-mo/yr. v2 core adds Apple Business Connect plus three UA importers: ≈ 1.2–1.9 eng-mo/yr. v3 — where the HubRise module and any native Glovo connector now sit — adds two more live surfaces: ≈ 1.9–3.1 eng-mo/yr. That is the portfolio a 3.5-FTE team can carry. Anything approaching 15 live connectors is a different company.
#9. Platform risk, with the receipts and the mitigations
| Precedent | What happened | Mitigation we actually take |
|---|---|---|
| Toast Partner Connect | A per-location fee charged to the merchant for integrations [known] — your integration becomes a line item the restaurant pays to your competitor to use your product | Never build on Toast (canon §4). The general rule: never accept a distribution model where the Customer's contract is with the platform |
| Toast roadmap | Expanded into online ordering, loyalty, email marketing, payroll, delivery, reservations — all previously partner categories [known] | Assume any category with revenue will be built by the platform within 24 months. Only integrate where the platform cannot compete: Google, accounting, aggregators |
Olo acquires Omnivore + Wisely (2021); Thoma Bravo takes Olo private, ~USD 2.0B, Sept 2025 [known] | The "neutral" middleware layer became a competitor's asset, then a PE asset | Never rent a core capability. HubRise sits behind our own port so it is swappable (§7.2); canon A16 owns the watch |
Order with Google discontinued 2024-07-01 [known] | A channel thousands of vendors built for evaporated with ~6 months' notice | Value connectors at their replacement cost, not their build cost. GBP survives because the residual (hours, reviews, link repoint) is independent of any one Google product |
NCR gates Aloha Connect behind 30–50% ISV revenue share while selling Aloha Consumer Engagement [known, secondary] | Enterprise incumbents price third-party CRM out of existence rather than banning it | Compute connector margin before the build. Any rev-share above ~15% on a EUR 110–130 subscription ARPU is a no |
Poster marketplace takes 30% [known, search-corroborated 2026-08-18] | Even the friendliest CEE platform is a 30% haircut plus a contract we do not own | Importer, not marketplace app. Canon §4 already lands here |
iiko splits into iiko (RU) and Syrve (intl), 2022 [known] | Geopolitics fragmented a vendor's API and support overnight — directly relevant to a UA-based team | Treat any UA/RU-heritage vendor's API as having a non-technical availability risk. Importer-only limits the blast radius to one migration |
Square sunsets Connect v1; Toast, Uber Eats and Deliveroo have each forced breaking menu-API migrations [known] | Even friendly platforms cost unplanned eng-months on their schedule, not ours | §7.4 playbook + the MSA clause. Budget the drag in §8, do not pretend it is zero |
Deliveroo exits ES, NL and other markets, 2021–2023 [known] | A connector became worthless because the counterparty left the country | Never make a connector a precondition of a Site going live |
| Teya owns Storyous and a majority of Dotykačka (canon A3) | Our payments competitor gates our two beachhead migration paths | §2.1 — the file-export path is the primary path; the API path is an optimisation |
Dotypos prices SaaS down as card turnover rises [known, c03 F11] | The incumbent's effective software price for a card-heavy venue is near zero | Not an integration risk, but it is why the migration importer is a sales asset: our pitch cannot be price, it must be the seven questions in §1.4 |
The structural conclusion, unchanged from r07 §8: a CRM whose data supply is an incumbent POS API has a supplier with 100% concentration risk, who is also a competitor, who sets the price, and who has a documented record of raising it. No engineering fixes that. Canon §1 is the only sane response.
#10. Priority: the five that ship first
| # | Connector | Tier | Eng-mo | Why it is first | Kill criterion |
|---|---|---|---|---|---|
| 1 | Google Business Profile — hours, special hours, reviews + AI-drafted replies, order-link repoint | v1, S1 cut | 1.25 | The only integration that sells before the POS exists and keeps selling after. Free API, no competitor, no revenue share, a top-3 unprompted SMB ask, and the order-link repoint is a 10-minute demo with a hard number attached (aggregator commission 25–35% → 0%). The allowlist request is the long pole: apply in M1 (canon A14) | Allowlist refused → drop from v1 sellable; there is no engineering workaround (canon A14) |
| 2 | Dotypos / Dotykačka migration importer (file path primary, API path secondary) | v1, S1 cut | 1.00 | Dotykačka is beachhead incumbent #1. The importer converts "I'll lose three years of history" from the hardest objection in POS sales into a 30-minute onboarding step, needs no live partner relationship, and has ~0.1 eng-mo/yr of drag. Points at the right competitor — r07 §9.4's Poster-first ordering was written for a Ukraine beachhead and is superseded | Teya revokes partner keys → the file path carries it; there is no kill scenario for the file path |
| 3 | Generic CSV/Excel Menu + Guest importer | v1, S1 cut | 0.75 | The universal fallback. Covers every CZ vendor we will never name, every Loyverse/Excel/paper site, and — critically — it is the fallback for #2 when Teya says no. It is also the EU Data Act export run forwards, so it is half of a dated regulatory obligation | None. This ships regardless |
| 4 | Storyous migration importer | v1 Full (canon §4) | 1.00 | Beachhead incumbent #2, and its API is in better shape than the research assumed: public docs at docs.api.storyous.com with webhooks and a sandbox [known, search-corroborated 2026-08-18], which makes it cheaper than Dotypos to build and test | Trigger to pull it into the S1 cut: if ≥25% of the 40 P0 discovery Sites run Storyous, it moves tier — and after the §2.2 rebalance it is the only 1.0-eng-month line left in Full, so the swap is a straight tier move with no offsetting Full item: the S1-cut subtotal goes 4.00 → 5.00, Full stays 8.50, and 07 — Roadmap, Team and Budget must find the extra 1.00 inside P2 |
| 5 | HubRise-resold delivery module | v3 (P4+, canon tier split) | 1.50 | One integration instead of four, saving ~11–13 eng-months against native Glovo + Bolt + Wolt + Uber Eats. Truthfully unlocks "we connect to 100+ systems" in a chain RFP. It is the only middleware with a customer + loyalty model and the only one with survivable pricing (EUR 27–35/site/mo [verified, hubrise.com/pricing, 2026-08-18]) | Canon A16: HubRise acquired, or margin below the gate. Decision recorded (§3.1): the module is repriced to EUR 59, which clears >50% GM only at the EUR 27 (31+ site) COGS tier and lands at 41% at EUR 35. 40% is the hard floor — below it, build Glovo natively or drop the module; it is never a 0%-margin concession |
Sixth, seventh and eighth, in order, and not before v2 core: Apple Business Connect (0.50) · Poster importer (1.25, on UA entry) · r_keeper importer (1.50, on UA entry). The HubRise-resold delivery module (1.50) and a native Glovo connector (3.50) are both v3; Glovo only when canon A16's trigger fires with a named lost deal attached.
Never, per canon §4: Toast, Aloha, Brink, Revel, TouchBistro, SpotOn, Olo, Micros 3700, Omnivore, Deliverect. Also never: Reserve with Google, payroll connectors, live inventory connectors, and any marketplace listing where the Customer's contract is with the platform rather than with us.
#11. Assumptions this document owns
| # | Assumption | Owner | Due | If false |
|---|---|---|---|---|
| A14 (canon) | GBP API allowlist granted | Product — apply M1 | M6 | Review management degrades to manual paste; drop from v1 sellable. Addition: request the quota increase in the same application, not later |
| A16 (canon) | HubRise stays independent and clears >50% GM at EUR 27–35/site | Founder — partner agreement review | before the v3 delivery module | Decision recorded, not deferred (§3.1): the module is repriced to EUR 59. At EUR 59 it clears 54% GM at the EUR 27 COGS tier (31+ sites), 49% at EUR 30, 41% at EUR 35, before support allocation — so A16 is restated as ">50% GM at the EUR 27 COGS tier against a EUR 59 module price, 40% hard floor at EUR 35". Not a 0%-margin closing concession: HubRise bills per Site per month, so a concession scales with our own growth. Below the floor: build Glovo natively (+3.5 eng-mo, v3) or drop the module |
| I-1 (new) | Teya will issue and keep issuing a Dotykačka partner licence key to a company selling against Dotykačka | Founder — one request, M1 | P0 exit (M4) | The file-export path becomes the only path. Already the primary design (§2.1), so the cost is scoped: importer coverage drops to whatever the back-office export contains, and we must test that export by hand on a real Customer account before quoting a migration |
| I-2 (new) | The CZ beachhead's incumbent POS mix is dominated by Dotykačka + Storyous | Founder — record incumbent POS name, contract end date and acquirer on all 40 P0 discovery calls | P0 exit (M4) | If a third CZ vendor holds >20% of the segment, its importer displaces one Full-tier item. This is the single cheapest unknown to close in the document and it costs one afternoon per 10 calls |
| I-3 (new) | The MSA excludes third-party connector availability from the SLA before the first invoice | Founder + counsel, ~EUR 3–5k | before customer #1 | One platform revocation becomes simultaneous refund liability and SLA credits across the affected base (c02 C8b) |
| I-4 (new) | The canonical migration bundle format satisfies the EU Data Act switching obligation | Compliance owner + counsel | before v1 sellable | The export becomes a second, separate build (~0.5–1.0 eng-mo) instead of the importer run in reverse |
#12. What would change this answer
- A CEE POS or PSP exposing a stable, third-party-readable card token or PAR. If one does, overlay identity coverage roughly doubles and path A becomes arguable for a lower-capital plan. Confirms it: Adyen/Nexi/Worldline tokenization terms for ISV access, plus the canon A6 sandbox test.
- HubRise's ISV-side terms. Customer pricing is verified; partner terms are not. If HubRise offers a genuine reseller margin rather than a pass-through, the §3.1 arithmetic improves, the EUR 59 reprice can be revisited and the module can move back out of v3.
- A CZ incumbent that publishes an unrestricted bulk export. That would make its importer a ~0.4 eng-month job and could add two more markets' importers for the price of one.
- A named chain deal that requires T3 write-back on iiko/Syrve. It is the only incumbent where full write-back is architecturally clean. Canon permits it only against a signed deal; the price is ~4.0 eng-months and becoming a .NET embedded-software shop for one Customer.
- Wolt SSIO in Czechia specifically. If self-service venue activation works in CZ without a BD gate, a native Wolt connector becomes the cheapest aggregator to own and could displace HubRise for a delivery-light beachhead. Confirms it: one application through the public developer portal.