I receive a lot of questions like this — basically how to optimally outline sales affects vs changes with partners/products in our store.

On Sept 12, 2024, Partner X provided us a commission on the lowest category seats (cat E and K) for Product Y.  Prior to this, we did not sell this category because they would not provide us a commission on these seats. 

I advised earlier this year to Partner X that providing the additional lower priced inventory would increase our ability to showcase the lowest rate, thus bringing shoppers to their page and increasing overall conversion, including the higher-priced categories.  Partner X says they didn’t see the increase in production at the higher-priced categories and is dragging their feet providing us commission in 2026 for these seats.  Consequently, we are not selling them at this time. 

So, the question essentially is: What can we provide Partner X that will support our argument that the addition of cat E and K ticket types (with commission) has allowed us to increase our Product Y bookings post Sept 20?

Start Simple

Looking at the 7 Day Moving Avg of Tickets Sold [Red] vs the Avg. Ticket Cost [Blue], we see a direct cause and affect of introducing the lower priced ticket types. We saw sales spike immediately. More users were buying overall tickets in all ticket types. The supplier was also making more money on average. I included horizonal YTD average lines to also highlight this.

What is happening though after this time span? Ticket sales are falling — is that what the partner is referring to as to why they aren’t seeing enough sales?

Build a Buy-Up Query with Average Sales Per Day Over Different Time Frames

SELECT 
    r.time_period_label,
    r.price_band_rank,
    r.days_in_period,
    r.orders_at_rank,
    r.units_at_rank,
    r.gross_revenue_at_rank,
    r.cost_at_rank,
    r.net_revenue_at_rank,

    -- Concatenated “price band” names that roll into this rank
    r.price_band_names_at_rank,

    -- Share of orders within the time period (decimal 0–1)
    ROUND(
        CAST(r.orders_at_rank AS float)
        / NULLIF(SUM(r.orders_at_rank) OVER (PARTITION BY r.time_period_label), 0),
        4
    ) AS pct_of_orders_in_period,

    -- Average unit price at this rank
    ROUND(
        r.revenue_at_rank / NULLIF(r.units_at_rank, 0),
        2
    ) AS avg_unit_price_at_rank,

    -- Units sold per day at this rank & period
    ROUND(
        CAST(r.units_at_rank AS float) / NULLIF(r.days_in_period, 0),
        2
    ) AS units_per_day_at_rank,

    -- Orders per day at this rank & period
    ROUND(
        CAST(r.orders_at_rank AS float) / NULLIF(r.days_in_period, 0),
        2
    ) AS orders_per_day_at_rank,

    -- Gross revenue per day at this rank
    ROUND(
        CAST(r.gross_revenue_at_rank AS float) / NULLIF(r.days_in_period, 0),
        2
    ) AS gross_revenue_per_day_at_rank,

    -- Cost per day at this rank
    ROUND(
        CAST(r.cost_at_rank AS float) / NULLIF(r.days_in_period, 0),
        2
    ) AS cost_per_day_at_rank,

    -- Net revenue per day at this rank
    ROUND(
        CAST(r.net_revenue_at_rank AS float) / NULLIF(r.days_in_period, 0),
        2
    ) AS net_revenue_per_day_at_rank

FROM (
    -- Aggregate metrics by time period and price rank
    SELECT 
        time_period_label,
        days_in_period,
        price_band_rank,
        SUM(total_orders)      AS orders_at_rank,
        SUM(total_revenue)     AS revenue_at_rank,
        SUM(total_gross)       AS gross_revenue_at_rank,
        SUM(total_cost)        AS cost_at_rank,
        SUM(total_net_revenue) AS net_revenue_at_rank,
        SUM(total_units)       AS units_at_rank,

        -- One concatenated list of price bands per (period, rank)
        STRING_AGG(price_band_name, ', ') AS price_band_names_at_rank

    FROM (
        -- Rank price bands by average price within each time period
        SELECT 
            ap.time_period_label,
            ap.start_date,
            ap.end_date,
            ap.days_in_period,
            ap.product_name,
            ap.price_band_name,
            ap.total_units,
            ap.total_revenue,
            ap.total_gross,
            ap.total_net_revenue,
            ap.total_cost,
            ap.avg_unit_price,
            ap.total_orders,
            RANK() OVER (
                PARTITION BY ap.time_period_label, ap.product_name
                ORDER BY ap.avg_unit_price ASC
            ) AS price_band_rank
        FROM (
            -- Aggregate raw transactions into product × price band × time period
            SELECT 
                p.time_period_label,
                p.start_date,
                p.end_date,
                DATEDIFF(DAY, p.start_date, p.end_date) + 1 AS days_in_period,
                f.product_name,
                f.price_band_name,
                SUM(f.unit_quantity)     AS total_units,
                SUM(f.revenue_amount)    AS total_revenue,
                SUM(f.gross_revenue)     AS total_gross,
                SUM(f.net_revenue)       AS total_net_revenue,
                SUM(f.cost_amount)       AS total_cost,
                SUM(f.revenue_amount) / NULLIF(SUM(f.unit_quantity), 0) AS avg_unit_price,
                COUNT(DISTINCT f.order_id) AS total_orders
            FROM fact_sales f
            JOIN (
                -- Define the three comparison periods
                SELECT 'Period 1' AS time_period_label, 
                       CAST('2024-01-01' AS date) AS start_date, 
                       CAST('2024-03-31' AS date) AS end_date
                UNION ALL
                SELECT 'Period 2', 
                       CAST('2024-04-01' AS date), 
                       CAST('2024-06-30' AS date)
                UNION ALL
                SELECT 'Period 3', 
                       CAST('2024-07-01' AS date), 
                       CAST('2024-09-30' AS date)
            ) AS p
              ON f.order_date >= p.start_date
             AND f.order_date <= p.end_date
            WHERE 
                f.order_status = 'COMPLETED'
                AND f.product_type = 'PRIMARY'
                AND f.product_name IN ('Flagship Product')
                -- Optional: exclude a short-lived outlier price band
                -- AND f.price_band_name <> 'Experimental Tier'
            GROUP BY 
                p.time_period_label,
                p.start_date,
                p.end_date,
                f.product_name,
                f.price_band_name
        ) AS ap
    ) AS rp
    GROUP BY 
        time_period_label,
        days_in_period,
        price_band_rank
) AS r
ORDER BY 
    r.time_period_label,
    r.price_band_rank;

This query ranks ticket types by price over the specified time frames and allows you to compare 3 different time frames at once — this lets us look at the Sept 12 infection period.

We see that the Average Price goes from $96 before the introduction of cheap ticket types, to $55, then up to $166. Orders, tickets, and item cost per day all follow the same pattern. The partner was making more when we had the ability to sell lower priced ticket types. When the average ticket price increases again, or when we didn’t have all ticket types to sell from, the partner starting making less money. The more choices we give the customer (to an extent), especially the ability to choose the worst seat in the theater (if they desire) the better all other ticket types look and the more we sell.

Leave a comment

About the Podcast

Welcome to The Houseplant Podcast, your ultimate guide to houseplants! Join us as we explore the wonders and importance of plants in our lives.

Explore the episodes