vek1 — pricing design (Stripe sub + topup)
Pricing — Stripe subscription + metered + topup
Originalmente spec em
docs/superpowers/specs/2026-05-20-pricing-stripe-design.md.
Esta nota agora documenta o estado live em prod após PRs A→B→C+UI + premium positioning.
Status
LIVE em prod. Pricing operacional Starter R$ 199 / Pro R$ 599 / Business R$ 1.499. Stripe test mode atualmente (não live mode ainda).
Princípios da brainstorm (todos mantidos)
- Modelo Anthropic: mensalidade com cota inclusa + overage metered acima da cota ✅
- Cliente em controle: cap próprio de overage em R$ + topup avulso ✅
- Stripe gateway vek ↔ lojista. AbacatePay intacto pro lojista ↔ cliente final ✅
- Bônus 50% na primeira carga topup ever (em vez de trial) ✅
- Sem gating de channels (WhatsApp + website em todos os planos) ✅
Tiers live (premium positioning — 2026-05-21)
| Starter | Pro | Business | |
|---|---|---|---|
| Mensalidade | R$ 199 | R$ 599 | R$ 1.499 |
| Lojas | 1 | 3 | ilimitadas |
| Agentes ativos | 1 | 5 | ilimitados |
| Produtos | 100 | 5.000 | ilimitados |
| Tokens inclusos / mês | 1M | 5M | 30M |
| Overage / 1M tokens | R$ 39 | R$ 28 | R$ 20 |
Conversas estimadas/mês (~1k tokens por mensagem):
- Starter: ~1 mil conversas
- Pro: ~5 mil
- Business: ~30 mil
Pricing v1 (descontinuado, ainda existe no Stripe)
Pricing inicial era Starter R$ 79 / Pro R$ 299 / Business R$ 899. Subprecificado vs valor entregue (~2.5% capture vs custo CLT substituído). Premium positioning aplicado em PR #80 — Stripe Prices versionados _v2; v1 ainda existe pra subs pré-existentes.
Arquitetura (implementada)
- Stripe Products (3) com
metadata.slug—prod_UYOf5a6xvphEN8(starter),prod_UYOgIwPK21JfGt(pro),prod_UYOgi2jFH6S7cd(business) - 6 Prices
_v2— recurring monthly + metered overage por tier - Meter
vek1.tokens_consumed(sum aggregation, customer mapping by-id) - Customer 1:1 com
company_profiles.id - Subscription com 2 items (recurring + metered) por company
Schema implementado (Drizzle)
4 tabelas em prod:
subscription_plans(espelho Stripe Price IDs)company_subscriptions(status, period, plan FK, stripe_customer_id, stripe_subscription_id, cancel_at_period_end, trial_end)company_billing_settings(overage_cap_cents, auto_overage_enabled, payment_method_id, grace_until + grace_started_at + grace_overage_charge_attempted_at, low_balance_alert_at_pct + alerted_at_{80,100,cap})token_topups(stripe_payment_intent_id unique, amount_cents, tokens_credited com bônus 50%, tokens_remaining FIFO, bonus_applied_pct, status)token_usage(alter): +billable, +topup_id, +reported_to_stripe_at
Caminho crítico (check_quota_or_block — implementado)
1. SELECT subscription. Status not in active/trialing → BLOCK
2. SELECT used (token_usage no current_period)
3. SELECT topup_remaining FIFO
4. available = included + topup_remaining
5. used < available → ALLOW + maybe_alert_80_pct
6. Overage zone:
- overage_cents >= cap_cents → BLOCK (cap_reached)
- auto_overage_enabled + dentro cap → ALLOW (overage_within_cap)
- default (auto=false ou cap=0):
- grace_until NULL → start grace 3-dias + email → ALLOW (grace_started)
- now < grace_until → ALLOW (in_grace)
- now >= grace_until → BLOCK + email (grace_expired)
Cache em memória TTL 30s não foi implementado (over-engineering por enquanto; load atual baixo).
Worker reporting Stripe (implementado)
apscheduler in-process no vek1-api, interval 5min (BILLING_REPORT_INTERVAL_MIN env). Função billing_service.report_usage_to_stripe():
- SELECT pending
token_usage(reported_to_stripe_at IS NULL AND billable = true AND created_at < now() - 1min) agrupado por company - Pra cada company com overage zone:
stripe.billing.MeterEvent.create(event_name='vek1.tokens_consumed', payload={stripe_customer_id, value: million_units}, identifier=batch_min:max)(idempotency natural viaidentifier) - UPDATE
reported_to_stripe_at = now()nos rows incluídos
UI implementada
/pricing(pública) — tabela 3 tiers + ComparisonTable + CostCalculator + bônus callout + 6 vs pages links/pricing/vs/[slug](6 páginas SEO) — octadesk, socialhub, blip, zenvia, chatguru, wati/onboarding/billing(wizard 3-step) — plano → cartão (Stripe Elements SetupIntent) → ativar (createSubscription)/billing(internal, sidebar link no grupo Sistema) — plano + uso gauge + cap toggle + cartão + topup modal + plan switch + invoices Hosted URL
Endpoint público /billing/plans-public
vek1-api PR #26 adicionou sub-router público (sem auth) pra landing /pricing consumir via HTTPS em vez de TCP direto Postgres (firewall corporativo às vezes bloqueia 5434). Retorna só campos não-sensíveis (sem stripe_*_id, sem timestamps).
Out of scope (Fase 1) — ainda válido pra fase 3+
- Anual com desconto
- Coupons / promo codes
- Team seats / multi-user por company
- NFSe
- Customer Portal Stripe self-serve (UI custom fica)
- Migration cobrança beta legacy automática