vek1 — features
Features principais
Billing — Stripe subscription + metered + topup (LIVE)
Sistema completo de cobrança SaaS implementado em Fase 1+2.
Backend (vek1-api PRs #24, #25, #26)
routers/billing.py(/internal/billing/*) — plans, summary, subscriptions, setup-intent, topup, settings, invoicesrouters/stripe_webhook.py(/webhooks/stripe) com signature HMAC validation pros 6 events: customer.subscription.* (created/updated/deleted), invoice.paid, invoice.payment_failed, payment_intent.succeededservices/billing_service.pycomcheck_quota_or_block(state machine 3-day grace) + FIFO topup + bônus 50% primeira recarga + try_charge_overage automático Day 3services/chat_billing.py— helpersresolve_company_id,quota_block_response,record_token_usage(chamados pelo/chat)services/billing_emails.py(Resend) — cota_warning_80, grace_started, grace_expired, charge_succeeded/failed- apscheduler in-process cron 5min reportando usage_record pro Stripe Meter
vek1.tokens_consumed - Endpoint público
/billing/plans-public(sem token) — usado pela /pricing pública pra evitar TCP direto Postgres
Frontend (vek1 PRs #74, #78, #79, #80)
/settings#billingremovido (era seção) →/billingpágina dedicada com sidebar linkBillingSectioncomponente — planos + uso gauge + cap + cartão Stripe Elements + topup + plan switch + invoices Hosted URLAddCardModal(SetupIntent + PaymentElement)TopupModal(PaymentIntent off-session se cartão / Elements se sem)PlanCompareModal(3 tiers com proration on switch)/onboarding/billingwizard 3-step pós-signup (plano → cartão → ativar)apiClient.billing(10 funções tipadas) +app/actions/billing-actions.tslib/auth-client.ts→signOutexportado
Pricing live (premium positioning)
| Plano | Mensal | Tokens | Overage / 1M |
|---|---|---|---|
| Starter | R$ 199 | 1M | R$ 39 |
| Pro | R$ 599 | 5M | R$ 28 |
| Business | R$ 1.499 | 30M | R$ 20 |
Bônus 50% na primeira recarga avulsa. Stripe Prices versionados _v2 (Prices imutáveis); v1 antigos mantidos pra subs pré-existentes.
Landing page (/) — Industrial Atelier 3D
Redesign completo (PR #75 + #77 + #78):
- Aesthetic: Industrial Atelier maximalist — Instrument Serif italic display + IBM Plex Mono labels, dark theme, 1 accent terracotta
- 3D real CSS (sem Three.js):
perspective+preserve-3d, hero phone diorama com mouse parallax, 6 floating chips, iso grid floor - Sections: Hero phone scene → MarqueeLogos (tipos de negócio: petshops/salões/padarias) → StatsBand (4 stencil stats honestos) → HowItWorks (3 iso cards) → Features (6 cards mouse-tilt) → PricingPreview (3D, Pro elevated) → CTABlock → Footer
- CTAs aware logged (
useSessionBetter Auth): logged → "Ir pro painel" / anon → "Criar conta" - Copy PME: zero referência tech (sem deepseek, RAG, function calling…). Linguagem direta: "sabe o nome do cachorro", "acorda com pedido pronto pra separar", "Conecta com seu sistema (Bling, Tiny, planilha)"
Pricing público (/pricing)
- Tabela 3 tiers (Starter/Pro/Business com Pro destacado)
- ComparisonTable — 3 colunas: vek vs chatbot tradicional vs atendente humano (8 features, sem nomear concorrentes diretos)
- CostCalculator — interactive client component: salário CLT + headcount slider → economia mensal/anual + plano sugerido + CTA preselect
- Bônus 50% callout
- Footer com 6 chips discretos linkando pras
/pricing/vs/[slug]pages SEO
Páginas comparativas vs concorrentes (/pricing/vs/[slug])
src/lib/competitors.ts + dynamic route com generateStaticParams + generateMetadata. 6 concorrentes pesquisados (campo, fontes públicas 2026):
| slug | Categoria | Entry price |
|---|---|---|
| octadesk | fluxo predefinido | R$ 79 |
| socialhub | IA parcial | R$ 99 |
| blip (Take Blip) | enterprise | R$ 1.199 |
| zenvia | multicanal fluxo | R$ 40 sessões |
| chatguru | multi-user IA parcial | sob consulta |
| wati | internacional | USD 99/5 users |
Cada página: cards side-by-side preço/features + 5 vek advantages + seção "quando faz sentido escolher [X]" (sinal de honestidade) + calculadora reaproveitada + cross-links.
Stores (vector stores / multi-catálogo)
- Pages:
/stores,/stores/create - Mutations: thin wrappers sobre
apiClient.stores.* - Estado:
selectedStoreAtom(jotai persistido)
Agents
- Pages:
/agents,/agents/create,/agents/[id]/preview,/agents/[id]/settings - API: thin wrappers sobre
apiClient.agents.*. Toggle-active centralizado no backend. - Componentes: Industrial Linear redesign —
agents-client.tsx,create-agent-form.tsx,agent-type-select.tsx,knowledge-base-select.tsx,agent-chat.tsx,agent-settings-client.tsx,whatsapp-tester.tsx
Fluxo end-to-end (criar agente → conversar → fechar pedido)
/agents/create→ escolhe tipo, KB, persona, canaisapiClient.agents.create→ backend INSERT- Settings: ativa WhatsApp → cria instância Evolution → QR Code → user escaneia
- Produção: cliente WhatsApp → webhook
/api/webhooks/evolution→processWhatsAppMessage(LID-aware) →ensureLead→/chat→ resposta → reply via Evolution. Se mídia + ordemawaiting_proof→attachWhatsAppProofToOrder.
Leads (PR #48)
- Pages:
/leads,/leads/[id] - Lib:
ensureLead,enqueueExtraction(vek1-api/extract-leadDeepSeek JSON mode),buildLeadProfileSummary - API:
apiClient.leads.* - Industrial Linear redesign #57
Documents (KB)
- Pages:
/documents/[storeId] - API:
apiClient.documents.* - Embeddings via
lib/embeddings.ts→ POST${API}/embed(bge-m3 1024 dim)
Products & Upload (CSV wizard)
- Pages:
/products,/products/[id],/upload - Wizard 7 steps: upload → rename → edit → duplicates → save → embedding → completed
- API:
apiClient.products.*+upsert-by-productpra documents
Orders (PRs #50, #59, #60, #61)
- Pages:
/orders(SSE realtime),/orders/[id] - API:
apiClient.orders.* - Lifecycle:
draft → awaiting_proof → proof_received → confirmed → shipping → fulfilled
Pagamentos suportados
- PIX gateway (AbacatePay) — BR Code + QR; webhook
/api/webhooks/abacate-pay - PIX manual — comprovante via foto/PDF WhatsApp →
attachProofautomático - Cash on delivery — skip pagamento
Realtime
GET /api/orders/stream?store_id=...(SSE) + Postgres LISTEN/NOTIFY- Frontend
EventSourceatualiza tabela in-place
Function calling
sales_assistanttoolcreate_order(items, payment_method, customer_info)- Backend valida items vs products (rejeita slugs hallucinated)
- Lei Crítica no prompt: NUNCA "pedido criado" sem chamar create_order
Settings (PR #51) — Account/Company/Payment/Stock-sync
- Page:
/settings(billing migrado pra/billingdedicada em PR #78) - Sections (Section/Field/SaveRow primitives):
- Account — nome, email, foto MinIO
- Company — nome, slug, logo
- Store Payment — AbacatePay key, PIX expires, COD toggle, manual PIX
- Stock Sync — outbound URL+secret + inbound secret
Stock Sync (PR #62)
- Bidirectional: order_created → decrement; cancellation → restore; notifica ERP customer via webhook HMAC
- Inbound: ERP → vek1 via
POST /webhooks/stock-sync/{store_id}(HMAC validation)
WhatsApp / Evolution
- Cliente:
src/lib/evolution-instance.ts(fetch direto, semevolution-manager-librarylegada) - Handler:
src/lib/whatsapp-handler.ts—processWhatsAppMessagecom LID handling - Webhook:
POST /api/webhooks/evolution— nunca retorna 500 - Instance Settings:
/instance-settings+ tab em/agents/[id]/settings
Auth flows
/forgot-password+/reset-password(PR #72) — Resend via vek1-api webhook scope/logine/register— páginas simples sem checagem de sessão (PR #84, removeu redirect/banner over-engineered)
Dashboard / Stats
/dashboard— real viaapiClient.dashboard.*/client-stats— mock (mantido)/database-stats— real/token-usage—apiClient.tokenUsage.*
SEO
- Root layout metadata: title template, description PME, keywords BR (agente IA WhatsApp, PIX automático, etc), openGraph, twitter card, robots
- JSON-LD SoftwareApplication no
<body>com AggregateOffer (R$ 199-1.499) /sitemap.xmldinâmico (src/app/sitemap.ts) — home + pricing + 6 vs pages + auth pages/robots.txtdinâmico (src/app/robots.ts) — bloqueia rotas (internal) do crawl- Per-page metadata: landing, /pricing, /pricing/vs/[slug] com canonical + openGraph