Skip to content

Your Best Campaign Audience Isn’t in Your Revenue Report (Yet)

    Your booking report looks reassuring. Customers who bought. Recent activity. Revenue. It also quietly leaves out the people who haven’t acted yet, even when they’ve already given you permission to contact them.

    That missing group may be the audience worth understanding before your next campaign.

    The Empty Stadium Blueprint asks a simple question: who’s not here, and why should the business care? I ran it against the live Summit Adventures database, the fake adventure tourism company I created to help people learn business analytics.

    Find the gap without guessing

    1. Define the “has done” event. Here, a booking. In your work, it might be a login, an interview, a renewal, or a purchase.
    2. Start with the full audience. Put `customers` on the left side of the join so every opted-in customer stays in view.
    3. Filter for the missing match. `b.booking_id IS NULL` keeps only customers with no booking record.

    SELECT
        c.experience_level,
        COUNT(*) AS opted_in_customers_without_bookings
    FROM customers AS c
    LEFT JOIN bookings AS b
        ON b.customer_id = c.customer_id
    WHERE c.marketing_opt_in
        AND b.booking_id IS NULL
    GROUP BY c.experience_level
    ORDER BY opted_in_customers_without_bookings DESC;

    Results: Summit has 200 opted-in customers without a booking.

    59 experts
    51 beginners
    45 intermediate
    45 advanced

    These aren’t necessarily unhappy customers. They may be new to the list, comparing options, waiting for the right trip, or planning ahead. The query won’t guess their reason. It identifies an audience worth understanding.

    Why the LEFT JOIN matters

    An `INNER JOIN` only keeps customers with a matching booking. A `LEFT JOIN` keeps every customer and leaves the booking side empty when no match exists. The `b.booking_id IS NULL` filter isolates the empty seats.

    The same question shows up everywhere:

    Trial users who haven’t activated a feature.
    Subscribers who haven’t opened an email.
    Products that haven’t sold this month.

    The logic transfers because the business question transfers. You’re looking for a meaningful absence.

    For Summit, start with discovery, not a blanket discount. Compare the 200 customers by signup date, trip difficulty, and location. A beginner who joined yesterday needs a different message than an expert who’s stayed on the list for a year.

    Absence needs context

    No booking doesn’t mean no interest. A customer may have joined yesterday or be waiting for the right departure date.
    Pick a reliable match column. Test a key like `booking_id` for `NULL`, not a field that might be blank on a legitimate booking.
    Separate the audience before acting. Signup date and experience level turn one vague retention list into several relevant conversations.

    Three steps from missing booking to relevant outreach

    1. Add time first. Signup date separates recent subscribers from people who’ve had time to consider a trip.
    2. Add context that changes the offer. Experience level, location, and trip difficulty help the team decide what message would actually land.
    3. Measure the response. Keep the original audience definition so you can see whether a campaign led to new bookings.

    The SQL identifies the audience. The next work is picking a helpful reason to contact them, then measuring whether it led to action.

    This Week’s Action Item

    Identify one business process with a clear “has done” event. Use a `LEFT JOIN` to list the people or items without that event. Then write one question that would help you understand the gap before recommending action.


    Want More SQL Insights Like This?

    Join thousands of analysts getting weekly tips on turning data into business impact.

    Subscribe to Analytics in Action →

    Leave a Reply

    Your email address will not be published. Required fields are marked *