Webhooks
Ta emot realtidshändelser från TableApp direkt till din server.
Webhooks
Webhooks låter TableApp skicka HTTP-anrop till din server när saker händer – t.ex. när en order stängs, en betalning genomförs eller en produkt uppdateras. Slipp polling.
Registrera en webhook
POST /v1/webhooks
Content-Type: application/json
{
"url": "https://yourapp.com/webhooks/tableapp",
"events": ["order.completed", "payment.succeeded"],
"secret": "ditt-egna-hemliga-värde"
}Svar 201 Created
{
"id": "wh_01HXK8N2P3Q4",
"url": "https://yourapp.com/webhooks/tableapp",
"events": ["order.completed", "payment.succeeded"],
"created_at": "2025-06-01T10:00:00Z",
"status": "active"
}Händelsetyper
Ordrar
| Händelse | Beskrivning |
|---|---|
order.created | En ny order öppnades |
order.updated | Orderns rader ändrades |
order.completed | Ordern stängdes (betald) |
order.cancelled | Ordern avbeställdes |
Betalningar
| Händelse | Beskrivning |
|---|---|
payment.succeeded | Betalning genomförd |
payment.failed | Betalning misslyckades |
payment.refunded | Återbetalning genomförd |
Meny
| Händelse | Beskrivning |
|---|---|
product.created | Ny produkt skapad |
product.updated | Produkt uppdaterad (pris, namn etc.) |
product.deleted | Produkt borttagen |
Event & Biljetter
| Händelse | Beskrivning |
|---|---|
ticket.sold | Biljett köpt |
ticket.refunded | Biljett återbetald |
checkin.completed | Gäst checkad in |
Payload-format
Alla webhooks levereras som POST med Content-Type: application/json:
{
"id": "evt_01HXK8N2P3Q4R5S6",
"type": "order.completed",
"created_at": "2025-06-01T18:45:22Z",
"data": {
"id": "ord_01HXK8N2P3Q4R5S6T7U8V9W0X",
"status": "completed",
"total": 29800,
"completed_at": "2025-06-01T18:45:20Z"
}
}Verifiera signaturen
Varje anrop inkluderar headern Tableapp-Signature som du alltid ska verifiera innan du behandlar payload:
Tableapp-Signature: t=1717263922,v1=a3f9c2d1e4b5...Formatet är t=<unix-timestamp>,v1=<HMAC-SHA256>.
Exempel i Node.js
import crypto from 'crypto';
function verifySignature(
payload: string,
header: string,
secret: string,
): boolean {
const parts = Object.fromEntries(header.split(',').map(p => p.split('=')));
const timestamp = parts['t'];
const signature = parts['v1'];
const signed = `${timestamp}.${payload}`;
const expected = crypto
.createHmac('sha256', secret)
.update(signed)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature, 'hex'),
Buffer.from(expected, 'hex'),
);
}Avvisa gamla händelser
Kontrollera att t inte är äldre än 5 minuter för att skydda mot replay-attacker.
Retry-logik
Om din server svarar med annat än 2xx försöker TableApp igen:
| Försök | Väntetid |
|---|---|
| 1 | Omedelbart |
| 2 | 1 minut |
| 3 | 10 minuter |
| 4 | 1 timme |
| 5 | 6 timmar |
Efter 5 misslyckade försök markeras webhook-händelsen som failed. Du kan se och manuellt skicka om misslyckade händelser under Inställningar API Webhooks Händelselogg.
Testa webhooks lokalt
Använd Cloudflare Tunnel eller ngrok för att exponera din lokala server:
cloudflared tunnel --url http://localhost:3000Använd den genererade URL:en som webhook-endpoint i sandbox-miljön.