Esquema
| Campo | Tipo | Descrição |
|---|
planId | UUIDv7 | Identificador único |
externalRef | string | ID do produto no Stripe (único) |
name | string | Nome do plano, máx 255 |
description | text | Descrição do plano |
features | array | Objetos PlanFeature |
highlight | boolean | Plano destacado (padrão false) |
status | enum | ACTIVE, INACTIVE |
createdBy | UUIDv7 | Criador |
createdAt | datetime | Criação |
updatedBy | UUIDv7 | Último atualizador |
updatedAt | datetime | Última atualização |
deletedBy | UUIDv7? | Quem deletou |
deletedAt | datetime? | Soft delete |
PlanFeature
| Campo | Tipo | Descrição |
|---|
description | string | Descrição da feature |
type | enum | INCLUDE, NOT_INCLUDE, DEFAULT |
Cada PlanFeature descreve uma capacidade visível ao cliente na página de pricing. O tipo INCLUDE indica que está inclusa, NOT_INCLUDE que não está disponível naquele plano, e DEFAULT que é padrão em todos os planos.
Relacionamentos
Esquema PlanInterval
| Campo | Tipo | Descrição |
|---|
planIntervalId | UUIDv7 | Identificador único |
planId | UUIDv7 | FK para Plan |
externalRef | string | ID do price no Stripe (único) |
interval | enum | MONTHLY, QUARTERLY, SEMIANNUALLY, YEARLY |
amount | integer | Preço em centavos |
currency | enum | USD, BRL, EUR |
status | enum | ACTIVE, INACTIVE |
Regras de Negócio
- A combinação plano + intervalo deve ser única
- Criado com status ACTIVE, todos os intervalos ACTIVE
- Sincronizado com Stripe (product + prices)
- Intervalos podem ser desativados/reativados/deletados independentemente
Ao criar um plano, todos os intervalos são automaticamente sincronizados como prices no Stripe. Cada intervalo gera um price independente, permitindo ativar/desativar periodicidades sem afetar as demais.
Não é possível alterar o amount de um PlanInterval após criação — é necessário desativar o intervalo existente e criar um novo. Isso garante consistência com os prices do Stripe.
Exemplo
{
"planId": "019525fd-7e40-7c5a-b2d8-4e6f8a0c2e4a",
"externalRef": "prod_R8kLmN2pQ4wX",
"name": "Profissional",
"description": "Plano para equipes em crescimento",
"status": "ACTIVE",
"highlight": true,
"features": [
{ "description": "Até 50 usuários", "type": "INCLUDE" },
{ "description": "10 agentes de IA", "type": "INCLUDE" },
{ "description": "Suporte prioritário", "type": "INCLUDE" },
{ "description": "SSO / SAML", "type": "NOT_INCLUDE" }
],
"intervals": [
{
"planIntervalId": "019525fd-8a10-7d3b-a1c9-5f7e9b0d3f5b",
"externalRef": "price_1PqR2sT4uV6wX8yZ",
"interval": "MONTHLY",
"amount": 29900,
"currency": "BRL",
"status": "ACTIVE"
},
{
"planIntervalId": "019525fd-9b20-7e4c-b2d0-6a8f0c1e4a6c",
"externalRef": "price_2QrS3tU5vW7xY9zA",
"interval": "YEARLY",
"amount": 299900,
"currency": "BRL",
"status": "ACTIVE"
}
],
"createdBy": "019525fc-1234-7a1b-8c2d-3e4f5a6b7c8d",
"createdAt": "2026-01-10T08:00:00Z",
"updatedBy": "019525fc-1234-7a1b-8c2d-3e4f5a6b7c8d",
"updatedAt": "2026-01-10T08:00:00Z"
}