RestaurantBrain feasibility study

#R02 — Card-Present Payments & PCI for RestaurantBrain

Status: research / decision input. Date: 2026-08-18. Label key: [verified] = checked this session with a URL · [known] = confident from training data (≤ May 2026) · [estimate] = reasoned guess, stated as such.


#0. Bottom line

  1. Do not touch card data, ever. Semi-integrated only. Every architecture where our software sees a PAN adds EUR 150k–400k/yr of PCI + EMV L3 cost and 18–24 months of certification for zero product value. This is not a close call.
  2. Stripe Terminal is available in all four beachhead countries except Ukraine — PL, CZ, RO, HU, BG, HR, SI, SK, EE, LT, LV, PT, IT, plus all of Western EU + CH/NO [verified]. Ukraine is absent, and so are Adyen, SumUp, Zettle, and Square. Ukraine is a hard architectural fork: it needs a separate, locally-acquired payments layer (mono / PrivatBank / A-Bank Android terminals) plus PRRO fiscalization, sharing nothing with the EU stack except the abstraction boundary.
  3. Payments funds a POS company in the US. In the EU it funds roughly half of one. In Ukraine it funds nothing. IFR interchange caps (0.2% debit / 0.3% credit) compress the whole EU merchant-service-charge pool to ~1/3 of the US. Modelled below: a 20-site chain yields ~USD 200k/yr payments gross profit in the US vs ~EUR 32k in Poland vs ~EUR 8k in Ukraine. Plan as a SaaS company with a payments attach, not a payments company with a SaaS wrapper.
  4. Never become a payfac. Break-even against a managed payfac is ~EUR 330M/yr TPV ≈ 400–600 sites. Below that the licence + compliance + scheme membership fixed cost (EUR 700k–1.2M/yr [estimate]) exceeds the 25–40 bps of incremental margin.
  5. The single highest-value technical asset in this whole domain is PAR (Payment Account Reference) — the EMVCo 29-char identifier that links a physical tap, an Apple Pay token, and an online card-on-file to one funding account without ever storing a PAN. It is the legal, PCI-clean CRM↔payments bridge. Whether our processor exposes it is a must-verify before architecture lock (§4.6).
  6. The flows that will actually hurt are not "take a card payment". They are: tip semantics differing per country, timeout/unknown-state reconciliation, referenced-refund-after-batch-close, VAT treatment of service charge vs gratuity, and cash rounding on the fiscal receipt. Budget 8–12 eng-months for these alone.

#1. Commercial models

#1.1 The four models

ModelWho is the merchant of recordWho holds the licenceOur revenueOur liabilityTime to launch
Referral / ISOThe acquirer's merchantAcquirer5–25 bps of volume, or 10–30% of acquirer net revenue~None4–10 weeks
Managed payfac / "payfac-as-a-service" (Stripe Connect, Adyen for Platforms, Payrix, Finix, Mangopay, Nuvei)Sub-merchant under provider's PI/bank licenceProvider20–80 bps in EU, 50–90 bps in USChargeback/fraud loss often flows to us contractually; onboarding/KYB partly ours3–8 months
True payfac (own PI licence + scheme sponsorship)Sub-merchants under our master agreementUs (PI licence)60–120 bps net EU, 100–180 bps USAll of it: fraud, credit, settlement, AML18–30 months
Orchestration (route across multiple acquirers)Merchant's own acquirerNobody new1–5 bps or a per-txn SaaS fee (EUR 0.01–0.03)Availability only6–12 months for 3 acquirers

#1.2 What being an EU payfac actually requires

RequirementDetailCost / time
PI authorisation (PSD2 Art. 5, 11) for "acquiring of payment transactions" (Annex I(5))Initial capital EUR 125,000 [verified] (EUR 50k for PIS, EUR 20k for money remittance — not us)Capital is the trivial part
Ongoing own funds (PSD2 Art. 9)Method A (10% of prior-year fixed overheads), Method B (volume-based scaling factor k applied to TPV tranches), or Method C (income-based). Volume method is the usual for acquirers [verified]At EUR 300M TPV, Method B ≈ EUR 700k–1.1M locked capital [estimate]
Governance / substanceTwo fit-and-proper directors resident in the licensing state, compliance officer, MLRO, internal audit, risk function, outsourcing policy, ICT/DORA compliance4–7 FTE, EUR 400–700k/yr [estimate]
SafeguardingSegregated client-funds account or insurance; daily reconciliationBank relationship + ops
Scheme accessVisa/Mastercard principal membership OR a BIN sponsor / sponsoring acquirer. Principal membership: joining fee + annual fees + settlement collateralEUR 100–300k setup + collateral [estimate]
AML/CTFFull KYB on every sub-merchant, UBO, sanctions screening, transaction monitoring, SAR filingSoftware + 2–4 FTE
Authorisation elapsed timeNCA-dependent. Lithuania and Malta historically fastest; Ireland/Netherlands/Germany slowest9–24 months [estimate]
Advisory / legalLicence application pack, policies, regulatory business planEUR 100–250k [estimate]
PCIYou become a Level 1 Service Provider. Annual ROC, not SAQEUR 40–90k/yr QSA + remediation [estimate]

Regulatory horizon: PSD3 + PSR reached political agreement 27 Nov 2025; final texts expected in the Official Journal in H2 2026; application H2 2027, possibly slipping to early 2028, with an 18-month Member State transposition window for PSD3 [verified]. PSD3 merges the EMI regime into a single PI regime and tightens fraud/APP rules. Practical effect on us: any licensing decision taken before 2027 is being taken against a regime that is about to change. Another argument for renting someone else's licence.

Verdict: EUR 1.0–1.6M of first-year cost and 18–30 months for something a managed payfac gives us in 3–8 months. Break-even math in §7.4.

#1.3 Revenue share reality — bps we actually keep

Card-present, EEA consumer cards, per EUR 100 of volume:

LinePoland [estimate]Germany (girocard-heavy) [estimate]US [known]
MSC we can charge an SMB restaurant1.15%0.55% blended2.60% + $0.10
Interchange0.21% (IFR-capped)0.16% blended (girocard ~0.13%)1.72% avg CP restaurant
Scheme fees / dues & assessments0.06%0.05%0.14%
Managed-payfac provider take (Stripe/Adyen/Payrix)0.35% + EUR 0.06/txn0.20% + EUR 0.05/txn0.15% + $0.05
Our net, before losses~0.26%~0.15%~0.75%

The German column is the important one: girocard runs at ~0.2–0.3% MSC and still carries the majority of debit volume in DE restaurants [known]. A German restaurateur already pays 0.3%. There is no 1.4% flat-rate story to sell there. This is why SumUp/Zettle-style flat pricing works in PL/RO/IT/PT (fragmented SMB, weak bank offers) and fails in DE/FR/NL (strong domestic schemes, sharp bank pricing).

Referral model reality: 10–30% of acquirer net revenue on a 0.35% net = 3.5–10 bps. On a 20-site Polish chain (EUR 12.6M card volume) that is EUR 4,400–12,600/yr. It is not a business line; it is a rounding error. Use it only to de-risk v1.


#2. Terminal integration options

#2.1 Integration topologies

TopologyPOS sees PAN?EMV L3 on us?PCI scopeLatencyUse when
Fully-integrated (POS drives the reader, owns kernel/keys)YesYesSAQ D + P2PE programLowestNever
Semi-integrated, local (POS sends amount over LAN/BLE/serial; reader owns card data + host link)NoNoSAQ C / B-IP / P2PE1.5–4 sDefault for on-prem
Semi-integrated, cloud / server-driven (our backend calls processor REST; processor pushes to reader)NoNoSame, plus our backend is a service provider3–7 sMulti-platform POS, thin clients, kiosks
Smart-reader-as-POS ("Apps on Devices": our Android POS app runs on the certified reader)NoNoSame as semi-integrated1–3 sSingle-device counter, food trucks, handheld

Recommendation: build one internal PaymentTerminal port with local + cloud adapters, and never let restaurant flow logic know which one it is talking to. Every acquirer will differ; the abstraction is where the reuse lives.

#2.2 Vendor / device matrix

ProviderDevicesIntegration surfaceSDK maturity [estimate]Beachhead coverageEng-weeks for first integration [estimate]
Stripe TerminalStripe Reader S700 (5.5", counter, WiFi/Ethernet via S700/S710 Hub), S710 (cellular smart reader, runs your POS app), T600 (stationary smart reader), M2 (mobile BLE), BBPOS WisePad 3, BBPOS WisePOS E, Verifone V660p (handheld + printer), UX700 (unattended, waterproof), M425, P630 [verified] — note Verifone P400 is no longer on the current device list; it has been superseded by P630/M425 [verified]iOS, Android, React Native, JavaScript SDKs + server-driven REST for internet readers; PaymentIntent model, collectPaymentMethodconfirmPaymentIntentBest in class. Real docs, real changelogs, offline mode, Apps-on-DevicesPL, CZ, RO, HU, BG, HR, SI, SK, EE, LT, LV, PT, IT, DE, FR, ES, NL, AT, BE, DK, SE, FI, IE, LU, CH, NO, GB [verified]. No Ukraine6–9
AdyenVerifone P400 Plus, V400m/V400c Plus, M400, e285, e355; Castles S1F2/S1E2/S1L2/V3 [known]Terminal API (Nexo/SaleToPOI JSON) in local (LAN, TLS, per-terminal cert) or cloud mode; plus Adyen Balance Platform for payoutsVery good; enterprise-grade docs, but heavier onboardingAll EU incl. PL/CZ/RO. No Ukraine8–12
SumUpSolo, Solo Lite, Air, Solo PrinterCloud API (HTTPS from any platform → Solo reader) [verified], Android Reader SDK, iOS Terminal SDK, Tap to Pay, Payment Switch [verified]Good and improving; Cloud API is the lowest-friction CEE option~36 countries incl. PL, CZ, RO, IT, PT, DE, ES. No Ukraine4–7 (Cloud API)
Zettle (PayPal)Zettle Terminal, Zettle Reader 2Zettle Payments SDK (Android/iOS), partner-gatedDecent, but partner access is gated and roadmap is slowUK, SE, NO, DK, FI, DE, NL, FR, ES, IT, BR, MX [known]. No PL/CZ/RO/UA5–8
Nexi Group (Nexi / Nets / Concardis)Nexi SmartPOS (PAX/Ingenico OEM), Nets/Concardis estatesCountry-specific: ZVT in DE/AT, OPI/Nexo elsewhere, Nordics via Nets protocolsHighly variable by country. Effectively N integrations, not oneDominant IT, DACH, Nordics, meaningful CEE6–10 per country
Worldline / IngenicoAXIUM DX8000 / DX4000 / EX8000 (Android), Lane seriesZVT (DE), OPI, Nexo SaleToPOI, PPaaS cloud APIGood in FR/BE/AT; PPaaS is the modern pathFR, BE, AT, DE, CH, NL, CEE8–12
PAX direct (A920 Pro / A920Max / A77)Android SmartPOS hardware onlyRequires an acquirer's payment app on the device; direct = our own kernel + L3N/A — hardware vendor, not a payment stackGlobal hardware, no acquiringDo not. 40+ if done directly
Global PaymentsGenius / Unified Commerce; post-Worldpay merger estate [known, verify closing status]GP API, semi-integrated Genius protocolUS-strong, EU patchy; EVO acquisition gave PL/CZ presence [known]US, PL, CZ, ES, IE10–14
UA: monobankmono Android terminalsAndroid intent-based integration + REST; free built-in PRRO ("Чек-бай-моно"); 1.3% MSC for MCC 5812, monthly fee often waived [verified]Thin docs, fast onboarding (API access within hours) [verified]Ukraine only5–8
UA: PrivatBankFree Android terminals (NFC, Apple/Google Pay)Terminal app + "Каса" app + LiqPay for CNP; 1.3% + UAH 400/mo [verified]Thin docs, Ukrainian-language, but ubiquitousUkraine only6–10
UA: Fondy / Portmone / WayForPayPrimarily CNPREST APIs, e-comm orientedFine for online ordering; not a CP storyUkraine3–5 (CNP only)

Device-availability caveat: BBPOS WisePOS E is documented as available in AT, BE, DK, FR, DE, IE, NL, ES, SE, UK [verified] — i.e. the country is Terminal-supported in PL/CZ/RO but the device roster per country is narrower. Action: pull the per-country device matrix from Stripe before committing to a hardware SKU for the CEE beachhead.

#2.3 The single highest-leverage decision

Stripe Terminal with S700/S710 running our own Android POS app (Apps on Devices) is the strongest available all-in-one story without manufacturing. One SDK, one commercial contract, one certification burden (theirs), covering every EU beachhead country. It collapses "tablet + reader + stand + cabling" into one device, which halves install time and support surface.

Counter-arguments to weigh:

  • Stripe Terminal per-transaction economics are worse than a direct acquirer relationship in low-MSC markets (DE girocard: Stripe does not support girocard acceptance [known, verify] — if true this is disqualifying for Germany on its own).
  • Vendor concentration: one supplier controls our payment margin, our hardware, and our merchant relationship.
  • SumUp is a competitor, not just a supplier — they own Goodtill/Tiller/Shore POS products. Building on SumUp Cloud API means our roadmap is hostage to a company selling against us. Stripe does not sell restaurant POS. That asymmetry is worth 15–20 bps.

Recommendation: Stripe Terminal for EU. SumUp Cloud API as a cheap second adapter for merchants who already own Solo readers (retention play, not a primary path). mono + PrivatBank for Ukraine. Adyen only when a 20+ site chain demands it.

#2.4 Do not manufacture hardware — and rent, don't sell

The framing assumption (certify + resell commodity hardware) is correct. Additionally:

  • Rent terminals, don't sell them. EU norm is EUR 15–29/terminal/month [known]. Device cost EUR 200–350; 36 months at EUR 19 = EUR 684. Renting also keeps the RMA/firmware relationship with us, which is where support quality lives.
  • Peripherals: Epson TM-m30III (LAN, ePOS-Print XML), Star mC-Print3, cash drawers via RJ11 kick-out from the printer. These are §R0x-hardware's problem, not payments', except that the receipt printer is where the payment slip, the fiscal receipt, and the tip line all collide.
  • Certify a short list: 2 readers, 2 printers, 1 KDS display, 1 router. Every additional SKU is permanent support debt.

#3. Restaurant payment flows that break naive integrations

#3.1 Tips — the biggest cross-market divergence

MarketMechanismTechnical requirement
USAuthorize base amount → post-auth tip adjustment before batch close. MCC 5812/5813 carry a scheme tip tolerance (commonly ~20% over the authorized amount) so no re-auth is needed [known]Manual capture, amount_to_capture > authorized amount, batch-close deadline enforcement, tip-adjust UI in back office
EU/EEATip-on-terminal before authorization. Post-auth upward adjustment is generally unsupported by EU acquirers; the authorized amount is the charged amountTerminal must return tipAmount separately from totalAmount and our POS must reconcile it back onto the check
GermanyTips routed through the employer's bank account become taxable wages (§3 Nr. 51 EStG exempts only tips given directly by the guest to the employee) [known]Must support "tip not collected by merchant" mode; otherwise we create a payroll tax liability for the customer
UkraineCard tips through the legal entity are income (PDFO 18% + military levy). mono offers direct-to-waiter-card tips that bypass the entity [known]Tips must be modellable as a separate payee, not a line on the merchant's settlement

Implication: tips cannot be a boolean on a payment. Model them as a first-class TipAllocation with {collector: merchant|employee|pool, source: terminal|post_auth|cash, taxability, fiscal_receipt_inclusion}. Not all EU protocols return a split tip field — Nexo/SaleToPOI has AmountsResp.TipAmount; ZVT variants have a tip field; some do not. Where the protocol does not return the tip separately, tips are unusable for payroll and must be disabled.

VAT trap: a voluntary gratuity is outside the scope of VAT in the EU; a mandatory service charge is part of the taxable consideration and is VATable [known]. The fiscal receipt must treat these differently. Getting this wrong is a tax-audit generator for every customer simultaneously.

#3.2 Bar tabs — pre-auth + incremental authorization

  • Flow: estimated authorization (Visa Estimated Auth / Mastercard preauth, MCC 5812/5813 eligible) → incremental authorization as the tab grows → capture the final amount.
  • Stripe Terminal supports incremental_authorizationUS only [known, verify]. In the EU, most acquirers do not expose card-present incremental auth via partner APIs. ZVT has Reservation (06 22) / Book-Total (06 24); Nexo has PreAuthorisation/Completion.
  • SCA: the pre-auth is a card-present transaction with PIN or contactless-under-limit, so SCA is satisfied at auth time. A capture materially above the authorized amount (beyond the tip tolerance) requires a fresh authorization with the cardholder present.
  • The US pattern of holding the physical card behind the bar is not viable in the EU (data protection + the card must be returned). EU pattern: pre-auth EUR 50–100, card returned, top-up requires the guest to return to the terminal.
  • Product decision: ship bar tabs as (a) pre-auth where the acquirer supports it, (b) "open check, settle at end" with no financial hold elsewhere, and (c) an explicit walk-out/unpaid-check write-off workflow. Do not pretend (b) is a hold.

#3.3 Splitting

Split typeWhere the work isGotcha
By amountPayments: N sequential terminal txns against one checkPartial-success state: "3 of 4 paid, 4th declined, guests left". Needs an unsettled-balance concept and a house-account write-off
EvenlyPure arithmeticCents remainder: EUR 10.00 / 3 = 3.34 / 3.33 / 3.33. Deterministic largest-remainder allocation, never round() per share
By seatPOS data model (seat numbers on order lines)Moving a line between seats after a partial payment
By itemPOS data modelVAT must re-sum: per-line VAT amounts must total the check VAT exactly after allocation. Allocate the check-level VAT to splits by largest remainder, don't recompute per split
Mixed tender (cash + card + voucher + gift card)Tender ledgerMust be append-only. Cash rounding applies only to the cash portion (§3.9)

#3.4 Voids, refunds, and the batch boundary

OperationWindowInterchangeGuest-visible timing
Void / reversalBefore batch settlement (same business day)None paidAuth disappears in 1–7 days
RefundAfter settlementPaid twice (original + refund)Appears in 3–10 days

Restaurants close batches nightly, so almost every "fix yesterday's mistake" is a refund, not a void. Consequences:

  • Staff must be told the money will not "come back today". Build the copy into the UI; it is the #1 support ticket in every POS.
  • Referenced refunds are increasingly mandatory. Many EU acquirers have disabled standalone/unreferenced card-present refunds for fraud reasons [known]. Our data model must persist the acquirer transaction reference on every payment forever, or refunds become impossible.
  • Partial refund after a tip adjust must be allocatable across {food, service charge, tip} — refunding a tip that has already been paid out to staff is a payroll clawback. Model it; do not let it be implicit.
  • Refund windows: Stripe ~90–180 days [estimate], Adyen longer [estimate]. Beyond the window the only remedy is a bank transfer — build a "manual refund" record type so the books still balance.

#3.5 Offline / store-and-forward — and its real liability

What SAF actually is: the terminal approves offline using EMV terminal risk management (floor limits, issuer action codes, offline data authentication SDA/DDA/CDA), stores the encrypted transaction, and forwards it when connectivity returns.

Who eats the loss: the merchant, always. Stripe's offline mode states this explicitly [known]. Expected forward-failure rate: 1.5–4% of SAF transactions [estimate] — much higher than the online decline rate because the offline population skews toward cards the issuer would have declined.

Regulatory friction: SCA is still required. An offline PIN or a contactless tap under the CVM limit satisfies it at the terminal, but the cumulative contactless counters (EUR 150 / 5 consecutive transactions, RTS Art. 11) are tracked by the issuer, not the terminal [known]. A guest whose counter is already exhausted will be approved offline and declined on forward.

Recommendation: ship SAF as opt-in, off by default, with:

  • per-transaction cap EUR 50–100,
  • per-terminal aggregate cap EUR 500–1,000,
  • contact chip + PIN only (no contactless SAF),
  • a signed liability acknowledgement in onboarding,
  • a mandatory "unforwarded transactions" dashboard tile that goes red.

Honestly: most restaurants would rather take cash for 15 minutes. SAF is a sales-demo feature that generates real losses. Sequence it late.

#3.6 Reversals, timeouts, and reconciliation

The canonical double-charge: the terminal approves, the response is lost, the POS shows "failed", staff re-run, the guest is charged twice. This will happen in production and it is the fastest way to lose a customer.

Mandatory mitigations:

  • Idempotency keys on every payment initiation, keyed to {check_id, attempt_seq}.
  • Explicit unknown state. A payment attempt has states {pending, approved, declined, unknown}. unknown is never rendered as "failed".
  • Transaction-status query on reconnect — Nexo/SaleToPOI has TransactionStatus; Stripe: re-fetch the PaymentIntent; ZVT has status enquiry.
  • Automatic reversal of any auth still unknown after N seconds.
  • Nightly settlement reconciliation: pull the acquirer's settlement/batch file and three-way match POS check ↔ terminal journal ↔ acquirer settlement. Report unmatched.

Budget 2–3 eng-months for reconciliation alone. It is invisible in a demo and it is the difference between a toy and a product.

#3.7 EMV CVM limits and contactless

MarketNo-CVM contactless limitCumulativeNote
EEAEUR 50 per txnEUR 150 or 5 consecutive txns (RTS Art. 11) [known]After that the terminal prompts for PIN
UKGBP 100GBP 300 / 5 txns [known]
UA~UAH 1,500 [estimate]Issuer-setVerify with NBU / acquirer
USVaries by issuer; no statutory limit

UI consequence: you cannot assume a tap is a one-second interaction. The flow must gracefully become "insert card → enter PIN" mid-payment, on the terminal, without the POS timing out or the server thinking the payment failed. This breaks naive implementations constantly.

Tap to Pay on iPhone / Android: PIN entry on the phone screen is now permitted under PCI MPoC [known]. This is a genuinely useful line-busting / patio / delivery-driver device, and it costs zero hardware. Ship it — but not as the primary counter device (battery, no printer, no cash drawer).

#3.8 DCC and surcharging

DCC: real revenue in tourist-heavy sites (merchant rebate commonly 0.5–1.5% of DCC volume [estimate]), but Regulation (EU) 2019/518 requires full transparency and an ECB-rate comparison, and schemes require a genuine cardholder choice on the terminal. Get DCC from the acquirer/terminal side; never build it. Our only job is (a) tolerate 3–8 extra seconds of terminal dialogue without timing out, (b) record both currencies and the applied rate on the receipt and in the ledger.

Surcharging:

  • EU: assume it is illegal. PSD2 Art. 62(4) bans surcharging on EEA-issued consumer cards covered by the IFR; Art. 62(5) let Member States ban it entirely and many did (DE, FR, IT, NL, and others) [known]. Surcharging commercial or non-EEA cards may be legal in some states — not worth the product surface.
  • US: legal in most states, banned/restricted in CT, MA, PR [known]; Visa caps at 3%; debit may never be surcharged; requires 30-day scheme registration and signage at entrance and POS. Restaurants increasingly use 3–4% "service fees" instead, which are under active state-AG and junk-fee scrutiny (CA SB 478 / SB 1524 carve-out with disclosure requirements) [known, verify].
  • Build a jurisdiction-gated surcharge/service-fee engine, default OFF, with correct VAT/sales-tax treatment. 1–2 eng-months and a permanent legal liability sink. Do not ship it in EU v1.

#3.9 Cash rounding

CountryCash roundingApplies to
FI, NL, BE, IE, IT, SKNearest EUR 0.05 [known]Cash total only
CZNearest CZK 1 [known]Cash total only
HUNearest HUF 5 [known]Cash total only
UANearest UAH 0.10 (small kopiyka coins withdrawn 2019) [known]Cash total only
PL, DE, RONo mandatory rounding

Rule that breaks naive implementations: rounding applies to the cash tender, not to the card tender, not to the check total, and not to the VAT base. The receipt carries a non-taxable rounding line. In a mixed-tender split (EUR 20.03 check, EUR 10.00 card + EUR 10.03 cash → EUR 10.05 cash) the rounding is computed on the residual cash amount only. Fiscal printers in RO/PL enforce this; get it wrong and receipts are rejected by the device.


#4. PCI DSS v4.0.1

Status: all assessments in 2026 are against v4.0.1. The 51 previously "future-dated" requirements became mandatory on 31 March 2025; all 64 new/changed requirements are now in scope and require ~12 months of continuous operational evidence [verified].

#4.1 SAQ landing zone by architecture

Our architectureMerchant's SAQApprox. requirement count [estimate]Annual merchant cost [estimate]
Semi-integrated terminal on a PCI-listed P2PE solution, no electronic PAN anywhereSAQ P2PE~33Near zero; a 2-page form
Semi-integrated, standalone IP terminals, not P2PE-listedSAQ B-IP~80Low
POS software connected to payment terminals, no CHD storage, segmented networkSAQ C~140–160Moderate; needs quarterly ASV scans
Anything touching PAN, or CHD storageSAQ D / ROC~250–300EUR 15–60k/yr
Online ordering with a hosted/iframe payment pageSAQ A~30–35 (v4.0.1 relieved SAQ A of reqs 6.4.3 and 11.6.1) [known]Near zero

Target: SAQ P2PE for in-store, SAQ A for online. Anything else is a per-merchant onboarding tax we pay in support time.

Our own status is separate from the merchant's. Even touching zero PAN, we route transactions, store tokens, and can affect the security of the CDE → we are a Service Provider. Expect acquirers and schemes to demand our AOC. Realistic path:

  • Year 1–2: SAQ D-Service Provider self-assessment. EUR 20–40k with a QSA-assisted readiness pass [estimate].
  • Once we exceed the Level 1 SP threshold (>300,000 transactions/yr as an SP, or a scheme designates us): annual ROC, EUR 40–90k/yr QSA + EUR 60–150k first-year remediation + ~0.5 FTE security engineering [estimate].

#4.2 "PCI-listed P2PE" vs "P2PE-equivalent" — the distinction that costs money

Only a solution on the PCI SSC P2PE listing entitles the merchant to SAQ P2PE. Vendors routinely market "P2PE-grade" or "point-to-point encrypted" without a listing. Stripe describes its readers as providing strong encryption and minimal merchant PCI burden but is not, to my knowledge, a PCI-listed P2PE solution provider [known — verify]. Listed P2PE solutions exist from Verifone, Ingenico, Bluefin, and ID TECH — ID TECH announced a PCI-validated P2PE solution with an EMV-L3-certified application engine covering Chase, Elavon, Fiserv, Global Payments and Worldpay in March 2026 [verified].

Action item with a real dollar value: for every acquirer we sign, demand the PCI SSC listing URL for their P2PE solution and the P2PE Instruction Manual (PIM). If there is no listing, our merchants land on SAQ B-IP or SAQ C instead of SAQ P2PE, and our onboarding gets 3–5 hours longer per site.

#4.3 Keeping PAN out of our stack — concrete controls

ControlImplementation
No PAN in any API surfaceNo free-text fields on payment objects. Schema-validate; reject 13–19 digit sequences passing Luhn at the edge
No PAN in logsRegex + Luhn detector in the log shipper and a second one in the SIEM. Fail the build if a test payload leaks
No PAN in supportTicketing system content scanner; train support to never ask for a card number. Screenshot redaction
Storage schemaprocessor_token, last4, brand, exp_month, exp_year, fingerprint, issuer_country, funding_type, par (if available). Never pan, never cvv, never track data
NetworkTerminals + KDS + printers on a dedicated VLAN/SSID, separate from guest WiFi. Ship a network checklist and a pre-install site survey

Note: last4 + expiry + cardholder name without the PAN is not cardholder data under PCI, but it is personal data under GDPR. Different regime, still obligations (§4.6).

The restaurant network reality: one flat network, guest WiFi on the same SSID, a EUR 40 consumer router, the POS on DHCP. Segmentation is not a compliance checkbox for us — it is a field-services cost line. Either we ship a certified router with a pre-baked VLAN config (~EUR 120 hardware, EUR 5/mo managed) or we accept 2–4 hours of remote troubleshooting per site. Budget it explicitly.

#4.4 Tokenization

Token typePortable?Auth upliftLifecycle handling
Processor token (Stripe pm_..., Adyen recurringDetailReference)No — locks us to one processorBaselineProcessor-side Account Updater, if subscribed
Network token (Visa VTS / Mastercard MDES)Scheme-level; portable in principle, painful in practice+2–5% authorization uplift [estimate]Automatic card lifecycle updates built in

Use network tokens wherever the processor provisions them (Stripe and Adyen both do [known]). The auth uplift alone pays for itself on order-ahead and reservation deposits, where CNP decline rates are the silent revenue killer.

Lock-in warning: processor tokens are the reason POS companies cannot switch acquirers. Design a payment_method table with provider, provider_token, and a stable internal payment_method_id from day one, and treat a processor migration as a re-tokenization project (processors do support token migration to a competitor under scheme rules, but it takes 6–12 weeks of paperwork [estimate]).

#4.5 PSD2 SCA and MIT for order-ahead

ScenarioSCA statusImplementation
In-store chip+PINSCA satisfied at the terminalNothing to do
In-store contactless under CVM limitExempt (low-value), counters at the issuerNothing to do; handle the PIN fallback (§3.7)
Order-ahead / pay-at-table via QR / deliveryE-commerce → 3DS2 required3DS2 via the processor; frictionless rate 85–95% with good data [estimate]
Low-value online orderExempt under EUR 30, cumulative EUR 100 or 5 txns [known]Request the exemption; expect issuer soft-declines and retry with 3DS
TRA exemptionAvailable at acquirer fraud rates below thresholdsProcessor-level; not ours to control early
One-click reorder / no-show fee / meal-plan subscriptionMITInitial CIT must carry SCA + explicit card-storage consent; every subsequent MIT must reference the initial network_transaction_id

The classic failure: losing the initial network_transaction_id in the CIT→MIT chain produces a slow, mysterious decline-rate climb months later. Persist it on the payment_method record from the first transaction; make it non-nullable for anything flagged mit_eligible.

No-show / cancellation fees are MITs and additionally face EU unfair-contract-terms law. They need: the initial CIT with SCA, a recorded affirmative consent artefact (timestamp, IP, T&C version), and a cancellation window that a national consumer authority would accept. This is a real, sellable CRM feature (reservation deposits) — but it is a legal feature as much as a technical one.

PAR (Payment Account Reference) is an EMVCo-defined 29-character alphanumeric identifier that is the same value across the physical PAN, every network token, and every wallet token for a given funding account [known]. Issuers are mandated to supply it; Visa and Mastercard return it in authorization responses to acquirers.

This is exactly the primitive a restaurant CRM needs:

  • Recognize a returning walk-in guest across visits, without asking who they are.
  • Link "the card they tapped at the counter" to "their Apple Pay in the app" to "their card-on-file for delivery" — one guest, three payment instruments, one profile.
  • Attribute an in-store visit to an online marketing campaign.
  • Do all of the above with zero PAN in our systems and therefore zero PCI scope change.

Card-linked-loyalty vendors sell precisely this. It is the difference between a CRM that knows 15% of covers (the ones who scanned a loyalty QR) and one that knows 70%.

The must-verify: does our processor expose PAR?

  • Adyen: believed to expose additionalData.paymentAccountReference [estimate — verify, high value].
  • Stripe: exposes payment_method_details.card_present.fingerprint (stable per card per Stripe account, not across accounts) and network_transaction_id. PAR exposure is not confirmed [known — verify].
  • If neither exposes PAR, the fallback is the processor fingerprint, which works within one processor account but breaks on processor migration and does not unify a physical card with its wallet tokens. That is a materially weaker CRM.

This single API field should be a gating question in every acquirer conversation. It is worth more to the product than 20 bps.

GDPR reality — say this to the customer plainly:

UseLawful basisVerdict
Counting anonymous repeat visits by PAR for aggregate analyticsLegitimate interest + DPIADefensible
Fraud prevention / chargeback defenceLegitimate interestDefensible
Building a named guest profile and marketing to itConsent — explicit, granular, withdrawableRequired. Silent card-linking to a marketing profile is an EDPB/UODO/DSK complaint waiting to happen
Sharing PAR-derived profiles across merchants on our platformConsent + joint-controller agreementVery hard. Do not build a cross-merchant guest graph without dedicated legal work

Scheme rules additionally restrict acquirer/merchant use of PAR for marketing without cardholder consent [known]. Design the enrolment moment: a one-tap "link this card to your rewards" on the terminal or receipt QR, producing a recorded consent artefact. Everything else stays anonymous and aggregate.


#5. EMV L1 / L2 / L3 and scheme certification

LevelWhat it certifiesWho does itCost / elapsed time if we did it
L1Electrical / physical: ISO 7816 contact, contactless analog RFTerminal manufacturerNot applicable to software
L2EMV kernel: contact kernel + the contactless kernels (K2 Mastercard, K3 Visa, K4 Amex, K5 JCB, K6 Discover, K7 UnionPay, Book C-8)Terminal manufacturer (Verifone, Ingenico, PAX, Castles, BBPOS)EUR 500k–2M, 18–36 months [estimate]. Never
L3Our application's use of the kernel + host message formats, certified per scheme, per acquirer, per regionWhoever owns the payment applicationUSD 120k–250k, 18–24 months [verified]; formal test-script execution alone is 6–12 weeks per scheme/acquirer, plus acquirer queue time
Scheme/brand certificationBrand-specific test cases (Visa ADVT/CDET, Mastercard MTIP/TIP)SameBundled into L3 elapsed time
ECR / POI integration certificationSemi-integrated: our POS's use of the acquirer's already-certified terminal applicationUs, with the acquirerEUR 0–15k, 2–8 weeks per acquirer per country [estimate]

How vendor SDKs eliminate this: Stripe, Adyen, SumUp and Zettle hold the L2/L3 certifications for their entire reader estate, per scheme, per country. We call collectPaymentMethod() and do zero EMV certification, forever, in exchange for the take rate. In a semi-integrated configuration the terminal manufacturer or acquirer owns EMV certification; the POS needs only acquirer integration certification, which "takes far less time" [verified].

Distinguish these two clearly in planning, because people conflate them:

  • EMV L3 — expensive, slow, per acquirer, per country. Only if we own the payment application. Answer: never.
  • ECR/POI integration cert — cheap, weeks, per acquirer, per country. Unavoidable for semi-integrated. Budget 3–6 eng-weeks per new acquirer/country including their test queue.

Pre-certified escape hatches exist if we ever want a direct acquirer relationship without our own L3 — ID TECH's Payment Application Engine ships EMV-L3-certified against Chase, Elavon, Fiserv, Global Payments, Worldpay [verified]. That is a US-centric list. In the EU, the same role is played by the terminal vendor's certified payment application (Verifone, Ingenico, Castles) plus the acquirer's estate certification.

Hard rule for a 3-person team: if a payments conversation ever contains the phrase "your L3", walk out of it.


#6. Gift cards / stored value, and tips-distribution law

#6.1 Gift cards and the e-money boundary

ScenarioRegimeConsequence
Gift card spendable only at the issuing restaurant / one brandLimited network exclusion, PSD2 Art. 3(k) / EMD2 Art. 1(4) [known]No licence. Fine
Gift card spendable across all restaurants on RestaurantBrainE-money issuanceEMI licence: EUR 350,000 initial capital [known], safeguarding of float, own funds ≥ 2% of outstanding e-money. This is the trap
Limited-network scheme exceeding EUR 1,000,000 of transactions in the preceding 12 monthsNotification to the NCA required, PSD2 Art. 37(2) [known]Cheap, but must be tracked. Add a counter

Design rule: make the merchant the issuer and obligor of the gift card; we are only the ledger and the redemption rail. Put it in the contract, and make sure the float sits in the merchant's account, not ours. The moment we hold customer float or make a card multi-merchant, we are an EMI.

Other gift-card obligations that are real work:

  • EU Voucher Directive (EU) 2016/1065 — SPV vs MPV. A single-purpose voucher (VAT rate and place of supply known at issuance) is taxed at issuance; a multi-purpose voucher is taxed at redemption [known]. A restaurant selling food at 8% and alcohol at 23% issues an MPV. Our gift-card module must classify the voucher type and drive VAT accordingly, or the customer's VAT return is wrong. This is genuinely non-obvious, ~3–6 eng-weeks, and a real differentiator versus generic POS.
  • Expiry / validity: national consumer law varies (PL general 3-year limitation; IT/FR minimum validity rules) [estimate]. Make expiry configurable and jurisdiction-defaulted.
  • Breakage: unredeemed balances are revenue under IFRS 15 only on a defensible expected-breakage basis. In the US, state escheat law may claim unredeemed value — a genuine reason to defer US gift cards.
  • Ukraine: gift certificates are advance payments; the PRRO must fiscalize the redemption, not the sale (or both, depending on treatment) [estimate — verify with a UA tax adviser].

#6.2 Tips distribution — we become the system of record for a statutory duty

JurisdictionLawWhat it obliges
UKEmployment (Allocation of Tips) Act 2023, in force 1 Oct 2024 [known]100% of tips to workers, fair allocation, written policy, records kept 3 years, worker right to request their records
IrelandPayment of Wages (Amendment) (Tips and Gratuities) Act 2022, in force Dec 2022 [known]Electronic tips distributed fairly; notice displayed
Germany§3 Nr. 51 EStG [known]Guest→employee tips tax-free; employer-collected and redistributed tips are taxable wages
FranceSocial-contribution and income-tax exemption for tips to employees under ~1.6× SMIC, extended by successive finance laws [known — verify current year]Exemption is time-limited; check the current loi de finances
PolandTips pooled through the employer attract ZUS/PIT; direct guest→employee tips generally do not [estimate — verify]Contested area; 2024 interpretations
UkraineCard tips through the entity: PDFO 18% + military levy [known]Direct-to-waiter-card products (mono) route around the entity

Product consequences:

  • Tips must be modellable as either direct-to-employee (not merchant revenue, not on the fiscal receipt, no payroll event) or merchant-collected-then-distributed (payroll event, taxable in DE/PL/UA). This is a per-country, per-merchant configuration, not a global setting.
  • A real tips engine is required: pooling rules, tip-out percentages by role (server → busser → bar → kitchen), shift/hours weighting, service charge vs gratuity distinction, audit trail, payroll export, and a worker-facing record view (UK statutory).
  • If we distribute tips, we are the evidentiary record for a statutory obligation. That is a liability, and it is also a moat — it is exactly the kind of thing a customer will not rip out.

#7. Payment economics

#7.1 A 20-site chain, three markets

Assumptions: [estimate] throughout, sourced from typical casual-dining unit economics.

PolandGermanyUkraineUnited States
Revenue / site / yrEUR 900kEUR 1.4MEUR 450kUSD 1.6M
Sites20202020
Total revenueEUR 18.0MEUR 28.0MEUR 9.0MUSD 32.0M
Card share70%62%65%85%
Card volumeEUR 12.6MEUR 17.4MEUR 5.85MUSD 27.2M
Avg ticketEUR 22EUR 28EUR 12USD 32
Transactions/yr573k621k488k850k
MSC we charge1.15%0.55% blended1.35% (regulated ceiling)2.60% + $0.10
Gross payment revenueEUR 144.9kEUR 95.7kEUR 79.0kUSD 792k
InterchangeEUR 26.5kEUR 27.8kEUR 52.7k (~0.9% cap)USD 468k
Scheme fees / assessmentsEUR 7.6kEUR 8.7kEUR 4.1kUSD 38k
Provider / acquirer costEUR 78.4k (0.35% + 6c)EUR 45.8k (0.20% + 5c)EUR 14.0kUSD 83.5k
Net payments gross profit~EUR 32.4k~EUR 13.4k~EUR 8.2k~USD 203k
Per site / yrEUR 1,620EUR 670EUR 410USD 10,150
Take rate on volume0.26%0.08%0.14%0.75%
SaaS at typical pricingEUR 90/site/mo → EUR 21.6kEUR 150/site/mo → EUR 36.0kEUR 40/site/mo → EUR 9.6k$250/site/mo → $60k
Payments ÷ SaaS1.5×0.4×0.9×3.4×

#7.2 Why payments funds a POS company — and where it doesn't

Toast is the canonical case: ~140,000 locations, ~USD 150B+ annualized GPV, FY2024 revenue ~USD 5.0B of which ~75–78% is "financial technology solutions" [known, approximate]. Net payments take ≈ 0.55–0.60% of GPV → ~USD 6,000–6,500 of payments gross profit per location per year, against ~USD 3,000–3,500 of subscription gross profit. Payments delivers roughly 2× the gross profit of the software, and it scales with the restaurant's revenue rather than with seat count, which means it grows without a sales motion.

That model does not transplant to the EU, because the IFR caps the interchange that inflates the US merchant service charge. The EU pool is ~1/3 the size. Concretely: the same 20-site chain that funds USD 203k of payments gross profit in the US funds EUR 32k in Poland and EUR 13k in Germany.

Strategic consequences:

  1. In the EU we are a SaaS business. Price accordingly: EUR 150–350/site/month in Western EU, EUR 60–120 in CEE, with module-based expansion (CRM/loyalty, online ordering, reservations, inventory). Payments is a 20–40% revenue kicker and a retention mechanism, not the engine.
  2. Push volume to CNP, not CP. Online ordering, reservation deposits, gift cards, and pay-at-table QR all carry 1.4–1.9% MSC against the same IFR-capped interchange. EU online-ordering margin is 3–5× in-store margin. This is the single most actionable economic insight in this document.
  3. Germany is the worst payments market and the best SaaS market. Do not lead with a payments pitch there.
  4. Ukraine has effectively no payment margin (interchange ~0.9% cap against a ~1.4% acquiring ceiling [known — verify current NBU/Law 3498-IX figures]). Ukraine must be won on product and price, with payments as pure integration, not revenue.

#7.3 Adjacent payment revenue lines worth more than the interchange spread

LineMechanicsRealistic EU yield [estimate]
Terminal rentalEUR 19/terminal/mo, device cost EUR 250, 36-month life~EUR 430 gross profit per terminal over 3 yrs. On 20 sites × 2 terminals = EUR 17k. Comparable to the entire interchange spread in Germany
Instant payout1.0–1.5% fee for same-day settlementHigh margin; needs a funding facility or a provider that offers it
Merchant cash advance / revenue-based financeWhite-label via YouLend or Liberis; platform earns a commission on funded amount2–4% of funded amount [estimate]. On a 20-site chain taking EUR 300k, that is EUR 6–12k, recurring. No licence needed if fully white-labelled — verify per country
Float on settlementOnly if we hold funds (payfac)EUR 100M TPV × 1.5 days × 2.5% ≈ EUR 10k/yr. Negligible below EUR 1B TPV
Gift card breakageMerchant's revenue, not ours; we can charge for the moduleSell as a EUR 20–40/mo module
DCC rebate shareAcquirer-providedTourist sites only; EUR 500–3,000/site/yr in Prague/Lisbon/Kraków old towns [estimate]

#7.4 The payfac break-even, decided

  • Managed payfac (Stripe Connect / Adyen for Platforms) net to us: ~26 bps in the Poland model.
  • True payfac net to us: ~55–65 bps in the same model (we keep the provider's 35 bps minus our own processing/gateway cost of ~5–10 bps).
  • Incremental margin: ~30 bps.
  • Fixed cost of being a payfac: EUR 700k–1.2M/yr (§1.2) [estimate].
  • Break-even TPV = EUR 1,000,000 ÷ 0.0030 ≈ EUR 333M/yr, ≈ 400–600 restaurant sites at EU volumes, or ~1,500 sites in Ukraine.

Decision: do not consider a PI licence below EUR 300M annual TPV. Under scenario S1 (bootstrapped, 24 months' runway) it is not remotely reachable. Under S2 (EUR 5–10M seed/A) it is a year-4+ conversation, and by then PSD3/PSR will have changed the regime anyway.


PhaseMonthsPayments architectureCommercial modelPCI posture
P0 — UA beachhead0–6mono + PrivatBank Android terminals, intent/REST integration; PRRO fiscalization mandatoryReferral (≈0 revenue)Out of scope; merchant uses bank terminal
P1 — PL/CZ/RO6–14Stripe Terminal, server-driven + local SDK; S700/S710 with Apps-on-Devices where the per-country roster allowsStripe Connect, application_fee 20–35 bpsMerchant SAQ P2PE or B-IP; us SAQ D-SP
P2 — Western EU14–26Same Stripe stack + Tap to Pay on iPhone/Android; SumUp Cloud API as a secondary adapter for retentionConnect, 25–40 bps; terminal rentalSame
P3 — chains26–40Adyen Terminal API adapter for 20+ site chains that demand their existing acquirer; orchestration layer emerges hereMixed: Connect for SMB, referral/orchestration for chainsUs likely Level 1 SP → ROC
P4 — only if >EUR 300M TPV40+Evaluate managed payfac with deeper economics (Payrix/Finix) or a PI licence40–80 bpsLevel 1 SP ROC, mandatory

Design invariants from day one, regardless of phase:

  1. A single PaymentTerminal port. Adapters: stripe-terminal, sumup-cloud, adyen-terminal-api, ua-mono, ua-privat. Restaurant flow logic never branches on provider.
  2. payment_attempt has an explicit unknown state and an idempotency key. Non-negotiable.
  3. Acquirer transaction reference persisted forever on every payment (referenced refunds).
  4. TipAllocation is a first-class entity with a collector, a taxability flag, and a fiscal-receipt-inclusion flag.
  5. payment_method carries provider, provider_token, network_token_id, par, network_transaction_id, fingerprint — all nullable except the first two.
  6. Nightly three-way reconciliation (POS check ↔ terminal journal ↔ acquirer settlement) with an unmatched-items report.
  7. Zero PAN. Enforced by an edge validator and a log scanner, tested in CI.

#9. Honest risks

RiskSeverityMitigation
Ukraine payments layer shares nothing with EU — two integrations, two fiscalization regimes, two tips models, no shared revenue modelHigh. Effectively two products behind one UIAccept it. Keep the port abstraction rigorous. Do not let UA-specific concepts (PRRO, direct-to-waiter tips) leak into the core domain
Stripe girocard support in Germany — if Stripe Terminal cannot accept girocard, Germany is closed to a Stripe-only stackHigh for DEVerify immediately. If unsupported, DE needs a Nexi/Concardis ZVT adapter (6–10 eng-weeks) before any German sale
PAR unavailable from our processorHigh for the CRM thesisVerify with Stripe and Adyen before architecture lock. Fallback to processor fingerprint weakens but does not kill the CRM
Vendor concentration on StripeMediumThe Adyen adapter in P3 is the hedge. Keep the port clean so it stays a 8–12 eng-week job, not a rewrite
SumUp is a competitorMediumUse their Cloud API only as a secondary retention adapter; never as the primary rail
EU payment margin is structurally thinHigh — this is a business-model risk, not a technical onePrice SaaS properly; lean into online ordering / deposits / gift cards where the margin is
Tips and VAT misconfiguration creates tax liability for customersHigh reputationalCountry config packs reviewed by a local tax adviser per market. Do not ship a market without one
PCI scope creep from a single careless feature (e.g. "let staff type a card number for phone orders")HighInstitutional rule: any feature requiring keyed PAN entry must be done on the terminal (MOTO on the PIN pad), never in our UI
Double charges from timeout handlingHigh operationalIdempotency + unknown state + reconciliation, built in P1 not P3

#Build effort

Engineer-months. "Variance drivers" is what makes the number move. Assumes senior engineers with heavy AI assistance; multiply by 1.4–1.8 for a team new to payments.

#Work itemEng-monthsVariance drivers
1PaymentTerminal port + domain model (payment_attempt, states incl. unknown, idempotency, tender ledger)2.0How rigorous the multi-tender/split model is up front
2Stripe Terminal adapter — server-driven + local SDK (iOS/Android), reader discovery, pairing, firmware/update handling, error taxonomy2.5Whether we support both connection modes; reader-fleet management UI
3Apps-on-Devices: our Android POS running on S700/S710 (build, signing, OTA deployment, kiosk lockdown)2.0Stripe's deployment tooling maturity; whether we support 2 device families
4Tips engine — per-country semantics, on-terminal vs post-auth, pooling/tip-out rules, taxability flags, payroll export, UK statutory record view3.5Number of countries; whether payroll export targets are named (DATEV, Symfonia, M.E.Doc)
5Split payments — by amount/even/seat/item, VAT re-allocation by largest remainder, partial-success and walk-out handling2.0Seat/item modelling depth; interaction with course firing
6Pre-auth / bar tabs — estimated auth, incremental auth where available, capture, expiry sweeper, unpaid-check write-off2.0Whether incremental auth is available per market (largely not in EU); fallback design
7Voids / refunds — referenced refunds, batch-boundary UX, partial refund allocation across food/service/tip, manual-refund record type1.5Acquirer-specific refund rules and windows
8Reconciliation — settlement-file ingestion, three-way match, unmatched report, auto-reversal of stale auths2.5Number of acquirers; file-format variety (CSV/XML/report API)
9Tokenization + CRM bridge — payment_method model, network tokens, PAR/fingerprint capture, guest-profile linkage, consent artefacts, GDPR erasure paths2.5Whether PAR is available; depth of the consent/enrolment UX
10SCA / 3DS2 / MIT for online ordering, reservation deposits, no-show fees, CIT→MIT chain integrity2.0Exemption strategy; number of CNP surfaces
11Gift cards / stored value — ledger, SPV/MPV VAT classification, expiry, redemption on fiscal receipt, limited-network EUR 1M counter2.0VAT classification depth; multi-site (same brand) redemption
12Cash handling — rounding rules per country, drawer, cash-up / Z-report, discrepancy tracking1.5Number of rounding regimes; till-management depth
13Ukraine: mono + PrivatBank terminal adapters2.5Documentation quality (thin); Ukrainian-language integration support
14Ukraine: PRRO fiscalization (DPS fiscal server, receipt formats, shift open/close, offline mode, X/Z reports)3.0Whether we build direct to DPS or ride Checkbox/Vchasno Kasa/Cashalot as an intermediary (halves it)
15Poland fiscalization — online cash registers, CRK reporting, Posnet/Elzab/Novitus drivers3.0Certified device homologation; whether we use a fiscal-printer partner
16Romania fiscalization — AMEF homologated fiscal printers, ANAF reporting2.5Homologation process is the long pole, not the code
17SumUp Cloud API adapter (secondary)1.0Cloud API only; skip the native SDKs
18Adyen Terminal API adapter (P3)2.5Local + cloud modes; TLS cert management per terminal
19Offline / store-and-forward — caps, liability acknowledgement, forward queue, failure dashboard1.5Only worth it if a named chain demands it. Defer
20PCI programme — SAQ D-SP, log/PAN scanners in CI, segmentation guidance + certified router config, evidence collection, QSA readiness2.0 + ~0.3/mo ongoingLevel 1 SP designation converts this into a ROC (add 3–4 eng-months)
21Acquirer ECR/POI integration certifications0.75 per acquirer per countryAcquirer test-queue latency dominates; calendar time ≫ eng time
22Surcharging / service-fee engine (US, or EU commercial cards)1.5Defer entirely for EU v1
Core EU v1 (items 1–3, 4–10, 12, 20, 21×2)~26
+ Ukraine v1 (13, 14)~5.5
+ CEE fiscalization (15, 16)~5.5
+ P3 (11, 17, 18)~5.5
Total to a sellable multi-market v1~37–42 eng-months

Scenario read:

  • S1 (founder + 3 engineers, ~24 months): ~72–96 available eng-months across the whole product. Payments alone consumes 37–42 if we chase UA + PL + RO + Western EU. This does not fit. S1 must pick one fiscal regime plus one payment rail — realistically Ukraine only (mono/Privat + PRRO, ~15 eng-months for payments) or Poland + Czechia only (Stripe Terminal + PL fiscalization; CZ has no fiscalization since EET was repealed in 2023 [known], so CZ is nearly free — CZ is the cheapest EU country to enter and should be the first EU market).
  • S2 (15–30 people, EUR 5–10M): 37–42 eng-months over 4–5 payments engineers is 9–11 calendar months. Feasible, and the binding constraint becomes acquirer certification queues and fiscal-device homologation (calendar, not engineering).

#Open questions / what would change this answer

  1. Does Stripe Terminal support girocard in Germany? If no, Germany requires a Nexi/Concardis ZVT adapter (+6–10 eng-weeks) before the first German sale, and the German payments margin (already the worst at 0.08%) goes to roughly zero. Would change: German go-to-market timing and the P2 device strategy.
  2. Does Stripe (or Adyen) expose PAR (paymentAccountReference) on card-present authorizations? This is the single most valuable API field for the CRM thesis. Would change: whether "recognize the guest by their card, anonymously, with no PCI scope" is a real feature or marketing. Verify by reading the card-present response schema and, if ambiguous, running a live test transaction in each processor's sandbox.
  3. What is the current Ukrainian interchange and acquiring-fee cap regime? Law 3498-IX and subsequent NBU resolutions capped interchange (0.9–1.0%) and merchant acquiring (1.4%) with a stepped reduction schedule [known — unverified figures for 2026]. Would change: whether Ukraine has any payment margin at all, and whether a UA acquiring partnership is worth negotiating.
  4. Per-country Stripe Terminal device roster for PL/CZ/RO/HU. Country support is confirmed [verified] but WisePOS E availability is documented only for 10 Western markets [verified]. If S700/S710 are also unavailable in CEE, the Apps-on-Devices single-device strategy collapses there. Would change: the entire P1 hardware plan.
  5. Do we need our own PCI AOC, and at what level, before the first 50 merchants? Acquirer-dependent. Stripe may accept us as a platform without a formal SP AOC at low volume; Adyen and bank acquirers will not. Would change: EUR 20–90k/yr of cost and 2–4 eng-months, timing unclear.
  6. Is a white-labelled merchant cash advance (YouLend/Liberis) licence-free for us as a referrer in PL/CZ/RO/DE? If yes, it is the highest-margin adjacent revenue line available and may exceed the interchange spread. Would change: the "payments doesn't fund an EU POS company" conclusion — MCA commission could add EUR 300–600/site/yr, doubling per-site payment economics in CEE.