Core user & plans
id, email/phone, device_hash, status, created_at, updated_atid, name, monthly_price, daily_cap, pct_min..pct_max, per_item_cap, price_floor, rounding_rule(to ask about it)plan_id, product_group_id (what items a plan covers)id, client_id, plan_id, status(active/paused/…), start_at, end_at, auto_renew, cancel_atCatalog & merchants
id, code('espresso','latte',…), nameid, nameid, partner_id, name, city, timezone, status, geo_location, open_hoursid, store_id, name, (role, pin_hash -> to be discussed and decided for later), statusto be discussed and decided for later
id, store_id, label, size, product_group_id, price, effective [from,to) (reference prices; no overlaps)Discount configuration
id, plan_id, name('Bronze','Silver','Gold')template_id, product_group_id, pctstore_id, plan_id, mode('template'|'advanced'), template_id?, statusid, store_id, plan_id, product_group_id, pct, approved, effective [from,to) *(no overlaps; within plan band)`Benefits & usage
id, client_id, store_id?, plan_id|tier, date, type('daily','monthly','trial'), used_count, limit (current counters for Explorer/Launch Pass/Paid)id, store_id, tier, month, limit_amount, spent_amount (auto-pause free tiers per store)Redemption & audit
id, client_id, store_id, staff_id, occurred_at, result(VALID/DENY_*), reason, jtiid, redemption_id, product_group_id, list_price, applied_pct, discount_amount, final_priceclient_id, device_hash, bound_at, activeid, type(QR_REPLAY, PIN_CHALLENGE, …), client_id?, store_id?, ts, metaComputed views (for runtime & BI)
(store, plan, product_group) using: override → template → plan.pct_min, then clamp to band; exposes per_item_cap, price_floor, rounding.Funnels & activation
signup_completed, first_redeem_time (activation rate, median time-to-first-redeem)% of new users with ≥1 LP redemption in 14 days% of active users with ≥1 Explorer redemption in monthMonetization & retention
% of paid users reaching plan break-even each cycleUsage & behavior
Merchant performance
Operational quality
Security & abuse
jti)Core event taxonomy (name → key props)
signup_completed → {client_id, ts, channel}plan_started / plan_canceled → {plan_id, tier, ts}qr_shown → {client_id, ts}redeem_preview → {store_id, items[], est_pct, tier_label, decision}redeem_authorize → {qr_jti, decision}redeem_confirm → {redeem_id, store_id, staff_id, items[], applied_pct, discount_total, tier_label, latency_ms}redeem_void → {redeem_id, reason}deny_event → {code (CAP/COOLDOWN/PRICE_FLOOR/ITEM/STORE/PLAN/TOKEN), store_id}pin_challenge → {store_id, staff_id, passed}Dashboards (at launch)