Search Documentation

Search for a documentation page...

Dashboard

How Adsu Works

Understand the data flow from ad click to revenue attribution.

The Problem Adsu Solves

When you run ads for a gym, the ad platform tells you how many people clicked, how many submitted a lead form, and how much you spent. But it cannot tell you how many of those leads actually showed up for a tour, signed a membership, or stayed past their first month. That information lives in your CRM and payment processor -- systems that are completely disconnected from your ad accounts.

This gap means most gym owners are making ad decisions based on incomplete data. A campaign with cheap leads might look great in Meta Ads Manager, but if none of those leads convert to paying members, it is actually your worst performer. Conversely, a campaign with expensive leads might be your most profitable if those leads have high close rates and long retention.

Adsu bridges this gap by connecting every system in your sales process into a single attribution chain. Here is how the data flows from the moment someone clicks your ad to the moment Adsu attributes revenue back to that ad.

The Attribution Pipeline

Adsu's attribution pipeline has six stages. Data flows through each stage automatically -- you do not need to manually tag, export, or reconcile anything after initial setup.

Ad Click Capture
fbclid, UTMs, page views
Lead Identification
Form fills, lead ads, CRM sync
Identity Resolution
Match visitors to contacts
Funnel Tracking
Stage progression
Revenue Attribution
Assign revenue to ads
CAPI Feedback
Teach Meta's algorithm

Stage 1: Ad Click Capture

When someone clicks your Meta or Google ad, they land on your gym's website or landing page. The Adsu tracking script (a small JavaScript snippet installed on your site) captures several pieces of information:

  • Facebook Click ID (fbclid) -- a unique identifier Meta attaches to every ad click. This is the most reliable way to trace a visitor back to a specific ad.
  • UTM parameters -- campaign, ad set, and ad identifiers embedded in the landing page URL.
  • Page view data -- which page they landed on, what referring URL brought them, and when they arrived.
  • Visitor fingerprint -- a privacy-safe identifier combining browser and session attributes that allows Adsu to recognize the same visitor across multiple page views.

This data is stored as a page event in Adsu's database. At this point, the visitor is anonymous -- Adsu knows someone clicked an ad, but does not yet know who they are.

Meta Lead Forms work too

If you use Meta Lead Forms (where the form is inside Facebook/Instagram rather than on your website), Adsu receives lead data directly through Meta's webhook system. The tracking script is not needed for lead form submissions, but it is still valuable for tracking website visitors who do not submit a form on their first visit.

Stage 2: Lead Identification

The anonymous visitor becomes a known lead when they take an identifying action:

  • Website form submission -- the visitor fills out a contact form, booking form, or opt-in on your landing page. The tracking script captures the form data (name, email, phone) and sends it to Adsu.
  • Meta Lead Form submission -- Facebook sends the lead data to Adsu via webhook, including the ad that generated it.
  • GoHighLevel contact creation -- if a lead enters your CRM through another channel (manual entry, import, another tool), Adsu picks it up during its regular contact sync.

When a lead is identified, Adsu creates a contact record and attempts to link it to previous anonymous page events. This is where the matching engine comes in.

Stage 3: Identity Resolution (The Matching Engine)

The matching engine is Adsu's core technology. Its job is to answer the question: "Is this new lead the same person who clicked that ad three days ago?"

The matching engine uses a priority-based system to connect contacts to their ad interactions:

  1. Email match -- if the contact's email appears in a previous form submission or page event, that is a definitive match.
  2. Phone match -- exact phone number match across records, accounting for formatting differences (parentheses, dashes, country codes).
  3. Visitor fingerprint -- matches the contact to previous anonymous sessions from the same browser.
  4. IP + time window -- if a contact was created within a short window of an ad click from the same IP address, it is flagged as a probable match (requires manual review).
  5. Fuzzy phone match -- catches minor phone number variations (transposed digits, missing area codes).
  6. Fuzzy name match -- last resort matching based on name similarity, flagged for manual review due to lower confidence.

When a match is confirmed, Adsu creates touchpoints -- records that link a specific contact to specific ad interactions. A single contact might have multiple touchpoints if they clicked different ads before converting (for example, they saw a brand awareness ad on Monday, then clicked a retargeting ad on Thursday before filling out a form).

Review flagged matches

Lower-confidence matches (IP-based and name-based) are flagged for review in the Attribution Review section of the dashboard. You can confirm or reject these matches to improve data accuracy over time.

Stage 4: Funnel Stage Tracking

Once a contact is in the system, Adsu tracks their progression through your sales funnel. Stages update automatically through multiple channels:

  • GoHighLevel pipeline moves -- when your sales team moves a lead to a new pipeline stage in GHL (e.g., from "New" to "Contacted"), Adsu receives a webhook and updates the contact's funnel stage.
  • Automatic appointment detection -- when a prospect books an appointment through your GHL calendar, Adsu automatically advances them to "Appointment Set" without any manual pipeline move required.
  • Automatic payment detection -- when a Stripe charge succeeds for a matched contact, Adsu automatically advances them to "Closed." When an active subscription is confirmed, they advance to "Active Member."
  • Conversation tracking -- when a lead sends an inbound message through GHL, Adsu automatically marks them as "Contacted." Adsu also tracks when your staff first responds, measuring speed-to-lead for each contact.

Funnel stages only move forward, never backward. If a contact is already at "Closed" and a GHL webhook tries to move them back to "Contacted," Adsu ignores the update. This prevents data inconsistencies from manual pipeline errors or webhook race conditions.

Hard signals vs. soft signals

Adsu distinguishes between hard signals (appointment bookings, payments, subscriptions) that trigger automatic stage advances and soft signals (pipeline moves, messages) that reflect manual sales activity. Hard signals always take effect, even if your team forgets to update the GHL pipeline. This means your funnel data stays accurate regardless of how disciplined your sales team is with CRM hygiene.

Stage 5: Revenue Attribution

When a contact makes a payment (detected via Stripe), Adsu attributes that revenue back to the ads the contact interacted with. This is where attribution models come into play.

If a contact clicked three different ads before signing up, which ad gets credit for the sale? The answer depends on which attribution model you choose:

  • First Touch -- 100% credit goes to the first ad the contact interacted with. This tells you which ads are best at generating initial awareness. Recommended for most gyms as a starting point.
  • Last Touch -- 100% credit goes to the last ad before conversion. This tells you which ads close the deal.
  • Linear -- credit is split equally across all ads the contact interacted with. If they clicked three ads, each gets 33.3%.
  • Time Decay -- more credit goes to ads closer to the conversion. The ad they clicked right before signing up gets the most credit, while earlier ads get progressively less.

Attribution is computed on the fly, not pre-stored. This means you can switch between models in the dashboard and instantly see how your campaign performance changes under different perspectives. There is no need to wait for data to reprocess.

The result is a clear, dollar-denominated view of ad performance. Instead of seeing "Campaign A got 50 leads at $12 each," you see "Campaign A generated $8,400 in membership revenue from $600 in ad spend -- a 14x return."

Attribution needs time

Gym sales cycles can be long. A lead might click an ad in January, book a tour in February, and sign up in March. Adsu tracks this entire journey, but it means your attribution data becomes more complete over time. Give it at least 30-60 days before drawing conclusions about campaign performance.

Stage 6: CAPI Feedback Loop

This is where Adsu does something most attribution tools do not. When a Meta-sourced lead advances through your funnel (books an appointment, makes a payment), Adsu sends that conversion event back to Meta through the Conversions API (CAPI).

Why does this matter? Meta's ad delivery algorithm optimizes for the events you tell it about. By default, it only knows about link clicks and lead form submissions. That means it finds people who are likely to click and fill out forms -- not people who are likely to actually become gym members.

When Adsu sends deeper-funnel events back to Meta, the algorithm learns what a valuable lead looks like. Over time, this means:

  • Meta shows your ads to people who resemble your actual paying members, not just people who click
  • Lead quality improves because the algorithm optimizes for appointments and purchases, not just form fills
  • Your cost per acquisition (actual paying member) drops even if your cost per lead stays the same or increases slightly

Adsu maps funnel stages to Meta conversion events as follows:

  • Appointment Set sends a "Schedule" event
  • Showed sends an "AppointmentShowed" custom event
  • Closed / Active Member sends a "Purchase" event with the actual transaction value

CAPI events are sent asynchronously and never block your CRM operations. If a CAPI event fails to send (network issue, Meta API error), the contact's funnel stage still updates normally. Adsu retries failed CAPI events automatically.

CAPI only fires for Meta-sourced leads

Adsu only sends CAPI events for contacts that originated from Meta ads (identified by source type or the presence of a Facebook Click ID). Leads from Google Ads, organic traffic, or manual entry are tracked in the dashboard but do not trigger CAPI events, since Meta would not benefit from that data.

Data Sources
Meta Ads
Spend, leads, clicks
Google Ads
Spend, impressions
GoHighLevel
Contacts, pipeline
Stripe POS
Payments, subs
Tracking Script
Page views, forms
Adsu Engine
Matching
Attribution
Stage Tracking
Outputs
True ROAS
Revenue per ad dollar
Attribution
Revenue by campaign
CAPI Events
Optimize Meta delivery

How It All Connects: An Example

Here is a concrete example of how Adsu tracks a single lead from ad click to paying member:

  1. Monday 9:00 AM -- Sarah sees your Facebook ad for a free trial week. She clicks the ad and lands on your website. The tracking script records her visit, capturing the Facebook Click ID and the campaign that brought her.
  2. Monday 9:02 AM -- Sarah fills out the "Book a Free Trial" form on your landing page. The tracking script captures her name, email, and phone number. Adsu creates a contact record and links it to the ad click from two minutes ago.
  3. Monday 9:05 AM -- The form submission flows into GoHighLevel (via your existing GHL form or webhook). Adsu syncs the GHL contact and confirms the match.
  4. Monday 2:00 PM -- Your front desk books Sarah for a tour using GHL's calendar. Adsu receives the appointment webhook and automatically advances Sarah to "Appointment Set." A CAPI "Schedule" event is sent to Meta.
  5. Wednesday 10:00 AM -- Sarah shows up for her tour. Your team moves her to "Showed" in the GHL pipeline. Adsu receives the pipeline webhook and advances her stage. A CAPI "AppointmentShowed" event is sent to Meta.
  6. Wednesday 10:30 AM -- Sarah signs up for a monthly membership and pays her first month through your gym's Stripe terminal. Adsu detects the Stripe charge, matches it to Sarah using her email, and automatically advances her to "Closed." A CAPI "Purchase" event with the dollar amount is sent to Meta.
  7. Dashboard -- You open Adsu and see that your "Free Trial Week" campaign on Facebook has generated $2,400 in membership revenue this month from $350 in ad spend. Sarah's payment is one of those attributed transactions.

Every step in this journey is tracked automatically. Your sales team does not need to do anything special besides their normal workflow in GoHighLevel.

Why This Matters for Your Gym

Without closed-loop attribution, gym owners typically make ad decisions based on one of two approaches, both of which are flawed:

  • Trusting the ad platform -- Meta says Campaign A got 50 leads at $10 each and Campaign B got 20 leads at $25 each. Campaign A looks better. But if Campaign A's leads are tire-kickers who never show up, and Campaign B's leads are serious buyers who sign 12-month contracts, then Campaign B is actually 5x more profitable. You would never know without connecting the revenue data.
  • Gut feeling and spreadsheets -- manually checking new members against ad campaigns using spreadsheets or memory. This is time-consuming, error-prone, and impossible to scale across multiple campaigns and locations.

Adsu replaces guesswork with data. You see the actual revenue generated by each campaign, each ad set, and each individual ad. You can make confident budget decisions: scale what works, cut what does not, and stop wasting money on campaigns that generate leads but not members.

The CAPI feedback loop compounds this advantage over time. As Meta learns which of your leads actually convert to paying members, it gets progressively better at finding similar people. Your ad targeting improves automatically, without you touching audience settings or lookalike configurations.

What Adsu Does Not Do

Adsu is focused specifically on ad attribution and revenue tracking. It does not replace any of your existing tools:

  • Adsu does not manage or create ads -- use Meta Ads Manager and Google Ads for that
  • Adsu does not replace your CRM -- GoHighLevel remains your system of record for lead management and communication
  • Adsu does not process payments -- Stripe remains your payment processor
  • Adsu does not send emails or text messages -- your existing GHL workflows handle communication

Adsu sits alongside these tools, reading data from each one and connecting the dots between them. It is a measurement and optimization layer, not a replacement for your existing marketing stack.

Next Steps