Skip to main content

Documentation Index

Fetch the complete documentation index at: https://help.kajabi.com/llms.txt

Use this file to discover all available pages before exploring further.

This article walks through the changes made to Kajabi’s outbound webhooks as a result of the introduction of Multiple Order Bumps. If your workflows rely on the Payment Succeeded or Purchase Created webhooks — for example, through a Zapier integration or a custom integration — please review the changes below to ensure your automations continue to work as expected.

How Order Bumps Are Now Processed

One-time primary offers and one-time order bumps are now grouped into a single payment transaction. This applies to all checkouts with one-time pricing, including offers with a single order bump. Previously, each offer in an order was charged as its own separate transaction. This is a meaningful improvement for customers: the full price is shown at checkout in one place, and they’re charged a single amount. It also reduces payment processing costs, since the fixed per-transaction fee is only applied once rather than once per offer. However, because transactions are now structured differently, webhooks that carry transactions or offer data have changed accordingly. Review the sections below to understand what’s different.

Payment Succeeded Webhook

The Payment Succeeded webhook fires each time a payment is received. With the introduction of multiple order bumps, primary offers and order bumps that are one-time pricing are now combined into a single transaction, which means only one event is sent per transaction, regardless of how many offers were purchased.

What changed

Previously, if a customer purchased a primary offer and an order bump, two separate transactions were created, and two payment_succeeded events were fired. Now, a single transaction is created covering all items with one-time pricing in the order, and one payment_succeeded event is fired. The offer details — including offer ID, external title, internal title, and pricing type — will contain comma-separated values when the transaction includes more than one offer. This applies whether the order includes one bump or several — any checkout where a one-time primary offer and one-time bump is selected will now produce a single transaction and a single Payment Succeeded event. If you are consuming this webhook in Zapier or a custom integration and referencing any of these offer fields, you will now receive comma-separated values where you previously received a single value.
Note: This applies to one-time pricing only. Subscription and payment plan bumps are charged as separate transactions and continue to fire their own Payment Succeeded, unchanged.

Before (single offer, single transaction)

{
 "offer": {
   "id": 11111,
   "title": "Main Course",
   "internal_title": "Main Course - Internal",
   "type": "one-time"
 },
 "member": {
   "id": 99999,
   "email": "member@example.com",
   "name": "Jane Smith",
   "first_name": "Jane",
   "last_name": "Smith"
 },
 "payment_transaction": {
   "id": 55555,
   "created_at": "2025-04-01T10:00:00Z",
   "currency": "USD",
   "amount_paid": 5000,
   "amount_paid_decimal": 50.00,
   "subtotal": 5000,
   "subtotal_decimal": 50.00,
   "discount_amount": 0,
   "discount_amount_decimal": 0.0,
   "coupon_code": null,
   "payment_method": "visa",
   "payment_processor": "Kajabi Payments"
 }
}

After (primary offer + two order bumps, single transaction)

{
 "offer": {
   "id": "11111,22222,33333",
   "title": "Main Course,Order Bump 1,Order Bump 2",
   "internal_title": "Main Course - Internal,Order Bump 1 - Internal,Order Bump 2 - Internal",
   "type": "one-time,one-time,one-time"
 },
 "member": {
   "id": 99999,
   "email": "member@example.com",
   "name": "Jane Smith",
   "first_name": "Jane",
   "last_name": "Smith"
 },
 "payment_transaction": {
   "id": 55555,
   "created_at": "2025-04-01T10:00:00Z",
   "currency": "USD",
   "amount_paid": 9000,
   "amount_paid_decimal": 90.00,
   "subtotal": 9000,
   "subtotal_decimal": 90.00,
   "discount_amount": 0,
   "discount_amount_decimal": 0.0,
   "coupon_code": null,
   "payment_method": "visa",
   "payment_processor": "Kajabi Payments"
 }
}

Purchase Created Webhook

The Purchase Created webhook continues to fire one event per offer purchased. If a customer’s order included the primary offer and two order bumps, you will still see three separate events come through on this webhook — the same behavior as before.

What changed

While the number of events has not changed, the transaction amount fields now reflect the total value of the entire transaction, not the value of the individual offer in that event. Each event also includes an offer-level amount field showing the price specific to that offer. If you are using this webhook to track revenue — for example, summing amount_paid across records — you must use the offer-level amount field instead of the transaction-level amount, or you will be overcounting. Again, this applies whether the order includes one bump or several — any checkout where a one-time primary offer and one-time bump is selected will produce a single transaction and all Purchase Created events for that transaction will reflect the full transaction total rather than the individual offer amount. 
Note: This applies to one-time pricing only. Subscription and payment plan bumps are charged as separate transactions and continue to fire their own Purchase Created events, unchanged.

Example

A customer purchases a $50 primary offer and two $20 order bumps. Total transaction value: $90. You will receive three purchase events. Each will look like this:

Event 1: Primary offer ($50)

{
 "id": 10001,
 "offer": {
   "id": 11111,
   "title": "Main Course"
    "internal_title": "Main Course",
    "quantity": 1,
    "unit_cost": 5000,
    "unit_cost_decimal": "50.00",
    "subtotal": 5000,
    "subtotal_decimal": "50.00",
    "total_amount": 5000,
    "total_amount_decimal": "50.00"
 },
 "member": {
   "id": 99999,
   "email": "member@example.com",
   "name": "Jane Smith",
   "first_name": "Jane",
   "last_name": "Smith"
 },
 "transaction": {
   "transaction_id": 55555,
   "transaction_created_at": "2025-04-01T10:00:00Z",
   "offer_type": "one-time",
   "subtotal": 9000,
   "subtotal_decimal": 90.00,
   "amount_paid": 9000,
   "amount_paid_decimal": 90.00,
   "currency": "USD",
   "payment_method": "visa",
   "payment_processor": "Kajabi Payments",
   "coupon_code": null
 },
 "opt_in": false,
 "trial": false
}

Event 2: Order Bump 1 ($20)

{
 "id": 10002,
 "offer": {
   "id": 22222,
   "title": "Order Bump 1"
    "internal_title": "Order Bump 1",
    "quantity": 1,
    "unit_cost": 2000,
    "unit_cost_decimal": "20.00",
    "subtotal": 2000,
    "subtotal_decimal": "20.00",
    "total_amount": 2000,
    "total_amount_decimal": "20.00
 },
 "transaction": {
   "transaction_id": 55555,
   "subtotal": 9000,
   "subtotal_decimal": 90.00,
   "amount_paid": 9000,
   "amount_paid_decimal": 90.00,
   "currency": "USD",
   ...
 }
}

Event 3: Order Bump 2 ($20)

{
 "id": 10003,
 "offer": {
   "id": 33333,
   "title": "Order Bump 2"
    "internal_title": "Order Bump 2",
    "quantity": 1,
    "unit_cost": 2000,
    "unit_cost_decimal": "20.00",
    "subtotal": 2000,
    "subtotal_decimal": "20.00",
    "total_amount": 2000,
    "total_amount_decimal": "20.00
 },
 "transaction": {
   "transaction_id": 55555,
   "subtotal": 9000,
   "subtotal_decimal": 90.00,
   "amount_paid": 9000,
   "amount_paid_decimal": 90.00,
   "currency": "USD",
   ...
 }
}
Important: All three events share the same transaction_id and the same amount_paid of 9000 ($90.00). To avoid overcounting revenue, use offer.total_amount / offer.total_amount_decimal   — which reflects the price of the individual offer — rather than transaction.amount_paid.