> ## 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.

# Webhook and API changes with Multiple Order Bumps

This article walks through the changes made to Kajabi's outbound webhooks as a result of the introduction of [<u>Multiple Order Bumps</u>](https://help.kajabi.com/add-order-bumps-to-an-offer#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>
  **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.
</Note>

### Before (single offer, single transaction)

```text theme={null}
{
 "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)

```text theme={null}
{
 "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>
  **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.
</Note>

### 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)**

```text theme={null}
{
 "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)**

```text theme={null}
{
 "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)

```text theme={null}
{
 "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",
   ...
 }
}
```

<Warning>
  **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`.
</Warning>

## **API Transactions Endpoint**

With Multiple Order Bumps, a single transaction can now include more than one offer. As a result, the `offer` relationship on the [Transactions endpoint](https://help.kajabi.com/api-reference/transactions/transaction-details) has changed.

### **What changed**

* The singular `offer` field will no longer return data for transactions that include bundled offers
* A new `purchases` relationship is now available, which returns all offer purchases associated with a transaction

If you're using the Kajabi API and referencing the `offer` field in your integration, review the [API changelog](https://help.kajabi.com/api-reference/changelog#june-10-2026) for implementation details.

###
