docs

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

StatusSignificadoO que muda
PENDINGRecém-criado, aguardando revisão automáticaNão pode ser cobrado
ACTIVEAprovado, cobrança permitidaVisível em payment links, hosted checkout, lista pública
INACTIVEVocê desativou via APIVendas pausadas, histórico preservado, CustomerSubscriptions ativas continuam
REJECTEDNão passou na revisãoVeja motivo no dashboard. Crie produto novo, não tente reativar
BLOCKEDBloqueado pelo time de riscoFraude, 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")
  • landingPage acessível e respondendo 200
  • Categoria coerente com nome/descrição
  • name sem 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:

  1. Ler rejection.details no webhook ou dashboard.
  2. Criar produto novo com correções aplicadas.
  3. Migrar paymentLinkIds[], cupons e referências para o novo productId.

BLOCKED → desbloqueio

BLOCKED exige revisão humana do time de risco. Após resolução:

  • Sucesso → volta para ACTIVE e webhook product.unblocked é disparado.
  • Falha → permanece BLOCKED indefinidamente. 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.

Esta página foi útil?

Atualizado em

Nesta página