Developer integration

7Stamp Webhooks

Available

Push every loyalty event from 7Stamp to your own systems in real time. No polling and no scheduled API calls. Events arrive as HTTPS POST requests within seconds of happening.

Use webhooks to keep your CRM, ERP, or custom backend in sync with what is happening on the loyalty side: who joined, who got a stamp, who redeemed a voucher, who triggered a birthday gift, and who became inactive. Then your systems decide what to do with that data.

What you can do with webhooks

Webhooks are the outbound side of the integration stack. They mirror customer and reward activity into the systems you already trust for sales, service, analytics, and messaging.

Mirror loyalty history into your CRM

Every stamp, voucher, birthday, and inactivity trigger lands on the customer record in your CRM. You see the full loyalty timeline next to sales, calls, and tickets without logging into 7Stamp.

Trigger your own messaging stack

When a customer redeems a voucher, send a thank-you SMS from your existing SMS gateway. When a customer hits the goal, post a celebration in Slack. When someone becomes inactive, route the case to your account manager.

Power analytics and reconciliation

Stream events into your BI tool, warehouse, or reconciliation pipeline. Match voucher redemptions against POS receipts and calculate loyalty ROI in your own metrics.

Card event types

SCAN — A card received a scan/stamp action.
REWARD_EARNED — A reward was earned on the card.
VOUCHER_ISSUED — A voucher was issued.
VOUCHER_REDEEMED — A voucher was redeemed.
LOTTERY_WIN — A lottery resulted in a win.
DELIVERY_INSERT — A delivery-insert flow was recorded.
CARD_JOINED — A customer joined a card.
CARD_CAMPAIGN — A card campaign event occurred.
BIRTHDAY_GREETING — A birthday greeting event occurred.
ADMIN_VOUCHER_ISSUE — An administrator issued a voucher.
CARD_ADDED_TO_WALLET — A customer added the card to their wallet.
CARD_REMOVED_FROM_WALLET — A customer removed the card from their wallet.

Build a safe webhook receiver

Acknowledge after durable handling

Your endpoint should accept HTTPS POST, validate the request shape, persist or queue the event, then return a successful 2xx response. Do not make a slow CRM or messaging call before the acknowledgement if it can be queued safely.

Correlate with External ID

Every related event can carry the External ID and optional External Source that you used when creating or scanning the card. Use this pair to update your own CRM, POS, or order record without guessing from a name or email.

Make delivery idempotent

Store a durable processing key or event fingerprint before triggering side effects. If your receiver sees the same delivery again, it should not add a duplicate CRM note, voucher, or message. Treat the endpoint URL as a secret.

Example event payload shape

Copy this into your automation step json
{
  "entity": "card_event",
  "action": "created",
  "entity_id": 707,
  "event_id": "8f05e58decec48e09d328f0edebbacf6",
  "profile_id": 2,
  "profile_name": "Your Business",
  "profile_lang": "en",
  "data": {
    "event_type": "SCAN",
    "scanned_at": "2026-10-01T09:19:24.179424",
    "user_card_id": 10,
    "card_template_id": 14,
    "card_template_name": "Collect your stamps!",
    "stamps_added": 3,
    "stamps_before": 1,
    "stamps_after": 4,
    "amount": null,
    "external_order_id": "ORDER-1001",
    "workplace": { "id": 4, "name": "Bar Counter" },
    "device_type": null,
    "external_id": "odoo_contact_8821",
    "external_source": "odoo",
    "issued_vouchers": [
      {
        "id": 174,
        "unique_code": "100425813507",
        "stamp_number": 4,
        "issued_at": "2026-10-01T09:19:24.191836",
        "expires_at": "2027-01-01T23:59:59",
        "status": "ACTIVE",
        "voucher_template_id": 58,
        "voucher_description": "Free coffee",
        "voucher_image_url": "https://..."
      }
    ],
    "achieved_goals": [],
    "user": {
      "id": 2,
      "name": "Anna",
      "full_name": "Anna Smith",
      "email": "anna@example.com",
      "telegram_chat_id": null,
      "telegram_username": null,
      "whatsapp_phone": null,
      "birth_date": null
    }
  }
}

Configure and test a webhook

01

Create an HTTPS endpoint in your backend, CRM integration layer, Make webhook, or Zapier Catch Hook. Make sure you control the destination before copying its URL.

02

In 7Stamp Admin, open Stamp Cards → API & Integrations → Webhooks.

03

Add the endpoint URL. The webhook receives every card event of the profile, so filter by data.event_type in your receiver.

04

Save the profile settings, then trigger a disposable test scan or card action to produce an event.

05

Inspect the received payload. Match External ID and External Source to the expected record and confirm the receiver returns a successful response.

06

Enable CRM, voucher, or messaging side effects only after you have replay-safe handling and monitoring for failures.

No-code options: Make and Zapier

In Make, use Webhooks → Custom webhook to generate a receiving URL and paste it into the 7Stamp profile. In Zapier, use Webhooks by Zapier → Catch Hook for the same purpose. The 7Stamp profile owns the subscription because the current API does not expose automatic webhook registration endpoints.

Security and delivery contract

Use the Webhooks section of the public OpenAPI reference as the source for the current payload schema. The body is an envelope: profile_id and profile_name name the 7Stamp profile, event_id identifies the event, and the card event itself is in data (for a Make or Zapier URL the key is card_event). Every delivery is signed in one header, X-Webhook-Signature: t=…,s=…. Compute HMAC-SHA256 with your webhook secret over t plus the raw request body, hex-encode it and compare it with s; the secret is on the webhook's page in 7Stamp Admin. Use X-Webhook-Event-Id to drop repeated deliveries: a retry is signed again with a new t. You can also protect the endpoint with Basic Auth. Require HTTPS and keep the receiver URL out of public logs.

Frequently asked questions

Can I select only certain webhook events?

No. A 7Stamp webhook receives every card event of the profile. Filter by data.event_type in your receiver; in Make and Zapier the event comes under card_event, so filter by card_event.event_type.

How do I connect webhooks to Make or Zapier?

Create the receiving webhook in Make or a Catch Hook in Zapier, copy the generated URL, then paste it into the 7Stamp profile's webhook settings and send a test event.

How should I match an event to my CRM contact?

Use data.external_id and, when present, data.external_source: they come back in every webhook for cards you issued through the API with your own ID. A customer who took the card themselves has no External ID, so match them by data.user.email. An Apple “Hide My Email” address is a relay address, not the one in your CRM.

How do I check that a webhook came from 7Stamp?

Split the X-Webhook-Signature header into t and s, compute HMAC-SHA256 with the webhook secret from 7Stamp Admin over t plus the raw request body, hex-encode it and compare it with s. Take t exactly as sent and the body as the raw bytes received, before any JSON parsing. Drop a delivery whose X-Webhook-Event-Id you have already processed: a retry is signed again with a new t.

Next step

Ready to send the first card event?

Create a receiver, paste its HTTPS URL into the profile, run a disposable scan, and validate the matching External ID before enabling downstream automation.