# See which Kajabi offers actually made money this period

> Pick any date range and see gross revenue, orders, refunds, and average order value for every Kajabi offer, then drill into the exact sales behind each number.

- Workflow type: app
- Services: Kajabi, Google Sheets
- Categories: Finance, Operations
- Published: 2026-08-31

## What it does

- Pick any date range and get one row per offer and product with gross revenue, order count, the new versus recurring split, refund and cancellation rate, and average order value.
- Click any offer to open the individual sales behind that total, right down to the specific transactions that moved the number.
- A second tab lists every cancelled and refunded purchase in the range, so you can see exactly where money is leaking back out.
- Press Explain this period and an assistant compares your range against the one before it, names the two or three offers driving the swing, says whether it came from volume, price, or churn, and writes a short plain English review inside the app while logging a snapshot row per offer to a Google Sheets tracker.

## What you'll need

- A Kajabi account with the Public API turned on. It is included on the Pro plan or available as a paid add-on, and only owners or subowners can create the connection.
- A Google account and a spreadsheet you want to keep the running month by month history in.
- If you run more than one Kajabi site, knowing which site the numbers should cover.

## Prompt

Build me an app that answers the question Kajabi's own analytics tab will not: which of my offers actually made money in a given period, and how much of that money stayed. I open the app, pick a date range at the top, and the main view gives me a table with one row per offer and per product, showing gross revenue, order count, the split between new and recurring revenue, refund and cancellation rate, and average order value. I want to be able to sort that table by any column, because the offer with the biggest revenue is not always the one with the healthiest numbers.

The handler builds this table itself rather than relying on any single summary endpoint. Use List Offers and List Offer's Products to learn which products belong to which offer, List Products for the product catalog, and List Orders plus List Purchases across the selected date range as the transaction data. Roll all of it up server side into the per offer and per product figures. Every one of these list endpoints is paginated, so the handler must page through with page[number] and page[size] and keep following links.next until it comes back null, otherwise the totals will be quietly short. Use sort=-created_at where recency matters. If the account has more than one site, pass filter[site_id] so the numbers are scoped to a single site instead of silently blending brands.

Clicking any offer row drills into the individual orders behind that number. This detail view lists the orders in the range with their customer, date, and amount, and uses Get Order Details and Get Transaction Details so I can see exactly which transactions moved the total. If a number in the summary table looks wrong or surprising, I should be able to click it and reach the specific transactions that produced it without leaving the app.

A second tab shows what is leaking: every cancelled and refunded purchase in the selected range, pulled with List Purchases and enriched with Get Purchase Details, showing the offer, the customer, the amount, and when it happened. This is the view I open when the gross number looks fine but the net does not.

Add an Explain this period button that kicks off a background agent. The agent recomputes the same rollup for the comparison period, compares it against the selected range, and identifies the two or three offers driving the swing in either direction. For each of those it works out whether the change came from volume (more or fewer orders), price (a different average order value), or churn (more cancellations and refunds), and then writes a short plain English business review back into the app, where it is displayed alongside the table. Write it for a business owner, not an analyst: what changed, which offers caused it, and why.

When that agent finishes, it also appends a snapshot row per offer to a Google Sheets tracker using Append Values, capturing the period start and end, offer name, gross revenue, order count, refund and cancellation rate, and average order value. That way I accumulate a running month by month history outside Kajabi that survives independently of the app.

Two rules to bake in throughout. First, every monetary amount Kajabi returns is in cents, including price_in_cents and amount_in_cents, so convert to real currency before anything is displayed, written into the review, or appended to the spreadsheet. Never show a raw cents value. Second, the comparison period defaults to the immediately preceding range of the same length, so a 30 day selection compares against the previous 30 days and a single month compares against the month before it. Let me override the comparison range if I want to, but that default is what should load.

## How to customize

- Change the date range that loads by default when you open the app, and the comparison period the written review is measured against.
- Sort or filter the table the way you think about the business, for example by revenue, refund rate, or order count, and hide columns you do not use.
- Point the history tracker at a different spreadsheet or tab, and choose which figures get saved on each snapshot.

## FAQ

### How is this different from the analytics tab inside Kajabi?

Kajabi's built-in reporting is deliberately high level, and its funnel revenue counts every sale of a linked offer no matter where the buyer actually came from. This gives you offer level and product level revenue for a range you choose, with refunds and cancellations sitting next to the gross number, plus the ability to click through to the individual sales that make up any total.

### Will the money amounts show correctly?

Yes. Kajabi stores every amount in cents behind the scenes, which is a common source of numbers that look a hundred times too big. The app converts everything into real currency before it is shown, so what you read is what you earned.

### What date ranges can I choose?

Any range you like, such as last month, a launch week, or a full quarter. The written review compares your selection against the period immediately before it of the same length, so a 30 day range is always measured against the previous 30 days.

### Does it change anything in my Kajabi account?

No. The app only reads your orders, purchases, offers, and products. The only thing it writes to is the Google Sheets tracker you connect, where it appends a snapshot row per offer so you build a history outside Kajabi.

### What if I sell through more than one Kajabi site?

You can scope the dashboard to a single site, so the totals reflect just that brand or business rather than everything mixed together.

Use this prompt in General Input: https://www.generalinput.com/prompts/see-which-kajabi-offers-actually-made-money-this-period