Payment Events

Available webhook events and their payloads for payment processing.

Event Structure

All webhook events follow this structure:

interface WebhookEvent<T> {
  meta: {
    occured_at: string; // ISO 8601 timestamp when event occurred
    event_type: string; // Event type (e.g., "subscription.created")
    event_id: string;   // Unique event identifier (format: zelwhk_timestamp_random)
  };
  data: T; // Event-specific payload
}

Event Payloads

All payment events use the same normalized payload structure regardless of payment provider.

subscription.created or subscription.updated

{
  "meta": {
    "occured_at": "2024-01-01T12:00:00.000Z",
    "event_type": "subscription.created",
    "event_id": "zelwhk_abc123_def456"
  },
  "data": {
    "id": 123,
    "collectionMode": "automatic",
    "email": "[email protected]",
    "organizationId": "org_abc123",
    "canceledAt": null,
    "nextBilledAt": "2024-02-01T12:00:00.000Z",
    "pausedAt": null,
    "status": "active",
    "externalId": "sub_paddle123",
    "sandbox": false,
    "externalCustomerId": "cus_paddle456",
    "items": [
      {
        "productId": 1,
        "unitPrice": 2999,
        "currency": "USD",
        "planName": "Pro Plan",
        "externalPriceId": "pri_abc123",
        "externalProductId": "pro_def456",
        "quantity": 1
      }
    ],
    "customer": {
      "id": "cus_internal_789",
      "externalId": "cus_paddle456",
      "email": "[email protected]"
    },
    "answers": [
      {
        "answerData": { "value": 2 },
        "questionId": "6fef36cb-0823-41fd-8774-2d4f5d0a542c",
        "questionText": "",
        "conversionType": "answer.number"
      },
      {
        "answerData": { "values": ["qqqq", "qwe"] },
        "questionId": "b5d4170c-101b-42af-b2db-dd173f3b043c",
        "questionText": "",
        "conversionType": "answer.text"
      },
      {
        "answerId": "2",
        "answerText": "Bronze",
        "questionId": "4b88b9b2-9851-4e02-b9fc-9276e021f283",
        "questionText": "What is your rank?",
        "conversionType": "answer.single_choice"
      },
      {
        "answerData": {
          "answers": [
            { "answerId": "2", "answerText": "Bronze" },
            { "answerId": "3", "answerText": "Silver" }
          ]
        },
        "questionId": "84bb36fd-5034-4737-8ef6-5b6ee1325d39",
        "questionText": "",
        "conversionType": "answer.multiple_choice"
      },
      {
        "answerData": { "value": "[email protected]" },
        "questionId": "block-1753871709006-f4j7u0td2",
        "questionText": "",
        "conversionType": "answer.text"
      },
      {
        "answerData": { "value": "q" },
        "questionId": "c8323dd0-855c-4b2f-89c6-c1876e7acb5c",
        "questionText": "",
        "conversionType": "answer.text"
      }
    ],
    "fbp": "fb.1.1234567890123.987654321",
    "fbc": "fb.1.1678930714977.AbCdEfGhIjKlMnOpQrStUvWxYz"
  }
}

transaction.created or transaction.updated

{
  "meta": {
    "occured_at": "2024-01-01T12:00:00.000Z",
    "event_type": "transaction.created",
    "event_id": "zelwhk_xyz789_ghi012"
  },
  "data": {
    "id": 456,
    "billedAt": "2024-01-01T12:00:00.000Z",
    "externalId": "txn_paddle789",
    "subscriptionId": 123,
    "sandbox": false,
    "trackingSessionId": "sess_abc123",
    "productPriceAmount": 2999,
    "revisedAt": "2024-01-01T12:00:00.000Z",
    "status": "paid",
    "paymentMethodType": "card",
    "paymentMethodDetails": { "brand": "visa", "last4": "4242" },
    "totalAmountPaid": 2999,
    "paidCurrency": "USD",
    "totalAmount": 2999,
    "baseCurrency": "USD",
    "paymentProvider": "paddle",
    "customer": {
      "id": "cus_internal_789",
      "externalId": "cus_paddle456",
      "email": "[email protected]"
    },
    "answers": [
      {
        "answerData": { "value": 2 },
        "questionId": "6fef36cb-0823-41fd-8774-2d4f5d0a542c",
        "questionText": "",
        "conversionType": "answer.number"
      },
      {
        "answerData": { "values": ["qqqq", "qwe"] },
        "questionId": "b5d4170c-101b-42af-b2db-dd173f3b043c",
        "questionText": "",
        "conversionType": "answer.text"
      },
      {
        "answerId": "2",
        "answerText": "Bronze",
        "questionId": "4b88b9b2-9851-4e02-b9fc-9276e021f283",
        "questionText": "What is your rank?",
        "conversionType": "answer.single_choice"
      },
      {
        "answerData": {
          "answers": [
            { "answerId": "2", "answerText": "Bronze" },
            { "answerId": "3", "answerText": "Silver" }
          ]
        },
        "questionId": "84bb36fd-5034-4737-8ef6-5b6ee1325d39",
        "questionText": "",
        "conversionType": "answer.multiple_choice"
      },
      {
        "answerData": { "value": "[email protected]" },
        "questionId": "block-1753871709006-f4j7u0td2",
        "questionText": "",
        "conversionType": "answer.text"
      },
      {
        "answerData": { "value": "q" },
        "questionId": "c8323dd0-855c-4b2f-89c6-c1876e7acb5c",
        "questionText": "",
        "conversionType": "answer.text"
      }
    ],
    "fbp": "fb.1.1234567890123.987654321",
    "fbc": "fb.1.1678930714977.AbCdEfGhIjKlMnOpQrStUvWxYz"
  }
}

Facebook Pixel Tracking Data: fbp and fbc

  • fbp (Facebook browser cookie): Cookie value representing a unique browser/device identifier for attribution.

  • fbc (Facebook Click ID): URL parameter captured on initial ad click and stored in a first-party cookie to identify the ad click.

Both values are included in event payloads when available, enabling accurate Facebook Ads conversion tracking and attribution.

Available Event Types

All event types you can receive (same for Paddle and Stripe):

Event Type
Description

subscription.created

New subscription created

subscription.updated

Subscription details changed

transaction.created

New transaction recorded

transaction.updated

Transaction status changed

Event Delivery

If your endpoint fails to respond with a 2xx status code, we retry with a dynamic backoff schedule up to 60 attempts:

  • Attempts 1–20: every 3 minutes

  • Attempts 21–47: every 30 minutes

  • Attempts 48–60: every 2 hours

While events are generally delivered in order, you should:

  • Use event timestamps for ordering

  • Handle out-of-order events gracefully

  • Implement idempotency checks

Capturing User Input from Web Funnel

Our system captures user responses from interactive input components in the funnel. These answers are included in the event payload under an answers array. This allows you to associate payment or subscription events with the exact answers given by users during the funnel.

Example Payload with User Input Answers

{
  "meta": {
    "occured_at": "2025-08-09T06:49:11.140Z",
    "event_type": "transaction.updated",
    "event_id": "zelwhk_me3w9h5d_41590fd8"
  },
  "data": {
    "id": 935,
    "billedAt": null,
    "externalId": "in_1Ru6aQ4KHmBrVrd3rOjiBPNi",
    "subscriptionId": 952,
    "trackingSessionId": "tr_eeqg5lxv-0_0d136d86a405fc9386e4520ec004120583f420afe2f2d28bdefe094132dcc62c",
    "productPriceAmount": 100,
    "revisedAt": null,
    "status": "paid",
    "paymentMethodType": "card",
    "paymentMethodDetails": {
      "type": "card",
      "card": { "brand": "visa", "last4": "4242", "expMonth": 2, "expYear": 2028, "funding": "credit" }
    },
    "totalAmountPaid": 100,
    "paidCurrency": "USD",
    "totalAmount": 100,
    "baseCurrency": "USD",
    "paymentProvider": "stripe",
    "sandbox": true,
    "customer": {
      "id": "aa4b509f-85df-4fae-b22d-f021dba4652b",
      "externalId": "cus_Spm89X98bNBaqI",
      "email": "[email protected]"
    },
    "answers": [
      { "conversionType": "answer.number", "questionId": "6fef36cb-0823-41fd-8774-2d4f5d0a542c", "questionText": "", "answerData": { "value": 2 } },
      { "conversionType": "answer.text", "questionId": "b5d4170c-101b-42af-b2db-dd173f3b043c", "questionText": "", "answerData": { "values": ["Kids", "Gen Alpha"] } },
      { "conversionType": "answer.single_choice", "questionId": "4b88b9b2-9851-4e02-b9fc-9276e021f283", "questionText": "What is your rank?", "answerId": "2", "answerText": "Gold" },
      { "conversionType": "answer.multiple_choice", "questionId": "84bb36fd-5034-4737-8ef6-5b6ee1325d39", "questionText": "", "answerData": { "answers": [ { "answerId": "2", "answerText": "Bronze" }, { "answerId": "3", "answerText": "Silver" } ] } },
      { "conversionType": "answer.text", "questionId": "block-1753871709006-f4j7u0td2", "questionText": "", "answerData": { "value": "[email protected]" } },
      { "conversionType": "answer.text", "questionId": "c8323dd0-855c-4b2f-89c6-c1876e7acb5c", "questionText": "", "answerData": { "value": "Test" } }
    ]
  }
}

Summary

  • All webhook events share a standard structure with meta and data fields.

  • Payment events (subscription and transaction) are normalized across providers.

  • User input answers from quizzes/funnels are included under data.answers.

  • This enables linking user responses with payment and subscription data.

Last updated