See which Kajabi offers actually made money this period

By General Input

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.

Integrations

  • Kajabi
  • Google Sheets

Type

App

Categories

  • Finance
  • Operations

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.

Related prompts

Explore more prompts
Call overdue Xero customers with an AI collections agentLocal listing health board for every location you manageLet support send one-off Loops emails without an engineerStop cold emails to anyone with a live deal in PipedriveiMessage campaign console with pre-flight checks and delivery boardLinkedIn Ads budget pacing dashboard for every client accountFront desk appointment confirmation board for the next 3 daysGive your team Looker numbers without buying more seatsBuild audience segments from product usage and push to LoopsTurn the people who engage with your posts into Pipedrive leads