Lifecycle de status
PENDING → ACTIVE → INACTIVE/BLOCKED — máquina de estados do produto e o que cada transição significa.
Todo Product percorre uma máquina de estados desde a criação até a vida ativa.
Estados
| Status | Significado | O que muda |
|---|---|---|
PENDING | Recém-criado, aguardando revisão automática | Não pode ser cobrado |
ACTIVE | Aprovado, cobrança permitida | Visível em payment links, hosted checkout, lista pública |
INACTIVE | Você desativou via API | Vendas pausadas, histórico preservado, CustomerSubscriptions ativas continuam |
REJECTED | Não passou na revisão | Veja motivo no dashboard. Crie produto novo, não tente reativar |
BLOCKED | Bloqueado pelo time de risco | Fraude, alto chargeback rate, ou denúncia. Resolução via suporte |
Revisão automática (PENDING → ACTIVE/REJECTED)
A criação de Product é processada em < 5s na maioria dos casos. A revisão checa:
- Palavras proibidas (claims médicas, "ganhe X em Y dias")
landingPageacessível e respondendo 200- Categoria coerente com nome/descrição
namesem caracteres especiais ou markup malicioso- Score de risco do merchant (histórico de chargebacks, idade da conta)
Se o produto não puder ser auto-aprovado, ele entra em fila de revisão manual (até 24h em horário comercial).
Reagindo a transições
Webhooks emitidos:
// product.activated
{ "type": "product.activated", "data": { "object": { "id": "prd_xyz", "status": "ACTIVE" } } }
// product.rejected
{
"type": "product.rejected",
"data": {
"object": { "id": "prd_xyz", "status": "REJECTED" },
"rejection": {
"reason": "MEDICAL_CLAIMS",
"details": "Trecho 'cura definitiva da diabetes' viola política."
}
}
}
// product.blocked
{
"type": "product.blocked",
"data": {
"object": { "id": "prd_xyz", "status": "BLOCKED" },
"block": {
"reason": "HIGH_CHARGEBACK_RATIO",
"ratio": 0.034,
"review_until": "2026-05-15T00:00:00Z"
}
}
}Desativar/reativar manualmente
import { randomUUID } from 'node:crypto';
const updateStatus = (status: 'INACTIVE' | 'ACTIVE') =>
fetch(`https://prometheus.zhex.io/v1/products/${productId}`, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.ZHEX_SECRET_KEY}`,
'Idempotency-Key': randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({ status }),
});
// Pausar
await updateStatus('INACTIVE');
// Reativar
await updateStatus('ACTIVE');Importante: desativar produto não cancela CustomerSubscriptions ativas. Cobranças recorrentes continuam até cancelamento explícito. Para parar tudo, cancele o Subscription (plano) também.
REJECTED → recriar
Produtos REJECTED ficam imutáveis. Você não consegue editar e reativar. Fluxo correto:
- Ler
rejection.detailsno webhook ou dashboard. - Criar produto novo com correções aplicadas.
- Migrar
paymentLinkIds[], cupons e referências para o novoproductId.
BLOCKED → desbloqueio
BLOCKED exige revisão humana do time de risco. Após resolução:
- Sucesso → volta para
ACTIVEe webhookproduct.unblockedé disparado. - Falha → permanece
BLOCKEDindefinidamente. Pode escalar via suporte se houver dado novo.
Não reabra produto bloqueado criando idêntico. A Zhex usa fingerprint de (name + landingPage + merchant) para detectar reabertura — gera flag automática e pode bloquear a conta inteira.
Atualizado em