Webhooks
Webhooks permitem que voce receba notificacoes HTTP em tempo real quando eventos ocorrem na sua conta GoConverso. Use-os para sincronizar dados com sistemas externos, disparar automacoes ou construir integracoes personalizadas.
Os webhooks do GoConverso sao alimentados pelo Stripe para eventos de pagamento e por Supabase Edge Functions para eventos da plataforma. Cada tipo tem um fluxo de configuracao diferente.
Como os webhooks funcionam
Quando um evento ocorre (como um pagamento bem-sucedido ou um novo agendamento), o GoConverso envia uma requisicao HTTP POST para a URL do endpoint configurado com um payload JSON descrevendo o evento.
Evento GoConverso --> HTTP POST --> Seu Endpoint
(payload JSON)Seu endpoint deve:
- Aceitar requisicoes
POST - Retornar um codigo de status
2xxem ate 30 segundos - Verificar a assinatura do webhook para confirmar a autenticidade
- Processar o evento de forma assincrona se exigir computacao pesada
Webhooks do Stripe
Os webhooks do Stripe lidam com todos os eventos relacionados a pagamentos. O GoConverso processa estes atraves de uma edge function dedicada (stripe-webhook) que valida assinaturas, atualiza o status de assinatura e registra transacoes.
Eventos do Stripe suportados
| Evento | Descricao |
|---|---|
checkout.session.completed | Um cliente completou uma sessao do Stripe Checkout |
customer.subscription.created | Uma nova assinatura foi criada |
customer.subscription.updated | Uma assinatura foi modificada (mudanca de plano, renovacao) |
customer.subscription.deleted | Uma assinatura foi cancelada |
invoice.payment_succeeded | Um pagamento recorrente foi bem-sucedido |
invoice.payment_failed | Um pagamento recorrente falhou |
payment_intent.succeeded | Um pagamento avulso foi concluido |
Configurando webhooks do Stripe
Obter a URL do endpoint de webhook
A URL do endpoint de webhook do Stripe do GoConverso e:
https://<project-id>.supabase.co/functions/v1/stripe-webhookAdicionar o endpoint no Painel do Stripe
- Va para o Painel do Stripe
- Clique em Add endpoint
- Insira a URL do seu webhook
- Selecione os eventos listados acima
- Clique em Add endpoint
Copiar o segredo de assinatura
Apos criar o endpoint, o Stripe fornece um segredo de assinatura (whsec_...). Armazene-o como variavel de ambiente:
STRIPE_WEBHOOK_SECRET=whsec_1234567890abcdefVerificar a configuracao
Envie um evento de teste a partir do Painel do Stripe para confirmar que seu endpoint recebe e processa corretamente.
A edge function stripe-webhook deve ser implantada com a flag --no-verify-jwt, ja que o Stripe envia requisicoes sem um JWT do Supabase. A funcao verifica a autenticidade usando a assinatura do webhook do Stripe.
Payload do webhook do Stripe
Aqui esta um exemplo de payload para um evento checkout.session.completed:
{
"id": "evt_1OqY4z2eZvKYlo2C8G9vU1qA",
"object": "event",
"type": "checkout.session.completed",
"data": {
"object": {
"id": "cs_test_a1b2c3d4",
"object": "checkout.session",
"customer": "cus_Px7k9abcde",
"customer_email": "user@example.com",
"mode": "subscription",
"payment_status": "paid",
"status": "complete",
"subscription": "sub_1OqY4z2eZvKYlo2C",
"metadata": {
"user_id": "550e8400-e29b-41d4-a716-446655440000",
"plan": "plus"
},
"amount_total": 4900,
"currency": "usd"
}
},
"created": 1706540400
}Verificacao de assinatura
O GoConverso verifica cada webhook do Stripe recebido usando o cabecalho stripe-signature. Isso impede que requisicoes falsificadas cheguem a sua logica de processamento.
import Stripe from 'stripe'
const stripe = new Stripe(Deno.env.get('STRIPE_SECRET_KEY'))
const signature = request.headers.get('stripe-signature')
const body = await request.text()
const event = stripe.webhooks.constructEvent(
body,
signature,
Deno.env.get('STRIPE_WEBHOOK_SECRET')
)
// event is now verified and safe to processWebhooks de notificacao de agendamento
O GoConverso pode enviar notificacoes via webhook quando eventos de agendamento ocorrem. Estes sao entregues atraves de Supabase Edge Functions.
Eventos de agendamento suportados
| Evento | Gatilho |
|---|---|
booking.created | Um novo compromisso e agendado por um cliente |
booking.confirmed | O profissional confirma um agendamento pendente |
booking.cancelled | Um agendamento e cancelado por qualquer uma das partes |
booking.rescheduled | A data ou horario de um agendamento e alterado |
booking.reminder | Um lembrete automatico e enviado (configuravel) |
Payload do evento de agendamento
{
"event": "booking.created",
"timestamp": "2026-02-01T14:30:00.000Z",
"data": {
"booking_id": "b7e8f9a0-1234-5678-abcd-ef0123456789",
"professional_id": "550e8400-e29b-41d4-a716-446655440000",
"client_name": "John Smith",
"client_email": "john@example.com",
"client_phone": "+1-555-0100",
"service": {
"id": "svc_abc123",
"name": "Haircut",
"price": 35.00,
"duration": 30,
"currency": "USD"
},
"scheduled_at": "2026-02-05T10:00:00.000Z",
"status": "confirmed",
"notes": "First time client, prefers short on sides"
}
}Construindo um receptor de webhook
Aqui esta um exemplo minimo de um receptor de webhook em Node.js:
const express = require('express')
const app = express()
app.use(express.json())
app.post('/webhooks/goconverso', (req, res) => {
const event = req.body
switch (event.event) {
case 'booking.created':
console.log('New booking:', event.data.booking_id)
// Sync to your CRM, send a Slack notification, etc.
break
case 'booking.cancelled':
console.log('Booking cancelled:', event.data.booking_id)
// Update your calendar, notify staff, etc.
break
default:
console.log('Unhandled event:', event.event)
}
// Always return 200 to acknowledge receipt
res.status(200).json({ received: true })
})
app.listen(3000, () => {
console.log('Webhook receiver running on port 3000')
})Politica de retentativa
Se o seu endpoint nao retornar um codigo de status 2xx, o GoConverso tenta reenviar o webhook:
| Tentativa | Atraso |
|---|---|
| 1a retentativa | 1 minuto |
| 2a retentativa | 5 minutos |
| 3a retentativa | 30 minutos |
| 4a retentativa | 2 horas |
| 5a retentativa | 24 horas |
Apos 5 tentativas falhas, o webhook e marcado como falho. Voce pode visualizar entregas falhas e tenta-las novamente manualmente a partir do Painel do Stripe.
Testando webhooks localmente
Durante o desenvolvimento, use o Stripe CLI para encaminhar webhooks para seu ambiente local:
# Install and login to the Stripe CLI
stripe login
# Forward events to your local Supabase edge function
stripe listen --forward-to localhost:54321/functions/v1/stripe-webhook
# Trigger a test event
stripe trigger checkout.session.completedAo testar localmente, o Stripe CLI fornece um segredo de assinatura de webhook temporario. Use este valor para sua variavel de ambiente STRIPE_WEBHOOK_SECRET local.
Melhores praticas de seguranca
- Sempre verifique assinaturas — Nunca processe um webhook sem antes verificar o cabecalho de assinatura. Isso impede que atacantes enviem eventos falsos para o seu endpoint.
- Use HTTPS — Endpoints de webhook devem usar HTTPS em producao. Endpoints HTTP nao receberao eventos.
- Responda rapidamente — Retorne uma resposta
2xxem ate 30 segundos. Se o processamento levar mais tempo, confirme o recebimento imediatamente e processe de forma assincrona. - Trate duplicatas — Webhooks podem ser entregues mais de uma vez. Use o
iddo evento para deduplicar. - Registre tudo — Armazene os payloads brutos dos webhooks para depuracao. Isso e inestimavel ao solucionar problemas de integracao.
Para mais informacoes sobre integracao de pagamentos, veja a documentacao do Stripe Checkout . Para autenticacao da API, veja o guia de Autenticacao.