Developer
Test ModeTest Mode Sign In Get started
DeveloperDeveloper / WebhooksWebhooks

WebhooksWebhooks

Echtzeit-Events per HTTP POST. 26 Event-Typen, HMAC-signiert.

Real-time events via HTTP POST. 26 event types, HMAC-signed.

ÜbersichtOverview

Event Trigger Tier
checkout.completed Kunde hat erfolgreich bezahlt GROW
checkout.started Checkout-Prozess begonnen GROW
checkout.cancelled Checkout abgebrochen oder Timeout GROW
securityTag.deactivated Sicherungen deaktiviertSecurity tags deactivated 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 GO
clickcollect.picked_up Bestellung wurde abgeholt GO
product.created Neues Produkt via API angelegt DISCOVER
product.bulk_imported Bulk-Import abgeschlossen DISCOVER
integration.pos.synced POS-Sync abgeschlossen GROW
integration.pos.pushed Daten an POS gepusht GROW
integration.erp.synced ERP-Sync abgeschlossen GROW
integration.erp.pushed Daten an ERP gepusht GROW
integration.psp.configured PSP konfiguriert GROW
payment.created Zahlung initiiert GROW
payment.refunded Erstattung initiiert GROW
loyalty.points_earned Punkte gutgeschriebenPoints earned GO
loyalty.points_redeemed Punkte eingelöstPoints redeemed GO
loyalty.checkin_earned Punkte via GPS Check-inPoints via GPS check-in GO
loyalty.qr_earned Punkte via QR-Code ScanPoints via QR code scan GO
loyalty.tier_changed Tier-Level geändertTier level changed PRIME
loyalty.external_synced Externe Loyalty synchronisiertExternal loyalty synced PRIME

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 !== 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.

Header Format Beispiel
x-beep-signature {hex} 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 Checkout erfolgreich abgeschlossen wird und der Zahlungseingang bestätigt ist.

Fired when a 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": 417, "currency": "EUR", "itemCount": 3, "items": [ { "name": "Bio-Vollmilch 3,5%", "ean": "4000000000001", "priceUnit": 149, "quantity": 2, "vat": 7 } ], "receiptUrl": "https://beep-c6786.web.app/receipt/txn_mP4kR9nX", "checkoutSessionId": "cs_live_...", "status": "SUCCESS", "completedAt": 1740645720000, // Nur bei Stores mit Produktsicherungen: "securityTagMode": "manual", // "none" | "manual" | "station" | "rfid" "securityTagStatus": "pending" // "pending" | "deactivated" } }

securityTag.deactivated

GROW

Wird ausgelöst, wenn Produktsicherungen für einen Scan & Go Kauf erfolgreich deaktiviert oder entfernt wurden (via Station oder RFID).

Fired when security tags for a Scan & Go purchase have been successfully deactivated or removed (via station or RFID).

JSON: securityTag.deactivated Payload
{ "id": "evt_st_Rm3Xp5kN7z", "type": "securityTag.deactivated", "created": 1740645780000, "livemode": true, "data": { "purchaseId": "txn_mP4kR9nX", "storeId": "store_abc123", "method": "station", // "station" | "rfid" | "manual" "deactivatedItems": ["4000000000001"], "deactivatedAt": 1740645780000 } }

checkout.started

GROW

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

Customer has initiated checkout (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.example.com/pay/session_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": "Bio-Vollmilch Sonderangebot", "productEan": "4000000000001", "discountPrice": 1.19, "originalPrice": 1.49, "discountPercent": 20, "scope": "LOCAL", "validFrom": "2026-03-01T00:00:00.000Z", "validTo": "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": "Bio-Vollmilch Sonderangebot", "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

GO
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

GO
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" } }

product.created

DISCOVER

Wird ausgelöst, wenn ein neues Produkt via API angelegt wird (insertProduct).

Fired when a new product is created via API (insertProduct).

JSON: product.created Payload
{ "id": "evt_bk_LwXz0xHkV3", "type": "product.created", "created": 1740800000000, "livemode": true, "data": { "object": "product", "productId": "prod_abc123", "ean": "4000000000001", "name": "Bio-Vollmilch 3,5%", "brand": "BioHof", "price": 1.49, "vat": 7, "category": "Molkerei", "storeId": "store_abc123" } }

product.bulk_imported

DISCOVER

Wird ausgelöst, wenn ein Bulk-Import abgeschlossen ist (bulkImportProducts).

Fired when a bulk product import completes (bulkImportProducts).

JSON: product.bulk_imported Payload
{ "id": "evt_bk_MxYa1yIlW4", "type": "product.bulk_imported", "created": 1740801000000, "livemode": true, "data": { "object": "import", "storeId": "store_abc123", "importedCount": 142, "updatedCount": 37, "skippedCount": 3, "status": "COMPLETED" } }

integration.pos.synced

GROW

POS-Katalog-Sync erfolgreich abgeschlossen (syncPOS).

POS catalogue sync completed successfully (syncPOS).

JSON: integration.pos.synced Payload
{ "id": "evt_bk_NyZb2zJmX5", "type": "integration.pos.synced", "created": 1740810000000, "livemode": true, "data": { "object": "integration", "storeId": "store_abc123", "provider": "korona", "syncedProducts": 315, "updatedProducts": 12, "status": "SUCCESS", "completedAt": 1740810000000 } }

integration.pos.pushed

GROW

Transaktionsdaten wurden erfolgreich ins POS-System zurückgespielt (pushToPOS).

Transaction data successfully pushed back to the POS system (pushToPOS).

JSON: integration.pos.pushed Payload
{ "id": "evt_bk_OzAc3aKnY6", "type": "integration.pos.pushed", "created": 1740811000000, "livemode": true, "data": { "object": "integration", "storeId": "store_abc123", "provider": "korona", "pushedTransactions": 8, "status": "SUCCESS" } }

integration.erp.synced

GROW

ERP-Sync erfolgreich abgeschlossen (syncERP).

ERP sync completed successfully (syncERP).

JSON: integration.erp.synced Payload
{ "id": "evt_bk_PaBd4bLoZ7", "type": "integration.erp.synced", "created": 1740820000000, "livemode": true, "data": { "object": "integration", "storeId": "store_abc123", "provider": "lexoffice", "syncedEntries": 47, "status": "SUCCESS" } }

integration.erp.pushed

GROW

Transaktionsdaten wurden erfolgreich ins ERP-System zurückgespielt (pushToERP).

Transaction data successfully pushed back to the ERP system (pushToERP).

JSON: integration.erp.pushed Payload
{ "id": "evt_bk_QbCe5cMpA8", "type": "integration.erp.pushed", "created": 1740821000000, "livemode": true, "data": { "object": "integration", "storeId": "store_abc123", "provider": "lexoffice", "pushedEntries": 23, "status": "SUCCESS" } }

integration.psp.configured

GROW

Ein PSP (Zahlungsanbieter) wurde erfolgreich konfiguriert (configurePSP).

A payment service provider was successfully configured (configurePSP).

JSON: integration.psp.configured Payload
{ "id": "evt_bk_RcDf6dNqB9", "type": "integration.psp.configured", "created": 1740830000000, "livemode": true, "data": { "object": "integration", "storeId": "store_abc123", "provider": "stripe", "status": "ACTIVE", "configuredAt": 1740830000000 } }

payment.created

GROW

Eine Zahlung wurde über den konfigurierten PSP initiiert (processPayment).

A payment was initiated via the configured PSP (processPayment).

JSON: payment.created Payload
{ "id": "evt_bk_SdEg7eOrC0", "type": "payment.created", "created": 1740840000000, "livemode": true, "data": { "object": "payment", "paymentId": "pay_abc789", "storeId": "store_abc123", "amountCent": 2499, "currency": "EUR", "provider": "stripe", "status": "PENDING" } }

payment.refunded

GROW

Eine Erstattung wurde über den konfigurierten PSP initiiert (refundPayment).

A refund was initiated via the configured PSP (refundPayment).

JSON: payment.refunded Payload
{ "id": "evt_bk_TeEh8fPsD1", "type": "payment.refunded", "created": 1740841000000, "livemode": true, "data": { "object": "payment", "paymentId": "pay_abc789", "refundId": "ref_xyz456", "storeId": "store_abc123", "refundedCent": 2499, "currency": "EUR", "provider": "stripe", "status": "REFUNDED" } }

Mehr erkundenExplore more

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