Webhooks

Receba notificações em tempo real sobre compras, renovações e cancelamentos de assinaturas.

TL;DR

Você configura a URL do Paywallo na App Store Connect / Google Play Console uma única vez. A partir daí, a Apple e o Google enviam notificações diretamente ao Paywallo, que processa e repassa eventos normalizados para o seu endpoint — sem precisar entender o formato proprietário de cada marketplace.

Como funciona a arquitetura

O Paywallo atua como intermediário entre os marketplaces e o seu servidor. O fluxo é:

App Store / Google Play→ Paywallo→ Seu servidor
  • Apple / Google enviam notificações brutas (JWS/Pub-Sub) para o endpoint do Paywallo configurado por você
  • Paywallo valida, decodifica e normaliza os dados em um formato JSON consistente
  • Seu servidor recebe um POST com o payload normalizado — mesma estrutura independente do marketplace

Você não precisa lidar com o formato de JWS da Apple ou Pub/Sub do Google. O Paywallo faz essa abstração.

Configuração do App Store

App Store Connect - Server Notifications V2

Configure webhooks para receber notificações das transações de assinatura do App Store

1

Acesse App Store Connect

Faça login em appstoreconnect.apple.com com sua conta de desenvolvedor

2

Navegue até as Notificações

Vá para seu app → App Information → App Store Server Notifications

3

Selecione a Versão 2

Marque "Version 2 Notifications" como o tipo de notificação que deseja usar

4

Cole a URL do Webhook

Copie a URL do webhook do painel do Paywallo e cole no campo de URL

/api/webhooks/apple/{appKey}
5

Salve as Configurações

Clique em "Save" para confirmar a configuração

Configuração do Google Play

Google Play Console - Real-time Developer Notifications

Configure webhooks para receber notificações das transações de assinatura do Google Play

1

Acesse Google Play Console

Faça login em play.google.com/console com sua conta de desenvolvedor

2

Navegue até Monetização

Vá para Monetization setup → Real-time developer notifications

3

Cole a URL do Webhook

Copie a URL do webhook do painel do Paywallo e cole no campo de URL

/api/webhooks/google/{appKey}
4

Selecione os Tópicos

Escolha os tópicos de notificação que deseja receber:

  • • SUBSCRIPTIONS_TOPIC (recomendado)
  • • ONE_TIME_PRODUCTS_TOPIC (opcional)
5

Salve as Configurações

Clique em "Save" para confirmar a configuração

Payload de Exemplo

Evento: subscription_renewed

Todos os eventos do Paywallo seguem o mesmo envelope JSON — só o campo event e os campos de data variam por tipo:

{
  "event": "subscription_renewed",
  "timestamp": "2024-11-15T14:32:00.000Z",
  "data": {
    "userId": "usr_9kXmQ2pL4nR8vT1w",
    "productId": "com.seuapp.premium.annual",
    "transactionId": "2000000123456789",
    "originalTransactionId": "2000000098765432",
    "expiresAt": "2025-11-15T14:32:00.000Z",
    "purchasedAt": "2024-11-15T14:32:00.000Z",
    "priceUsd": 49.99,
    "currency": "USD",
    "store": "apple",
    "environment": "production"
  }
}

Handler Node.js / Express

Recebendo e validando webhooks

Configure um endpoint POST no seu servidor e valide a assinatura HMAC-SHA256 para garantir que a requisição veio do Paywallo. O segredo (PAYWALLO_WEBHOOK_SECRET) está disponível em Configurações → Webhooks no dashboard.

import express from 'express';
import crypto from 'crypto';

const app = express();
app.use(express.json());

app.post('/webhooks/paywallo', (req, res) => {
  // 1. Valide a assinatura do Paywallo
  const signature = req.headers['x-paywallo-signature'];
  const body = JSON.stringify(req.body);
  const expected = crypto
    .createHmac('sha256', process.env.PAYWALLO_WEBHOOK_SECRET)
    .update(body)
    .digest('hex');

  if (signature !== `sha256=${expected}`) {
    return res.status(401).json({ error: 'Assinatura inválida' });
  }

  // 2. Processe o evento
  const { event, data } = req.body;

  switch (event) {
    case 'subscription_renewed':
      // Estender acesso do usuário
      await db.users.update(data.userId, {
        subscriptionExpiresAt: data.expiresAt,
        status: 'active',
      });
      break;

    case 'subscription_cancelled':
      // Marcar para expirar ao fim do período pago
      await db.users.update(data.userId, { status: 'cancelling' });
      break;

    case 'subscription_expired':
      await db.users.update(data.userId, { status: 'expired' });
      break;
  }

  // 3. Responda com 200 em até 5 segundos
  res.status(200).json({ received: true });
});

Retry e Timeout

  • Timeout: Seu endpoint deve responder com HTTP 200 em até 5 segundos. Respostas lentas são tratadas como falha.
  • Tentativas: Em caso de falha (timeout ou status ≠ 2xx), o Paywallo retenta 3 vezes com backoff exponencial: 30s → 5min → 30min.
  • Idempotência: Use o transactionId para detectar duplicatas — o mesmo evento pode ser entregue mais de uma vez em caso de retry.
  • Processamento assíncrono: Responda 200 imediatamente e processe em background (fila, worker) para não exceder o timeout.

Eventos de Webhook Recebidos

Estes são os eventos que você receberá via webhook quando as ações ocorrem

EventoDescrição
Compra InicialQuando um usuário faz sua primeira compra ou assina um produto
RenovaçãoAssinatura renovada automaticamente no período de faturamento
CancelamentoUsuário cancelou sua assinatura
ReembolsoCompra ou renovação foi reembolsada ao usuário
Mudança de PreçoO preço da assinatura foi alterado para renovações futuras
Problema de CobrançaFalha no pagamento ou outro problema de cobrança detectado

Sincronização de Dados

Como os Webhooks Sincronizam Dados

Quando o Paywallo recebe um webhook de compra, renovação ou cancelamento, ele automaticamente sincroniza os dados com seu usuário no painel:

  • Histórico de Compra: Cada compra é registrada e rastreada para análise e auditoria
  • Status da Assinatura: O status atual é atualizado em tempo real (ativa, renovando, cancelada, etc.)
  • Próxima Renovação: Data da próxima cobrança é mantida sincronizada
  • Acesso aos Recursos: Automaticamente concedido ou revogado baseado no status da assinatura

Notas Importantes

  • URLs únicas: Cada aplicativo tem sua própria URL de webhook com um appKey único. Não compartilhe essas URLs.
  • Segurança: Mantenha suas URLs de webhook seguras. Elas contêm informações sensíveis do seu aplicativo.
  • Teste em Sandbox: Configure webhooks em ambiente de sandbox antes de ativar em produção.
  • Validação de assinatura: Valide o header x-paywallo-signature (HMAC-SHA256) em cada requisição. O segredo está em Configurações → Webhooks.

Dicas de Boas Práticas

  • Monitore Entregas: Verifique regularmente o status de entrega dos webhooks no painel do Paywallo
  • Implemente Retry: Configure lógica de retry em sua aplicação para lidar com falhas de entrega
  • Mantenha Sincronizado: Use webhooks como fonte de verdade para status de assinatura
  • Logs Detalhados: Registre todas as notificações de webhook para auditoria e debugging
Paywallo | Analytics, Gestão de Paywalls e Feature Flags