Developer
Test ModeTest Mode Sign In Get started
DeveloperDeveloper / WebhooksWebhooks

WebhooksWebhooks

BEEP! sendet HTTP POST-Requests an deine URL, wenn relevante Events in deinen Stores passieren, in Echtzeit. Alle 11 Event-Typen sind hier dokumentiert.

BEEP! sends HTTP POST requests to your URL when relevant events occur in your stores, in real time. All 11 event types are documented here.

ÜbersichtOverview

EventTriggerTier
checkout.completed Kunde hat erfolgreich bezahlt GROW
checkout.started Checkout-Prozess begonnen GROW
checkout.cancelled Checkout abgebrochen oder Timeout GROW
offer.published Angebot wurde aktiviert GO
offer.expired Angebot ist abgelaufen GO
offer.clicked Nutzer hat ein Angebot geöffnet GO
store.checkin Kunde hat eingecheckt GROW
store.followed Neuer Follower für den Store DISCOVER
dm.received Direkt-Nachricht von einem Kunden GO
clickcollect.order Neue Click & Collect Bestellung GROW
clickcollect.picked_up Bestellung wurde abgeholt GROW

Webhook-Endpoint einrichtenSet Up Webhook Endpoint

Konfiguriere deine Webhook-URL im Developer Dashboard. Du kannst mehrere Endpoints registrieren und pro Endpoint auswählen, welche Event-Typen geliefert werden sollen.

Configure your webhook URL in the Developer Dashboard. You can register multiple endpoints and choose which event types each endpoint receives.

Node.js: Minimaler Webhook-Endpoint
import express from 'express'; import crypto from 'crypto'; const app = express(); app.post('/webhooks/beep', express.raw({type: 'application/json'}), (req, res) => { // 1. Signatur verifizieren const signature = req.headers['x-beep-signature']; const expectedSig = crypto .createHmac('sha256', process.env.BEEP_WEBHOOK_SECRET) .update(req.body) .digest('hex'); if (signature !== `sha256=${expectedSig}`) { return res.status(401).send('Invalid signature'); } // 2. Event parsen const event = JSON.parse(req.body); // 3. Event verarbeiten switch (event.type) { case 'checkout.completed': handleCheckoutCompleted(event.data); break; case 'offer.clicked': handleOfferClicked(event.data); break; // ... } // 4. SCHNELL mit 200 antworten (max. 5 s) res.status(200).json({ received: true }); });

Signatur-VerifikationSignature Verification

Jeder Webhook-Request enthält den Header x-beep-signature mit einem HMAC-SHA256-Hash des Request-Bodys. Verifiziere diesen Hash, bevor du Events verarbeitest.

Every webhook request contains the header x-beep-signature with an HMAC-SHA256 hash of the request body. Verify this hash before processing events.

HeaderFormatBeispiel
x-beep-signature sha256={hex} sha256=7d38cdd...
x-beep-event string checkout.completed
x-beep-delivery-id uuid wh_del_abc123
x-beep-timestamp unix ms 1740645720000
⚠️
Raw Body verwenden!: Für die Signatur-Verifikation muss der rohe, unveränderliche Request-Body (als Buffer) gehashed werden. Nicht der geparste JSON-String. In Express: express.raw() statt express.json().

Delivery & Retry-LogikDelivery & Retry Logic

1. Versuch
sofort
+5 Min
2. Versuch
+30 Min
3. Versuch
+2 Std
4. (letzter) Versuch

BEEP! betrachtet eine Delivery als erfolgreich, wenn dein Server einen 2xx-Statuscode innerhalb von 5 Sekunden zurückgibt. Bei Timeout oder Non-2xx wird nach obigem Schema wiederholt. Alle Delivery-Versuche sind im Dashboard einsehbar.

BEEP! considers a delivery successful when your server returns a 2xx status code within 5 seconds. On timeout or non-2xx it retries according to the schedule above. All delivery attempts are visible in the Dashboard.

ℹ️
Idempotenz: Dieselbe Delivery-ID (x-beep-delivery-id) kann bei Retries erneut auftreten. Speichere verarbeitete Delivery-IDs und gib bei Duplikaten trotzdem 200 zurück.

checkout.completed

GROW

Wird ausgelöst, wenn ein Stripe-Checkout erfolgreich abgeschlossen wird und der Zahlungseingang bestätigt ist.

Fired when a Stripe checkout is successfully completed and payment receipt is confirmed.

JSON: checkout.completed Payload
{ "id": "evt_bk_JqKp3nLaM7", "type": "checkout.completed", "created": 1740645720000, "livemode": true, "apiVersion": "2026-01", "data": { "object": "purchase", "id": "txn_mP4kR9nX", "sessionId": "sess_k7aB3xQm9wPz", "storeId": "store_abc123", "storeName": "Frische Ecke Mitte", "userId": "usr_42", "totalCent": 437, "currency": "EUR", "itemCount": 3, "items": [ { "name": "Bionade Holunder 0,5L", "ean": "4104420044052", "priceUnit": 129, "quantity": 2, "vat": 7 } ], "receiptUrl": "https://beep-c6786.web.app/receipt/txn_mP4kR9nX", "stripeSessionId": "cs_live_...", "status": "SUCCESS", "completedAt": 1740645720000 } }

checkout.started

GROW

Kunde hat den Checkout eingeleitet (Stripe Checkout Page geöffnet). Zahlungseingang noch nicht bestätigt.

Customer has initiated checkout (Stripe Checkout Page opened). Payment receipt not yet confirmed.

JSON: checkout.started Payload
{ "id": "evt_bk_BqPp0mXaL3", "type": "checkout.started", "created": 1740645680000, "livemode": true, "data": { "object": "purchase", "id": "txn_mP4kR9nX", "sessionId": "sess_k7aB3xQm9wPz", "storeId": "store_abc123", "itemCount": 3, "totalCent": 437, "currency": "EUR", "checkoutUrl": "https://checkout.stripe.com/pay/cs_live_...", "status": "PENDING_PAYMENT" } }

checkout.cancelled

GROW

Checkout wurde abgebrochen (Nutzer verlässt Checkout-Page) oder ist nach 30 Minuten abgelaufen.

Checkout was cancelled (user leaves checkout page) or expired after 30 minutes.

JSON: checkout.cancelled Payload
{ "id": "evt_bk_CnQq1oYbM4", "type": "checkout.cancelled", "created": 1740647280000, "livemode": true, "data": { "object": "purchase", "id": "txn_mP4kR9nX", "sessionId": "sess_k7aB3xQm9wPz", "storeId": "store_abc123", "totalCent": 437, "reason": "user_abandoned", // "user_abandoned" | "timeout" | "payment_failed" "status": "CANCELLED" } }

offer.published

GO
JSON: offer.published Payload
{ "id": "evt_bk_DoPr2pZcN5", "type": "offer.published", "created": 1740600000000, "data": { "object": "offer", "offerId": "off_xyz789", "storeId": "store_abc123", "title": "Bionade zum Sparpreis", "productEan": "4104420044052", "discountPrice": 0.99, "originalPrice": 1.29, "discountPercent": 23, "scope": "LOCAL", "validFrom": "2026-03-01T00:00:00.000Z", "validUntil": "2026-03-07T23:59:59.000Z", "status": "ACTIVE" } }

offer.expired

GO
JSON: offer.expired Payload
{ "id": "evt_bk_EpQs3qAdO6", "type": "offer.expired", "created": 1740945599000, "data": { "object": "offer", "offerId": "off_xyz789", "storeId": "store_abc123", "title": "Bionade zum Sparpreis", "totalClicks": 342, "totalFavorites": 89, "status": "EXPIRED" } }

offer.clicked

GO
JSON: offer.clicked Payload
{ "id": "evt_bk_FqRt4rBeP7", "type": "offer.clicked", "created": 1740700000000, "data": { "object": "offer", "offerId": "off_xyz789", "storeId": "store_abc123", "totalClicks": 128 // Gesamtstand nach diesem Klick } }

store.checkin

GROW
JSON: store.checkin Payload
{ "id": "evt_bk_GrSu5sCfQ8", "type": "store.checkin", "created": 1740645640000, "data": { "object": "session", "sessionId": "sess_k7aB3xQm9wPz", "storeId": "store_abc123", "userId": "usr_42", "checkedInAt": 1740645640000, "estimatedItems": null // bekannt erst nach Scan } }

store.followed

DISCOVER
JSON: store.followed Payload
{ "id": "evt_bk_HsTv6tDgR9", "type": "store.followed", "created": 1740700000000, "data": { "object": "follow", "storeId": "store_abc123", "userId": "usr_77", "totalFollowers": 848 } }

dm.received

GO
JSON: dm.received Payload
{ "id": "evt_bk_ItUw7uEhS0", "type": "dm.received", "created": 1740720000000, "data": { "object": "message", "messageId": "msg_abc456", "storeId": "store_abc123", "senderId": "usr_99", "preview": "Habt ihr noch die Bio-Eier?...", // max. 80 Zeichen "sentAt": 1740720000000 } }

clickcollect.order

GROW
JSON: clickcollect.order Payload
{ "id": "evt_bk_JuVx8vFiT1", "type": "clickcollect.order", "created": 1740750000000, "data": { "object": "order", "orderId": "ord_xyz123", "storeId": "store_abc123", "userId": "usr_42", "items": [ { "name": "Bio-Eier 10er", "ean": "4005999134741", "quantity": 2, "priceUnit": 349, "vat": 7 } ], "totalCent": 698, "currency": "EUR", "pickupSlot": "2026-03-01T14:00:00.000Z", "status": "CONFIRMED" } }

clickcollect.picked_up

GROW
JSON: clickcollect.picked_up Payload
{ "id": "evt_bk_KvWy9wGjU2", "type": "clickcollect.picked_up", "created": 1740754000000, "data": { "object": "order", "orderId": "ord_xyz123", "storeId": "store_abc123", "userId": "usr_42", "pickedUpAt": 1740754000000, "status": "PICKED_UP" } }

Mehr erkunden

API Reference Alle Endpoints im Detail DatenformateData Formats Produkt-, Angebots-, Transaktions-Schemas Sandbox Events live simulieren