Pular para o conteúdo principal

Webhooks de Assinatura

Eventos relacionados ao ciclo de vida das assinaturas recorrentes na FastPay.

Eventos Disponíveis

EventoDescrição
subscription.createdEnviado quando uma nova assinatura é criada
subscription.activatedEnviado quando a assinatura é ativada (primeira cobrança bem-sucedida)
subscription.renewedEnviado quando uma cobrança recorrente é processada com sucesso
subscription.payment_failedEnviado quando uma cobrança recorrente falha
subscription.cancelledEnviado quando a assinatura é cancelada
subscription.pausedEnviado quando a assinatura é pausada
subscription.expiredEnviado quando a assinatura expira

Payload

subscription.created

Enviado imediatamente após a criação de uma nova assinatura.

Com validateCard: true (padrão):

{
"id": "evt_2RhQg9M7ZCg3X3nMb9W1kX8Q",
"event": "subscription.created",
"data": {
"id": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"status": "pending_card_activation",
"customerId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"subscriptionPlanId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"cardTokenId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"billingDay": 15,
"createdAt": "2024-01-15T10:30:00.000Z"
}
}

Com validateCard: false (cobrança falhou):

{
"id": "evt_2RhQg9M7ZCg3X3nMb9W1kX8Q",
"event": "subscription.created",
"data": {
"id": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"status": "pending_activation",
"customerId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"subscriptionPlanId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"cardTokenId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"billingDay": 15,
"createdAt": "2024-01-15T10:30:00.000Z"
}
}

subscription.activated

Enviado quando a primeira cobrança é processada com sucesso e a assinatura se torna ativa.

{
"id": "evt_2RhQg9M7ZCg3X3nMb9W1kX8Q",
"event": "subscription.activated",
"data": {
"id": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"status": "active",
"customerId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"subscriptionPlanId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"billingDay": 15,
"currentPeriodStart": "2024-01-15T10:30:00.000Z",
"currentPeriodEnd": "2024-02-15T10:30:00.000Z",
"charge": {
"id": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"billingCycle": 1,
"amount": 99.90,
"currency": "BRL",
"status": "paid"
},
"activatedAt": "2024-01-15T10:30:00.000Z"
}
}

subscription.renewed

Enviado quando uma cobrança recorrente é processada com sucesso.

{
"id": "evt_2RhQg9M7ZCg3X3nMb9W1kX8Q",
"event": "subscription.renewed",
"data": {
"id": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"status": "active",
"customerId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"subscriptionPlanId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"billingDay": 15,
"currentPeriodStart": "2024-02-15T10:30:00.000Z",
"currentPeriodEnd": "2024-03-15T10:30:00.000Z",
"charge": {
"id": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"billingCycle": 2,
"amount": 99.90,
"currency": "BRL",
"status": "paid"
}
}
}

subscription.payment_failed

Enviado quando uma cobrança recorrente falha.

{
"id": "evt_2RhQg9M7ZCg3X3nMb9W1kX8Q",
"event": "subscription.payment_failed",
"data": {
"id": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"status": "active",
"customerId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"subscriptionPlanId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"billingDay": 15,
"charge": {
"id": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"billingCycle": 2,
"amount": 99.90,
"currency": "BRL",
"status": "failed",
"failureReason": "insufficient_funds"
},
"retryCount": 1,
"nextRetryAt": "2024-02-16T10:30:00.000Z"
}
}

subscription.cancelled

Enviado quando a assinatura é cancelada (pelo usuário ou sistema).

Cancelamento por arrependimento (até 7 dias):

{
"id": "evt_2RhQg9M7ZCg3X3nMb9W1kX8Q",
"event": "subscription.cancelled",
"data": {
"id": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"status": "cancelled",
"cancellationType": "regret",
"refunded": true,
"refundId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"accessRevokedAt": "2024-01-16T10:30:00.000Z",
"reason": "Cliente solicitou cancelamento",
"cancelledAt": "2024-01-16T10:30:00.000Z"
}
}

Cancelamento regular (após 7 dias):

{
"id": "evt_2RhQg9M7ZCg3X3nMb9W1kX8Q",
"event": "subscription.cancelled",
"data": {
"id": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"status": "cancelled",
"cancellationType": "regular",
"refunded": false,
"accessRevokedAt": "2024-02-15T10:30:00.000Z",
"reason": "Cliente solicitou cancelamento",
"cancelledAt": "2024-01-20T10:30:00.000Z"
}
}

subscription.paused

Enviado quando a assinatura é pausada temporariamente.

{
"id": "evt_2RhQg9M7ZCg3X3nMb9W1kX8Q",
"event": "subscription.paused",
"data": {
"id": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"status": "paused",
"customerId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"subscriptionPlanId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"pausedAt": "2024-01-20T10:30:00.000Z"
}
}

subscription.expired

Enviado quando a assinatura expira (por falhas consecutivas ou término do plano).

{
"id": "evt_2RhQg9M7ZCg3X3nMb9W1kX8Q",
"event": "subscription.expired",
"data": {
"id": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"status": "expired",
"customerId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"subscriptionPlanId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"expirationReason": "payment_failures",
"expiredAt": "2024-02-20T10:30:00.000Z"
}
}

Exemplo de Implementação

app.post('/webhooks/fastpay', (req, res) => {
const { id, event, data } = req.body;

switch (event) {
case 'subscription.created':
console.log(`Nova assinatura criada: ${data.id}`);
break;

case 'subscription.activated':
console.log(`Assinatura ativada: ${data.id}`);
// Liberar acesso ao serviço
// Enviar email de boas-vindas
break;

case 'subscription.renewed':
console.log(`Assinatura renovada: ${data.id}, ciclo ${data.charge.billingCycle}`);
// Atualizar período de acesso
break;

case 'subscription.payment_failed':
console.log(`Falha no pagamento: ${data.id}`);
// Notificar cliente sobre falha
// Sugerir atualização de cartão
break;

case 'subscription.cancelled':
console.log(`Assinatura cancelada: ${data.id}`);
if (data.cancellationType === 'regret') {
// Acesso revogado imediatamente
// Estorno já foi processado
} else {
// Acesso continua até accessRevokedAt
}
break;

case 'subscription.paused':
console.log(`Assinatura pausada: ${data.id}`);
// Pausar acesso ao serviço
break;

case 'subscription.expired':
console.log(`Assinatura expirada: ${data.id}`);
// Revogar acesso ao serviço
// Enviar email de reativação
break;

default:
console.log(`Evento desconhecido: ${event}`);
}

res.status(200).send('OK');
});

Ciclo de Vida da Assinatura

Tipos de Cancelamento

TipoCondiçãoEstornoAcesso
regretAté 7 dias após criaçãoAutomáticoRevogado imediatamente
regularApós 7 diasNão há estornoContinua até fim do período

Nota: O período de arrependimento de 7 dias segue a legislação brasileira de defesa do consumidor.