Pricing
One page, every QR use case, USD. The machine-readable source of truth is
GET /api/v1/pricing (public, no auth) — amounts there are integer cents
with a version and effectiveDate. Values marked live are read from the
same constants the billing code applies; values marked recommended are the
published convergence targets for flows still landing (owners may adjust).
1. Screen ad slots (QR self-serve & direct-sold)
Model: per machine, per month, per loop slot (8×15 s loop), flight 1–6 months. Price = base rate × format × slots × machines × months × volume discount.
| Base rate | Price | Status |
|---|---|---|
| Local business | $99 /machine/mo per slot (guidance $75–150) | live |
| Stocked-brand co-op | $175 /machine/mo per slot (guidance $100–250) | live |
| Multiplier | Value | Status |
|---|---|---|
| Standard slot (1 of 8) | 1× | live |
| Double slot (2 of 8) | 2× | live |
| Image creative | 1× | live |
| Video creative | 1.5× | recommended |
Volume discounts by reach (recommended): single zip 0% · zip cluster (2–5 machines) 5% · city (6–15) 10% · multi-zip (16–50) 15% · nationwide (51+) 25%.
Operator revenue share on direct-sold ads: 60% operator / 40% platform (recommended, v1.1.0). Video held at 1.5× by sign-off adjudication: comparable networks show 2–4× static-to-video gaps, but 1.5× keeps the video local slot at $148.50 — under the ~$150/mo Yelp-low-tier anchor the self-serve pitch leans on.
Revenue projections at these rates must assume ≤ 50% slot occupancy in year
one (sign-off v1.1.0) — the rate card never presumes a sold-out loop. Implied
CPM = monthly slot price ÷ (impressionsPerPlay × loop plays/mo ÷ 1000);
impressionsPerPlay is a venue-traffic estimate until dwell sensors land, so
CPM claims derived from it are planning figures, not verified delivery.
2. Programmatic / mediation (read-only yield config)
Unsold slots go to auction. Floors and expected clearing CPMs per venue type:
| Venue (OpenOOH) | Floor CPM | Expected CPM | Status |
|---|---|---|---|
| Convenience store (202) | $2.00 | $4–8 | recommended |
| Mall concourse (20501) | $3.00 | $5–10 | recommended |
| Airport gates (10105) | $4.00 | $6–12 | recommended |
Live global floor: KIOSKX_MEDIATION_FLOOR_ECPM (default $1.50 since
v1.1.0 — a $0 fallback was exploitable by bid shading on screens missing a
venue override; per-screen overrides in the mediation engine). Direct-sold
programmatic guidance: $7–22 net CPM.
Floor review cadence: quarterly, re-benchmarked against published Place Exchange / Vistar / Trillboards clearing data (pDOOH CPMs moved −14% in a single half-year, H2 2024 → H1 2025).
3. Game worlds (one-time pay)
Free 30-second sample first, then:
| SKU | Price | Status |
|---|---|---|
| Worlds Pass — all 5 worlds (topic personalization included) | $4.99 one-time | live (Stripe Payment Link) — recommended default |
| Single world unlock | $1.99 one-time | recommended |
| Replay (after the free 24 h replay) | $0.99 | recommended (was $2.99; a replay can never price above a fresh unlock) |
| Worlds subscription (all worlds, unlimited topics) | $9.99/mo | recommended |
Reward cost target: ≤ 30% of ticket. Web Stripe checkout (~2.9% + $0.30) nets ≈ $1.63 on the $1.99 ticket — projections use net, not gross. Sign-off v1.1.0: the $1.99 single-world SKU must become live/purchasable (only the $4.99 pass has a Stripe link today), and the scan → checkout → purchase funnel must be instrumented so the 1–5% conversion expectation is testable within 60 days.
4. Quest drops (free product — funding-side pricing)
The shopper pays nothing; the funding source pays. Sponsor rate card (per verified completion, stepped by product retail value; band $1.50–$6.75, superseding spec §4's $1.50–$4.00 per sign-off v1.1.0 — the old upper-band fees left the operator funding sponsor campaigns at a loss):
| Product retail value | Sponsor pays / completion | Status |
|---|---|---|
| up to $2.00 | $1.50 | recommended |
| $2.01–4.00 | $2.50 | recommended |
| $4.01–7.00 | $4.75 | recommended (was $3.25) |
| $7.01–10.00 | $6.75 | recommended (was $4.00) |
Eligibility (v1.1.1): the card applies only to products at or under $10.00 retail (the top band's ceiling). Higher-value products require a custom sponsorship agreement — never an off-card per-completion rate.
Verification premium (v1.1.1): Band 4's $6.75 sits above the $1–5 per-delivered-sample cost of a demo agency deliberately — the fee is charged only on a machine-verified physical dispense (one-time KX- code, single ledger, no double spend), receipt-grade proof a sampling agency cannot provide. Sponsors paying above the substitute ceiling are buying the verification; unverified engagement is never billed.
Platform margin on sponsor-funded completions: 20% (operator keeps 80%,
which now covers wholesale product cost ≈ 50% of retail at every band top:
$3.80 ≥ $3.50 and $5.40 ≥ $5.00) — recommended. Operator-funded promos:
default hard cap $50/machine/mo (recommended; issuance stops at the cap);
live redemption cap $20 max product price (KIOSKX_PLAY_MAX_PRICE).
Platform-funded promos use the same cap mechanics and report as house.
Enforcement gap (v1.1.0): the $50/machine/mo cap is declared but the machine promo config has no budget/spend field yet — the catalog carries
capEnforcementImplemented: false, and sponsor-funded quests must not launch until the hard-stop exists in code.
4b. Prize mechanics — Spin-a-Wheel / Scratch & Win / IntelliDraws (v1.2.0)
QuestX's prize mechanics at the kiosk: scan-to-play pages (/spin,
/scratch, /draws?machine=…) rendering the live QuestX prize pools
(public config endpoints on quest-x.ai); outcomes resolve server-side in
Kiosk-X over those odds (QuestX's play API requires a consumer JWT, so an
anonymous shopper can't get an account-authoritative result — labeled
demo-behind-interface, the /play precedent). Product wins mint the existing
one-time machine-bound KX- credit → $0 promo order (revenue excluded,
retail value recorded).
| Play | Price | Status |
|---|---|---|
| Spin-a-Wheel — one spin | $0.99 | recommended |
| Scratch & Win — one card | $1.49 | recommended |
| IntelliDraws — one raffle entry | $1.99 | recommended |
Both funding paths exist per mechanic:
- Pay-to-play (direct): Stripe one-time Checkout per play; the QR id +
machine ride
client_reference_id({entryId}--qr_kxprz_<mech>_<machine>--<machineNo>). - Operator-promo free plays: per-machine daily allowance (3 spins / 2 cards / 1 draw entry) funded by the machine's monthly promo budget (default $50/machine/mo). Cap enforcement is implemented here: issuance hard-stops when the worst-case prize cost no longer fits under the cap (the enforcement §4 flags as an open item for quest drops).
Win economics (margin math, wholesale ≈ 50% of retail; live QuestX odds at v1.2.0 — grand slice p=0.02, second p=0.05; mapping clamped in code so expected product cost ≤ 35% of gross per play, whatever upstream configs do):
| Mechanic | Gross | Net (Stripe) | E[prize cost] | Margin |
|---|---|---|---|---|
| Spin | $0.99 | ≈ $0.66 | ≈ $0.09 | ≈ $0.57/spin |
| Scratch | $1.49 | ≈ $1.15 | ≈ $0.09 | ≈ $1.06/card |
| Draws | $1.99/entry | ≈ $1.63 | $5.00 prize (wholesale) per machine-draw | pot covers prize at ≥ 4 paid entries; shortfall is a promo-budget subsidy ≤ $5 |
Prize tiers: grand = free product ≤ $3.50 retail; small = ≤ $2.00
(the two highest QuestX outcomes map to product credits, everything else
stays QuestX points); weekly draw = free product ≤ $10 retail, one winner
per machine-draw, drawn server-side at the QuestX drawDate (scheduled
draws only — QuestX runs no instant-win draw variant).
Operator controls: PUT /api/v1/machines/{machineNo}/prize-mechanics
(per-mechanic flags, prize caps, budget), printable QR per mechanic, report
at GET /api/v1/prizes/report (scans → entries → plays → wins funnel, gross
revenue, prize cost, budget consumption), and house creatives in the getAd
attract loop for each enabled mechanic.
5. Multiplayer game
- Free-to-play (default, live): winner's product credit is funded by the machine's promo program, capped by the operator promo budget above. The cheapest-stocked-product giveaway lives ONLY here — it is operator marketing spend, not a payout against session revenue.
- Pay-to-play (optional): $1.00/session (live constant,
KIOSKX_GAME_PLAY_PRICE; Stripe stub until live keys). Session revenue split: 70% operator / 30% platform (recommended), after the winner credit is funded from the pot. - Pay-to-play winner credit (restructured, v1.1.0): a retail-denominated
discount credit worth 30% of the session pot
(
KIOSKX_GAME_WINNER_CREDIT_PCT), scaling with player count — 2 players → $0.60, 4 players → $1.20 — so the payout ratio holds the claw-machine 20–35% band at every count (the old cheapest-stocked-item mechanic paid out 99.5% at the 2-player minimum). Capped at $20; redeemed via the existing KX- discount-code ledger; wholesale cost basis (≈50% of retail) means true payout cost ≈ 15% of pot.
6. Operator SaaS (subscriptions)
| Plan | Price | Status |
|---|---|---|
| Monthly, per device | $9.99/device/mo, 14-day trial, 30-day period | live (GET /api/v1/subscriptions/pricing) |
Fleet volume tiers (recommended convergence target, v1.1.0 — billing still charges the flat live plan until tiered billing lands):
| Fleet size | Per device / month |
|---|---|
| 1–24 devices | $9.99 |
| 25–99 | $8.49 |
| 100–249 | $6.99 |
| 250+ | $5.49 |
Margin-stack rule: the SaaS fee must stay ≤ ~25% of the incremental monthly profit the platform's revenue shares (60% of ads, 80% of quest fees, 70% of pay-to-play) generate per device, and the operator must keep ≥ 50% of total machine-generated profit across all models combined.
7. Payment-link QRs
Product / sticker / 3D-object QRs wrap Stripe payment links — the price is
whatever the link was minted with (pass-through; attribution via
client_reference_id).
8. Utility QRs (deliberately unpriced)
Registration, QR-auth login, app-install smartlinks, video end-cards, merchandise, referral, social-share, the qr-studio registry, demo and docs QRs are utility_indirect: no direct price by design. Each declares its indirect path in the catalog (e.g. registration → per-device SaaS billing, login → order conversion, referral → capped signup-reward budgets), so no QR surface is unclassified.
All 18 QR surfaces from the monetization spec — plus the three prize-mechanic
scan-to-play QRs added in v1.2.0 (21 total) — map to a section above; the
catalog's qrSurfaces array carries the mapping, and the test suite fails if
a surface or monetization class ever goes missing.
Branded rendering. Every QR Kiosk-X serves is brand-customized to the
product it opens (app/qr.py): QuestX branding on quest / free-product /
prize-mechanic codes, ContentX branding on ad-creation codes (including the
getAd house poster), Intelliverse X branding on Game World / multiplayer
codes, and the KX house mark on operator utility codes — rounded modules in
the brand's primary color, the brand's app icon on a white center plate, and
ECC-H so every code stays scannable (machine-decode pinned in
tests/test_branded_qr.py).