Search Documentation

Search for a documentation page...

Dashboard

Matching Engine

How Adsu identifies the same person across ad clicks, form submissions, and payments.

The Identity Resolution Problem

Attribution only works if you can connect a person's ad click to their payment. The challenge is that these events happen in completely different systems, often days or weeks apart, and the person may look different in each one.

When someone clicks your Facebook ad, all you get is a browser session with a click ID. When they fill out a form on your website, you get a name and email. When they show up in GoHighLevel, they have a CRM contact record. When they pay through Stripe, there is a charge linked to an email or card. The matching engine's job is to determine that all of these records belong to the same person.

This process is called identity resolution, and it is one of the most critical parts of Adsu's attribution pipeline. Without accurate matching, revenue would be attributed to the wrong campaigns or not attributed at all.

How the Matching Engine Works

The matching engine uses a priority-based system with six matching methods, ordered from highest confidence to lowest. When a new contact or transaction comes in, Adsu tries each method in order and stops at the first successful match.

1
Email Exact Match
Definitive — normalized email comparison
High
2
Phone Exact Match
Normalized number, strips formatting
High
3
Visitor Fingerprint
Browser-based session linking
High
4
IP + Time Window
Same IP within short window — flagged
Medium
5
Phone Fuzzy Match
Near-miss number variations
Medium
6
Name Fuzzy Match
Last resort — always flagged for review
Flagged
1

Email Exact Match (Highest Confidence)

The strongest signal. If the email address from a form submission matches the email on a CRM contact or Stripe charge, that is a definitive match. Emails are normalized before comparison -- converted to lowercase and trimmed of whitespace -- so "John@Gym.com" and "john@gym.com" are treated as the same address.

Email matching is how most gym leads get resolved. When someone fills out a lead form (either on your website or through a Meta lead form), they provide their email. That same email shows up in GoHighLevel and later in Stripe when they pay for their membership.

2

Phone Exact Match

If emails do not match or are unavailable, the engine tries phone numbers. Phone numbers are normalized to a standard format before comparison, stripping out dashes, parentheses, spaces, and country code prefixes. So "(555) 123-4567", "555-123-4567", and "+15551234567" are all treated as the same number.

Phone matching is especially useful for leads that come through phone calls or SMS-first workflows, where the phone number may be captured before an email address is ever provided.

3

Visitor Fingerprint

When someone visits your website, the Adsu tracking script generates a browser-based visitor fingerprint. This fingerprint is stored alongside page view and form submission events. If the same browser visits your site, clicks an ad, and later fills out a form, the fingerprint ties those sessions together.

Visitor fingerprints are most useful for connecting the dots when a prospect visits your landing page multiple times before submitting their information. They bridge the gap between anonymous browsing sessions and identified contacts.

4

IP + Time Window (Flagged for Review)

When stronger signals are not available, the engine checks if a page event and a contact creation happened from the same IP address within a short time window. For example, if someone views your landing page from IP address 192.168.1.1 at 2:05 PM, and a new GHL contact is created at 2:08 PM with the same IP, the engine tentatively links them.

This method has lower confidence because multiple people can share the same IP address (family members, coworkers, or people on the same gym Wi-Fi network). That is why these matches are flagged for manual review rather than automatically confirmed.

5

Phone Fuzzy Match

Sometimes phone numbers do not match exactly even after normalization. A contact might have a number stored with a country code in one system but without it in another, or there might be a transposed digit. Fuzzy phone matching catches these near-misses by comparing normalized number sequences and allowing small variations.

Fuzzy phone matches are treated with moderate confidence. They are more reliable than IP-based matching but less certain than exact matches.

6

Name Fuzzy Match (Flagged for Review)

The lowest-confidence method. When no other identifiers overlap, the engine compares first and last names using fuzzy string matching. This can catch cases where "Mike Johnson" in your CRM is the same person as "Michael Johnson" in Stripe.

Name matching has the highest false-positive rate because common names are shared by many people. These matches are always flagged for manual review. In gyms that serve local communities, name collisions are especially common -- you might have three "John Smith" leads in the same month.

Flagged matches require review

IP+time and name fuzzy matches are flagged for manual review in the Attribution Review page. These have lower confidence and may be incorrect. We recommend reviewing flagged matches weekly to confirm or reject them. Rejected matches are excluded from attribution calculations.

What Happens After a Match

Once the matching engine resolves a contact's identity, two things happen:

  1. Touchpoint collection: Adsu gathers all known touchpoints (ad interactions) for the matched contact. These include page views with UTM parameters, Facebook click IDs, form submissions, lead form fills, and any other tracked interactions.
  2. Attribution weight computation: If the contact also has transactions (payments), Adsu computes attribution weights based on the currently selected attribution model. The weights determine how much revenue credit each touchpoint -- and therefore each ad, ad set, and campaign -- receives.

The result is a complete picture: you can trace any paying member back through their entire journey, from the first ad they clicked to their most recent payment, with revenue credit distributed according to the attribution model you choose.

When the Matching Engine Runs

On-demand matching

The matching engine runs automatically every 30 minutes for all active locations. You can also trigger an on-demand match from the Sync Status page if you need results faster -- for example, after importing a batch of new contacts or connecting a new integration.

The matching engine processes contacts in batches. Each run picks up new unmatched contacts, new transactions without a contact link, and any flagged matches that have been confirmed through manual review. The engine is idempotent, meaning running it multiple times on the same data produces the same results without creating duplicate matches.

When you first connect an integration, Adsu runs an initial backfill that imports up to 90 days of historical data. The matching engine automatically runs after this backfill completes, so your dashboard shows attributed revenue from day one -- you do not need to wait for new data to accumulate.

Improving Match Quality

The matching engine works best when your data is clean and consistent across systems. Here are practical steps to improve match rates:

  • Collect email on every lead form: Email is the highest-confidence match signal. If your Meta lead forms or website forms do not require an email address, consider making it required. This single change can dramatically increase your match rate.
  • Use consistent phone formats in your CRM: If your GoHighLevel contacts have phone numbers in wildly different formats, the normalization process handles most variations, but consistent formatting reduces the chance of missed matches.
  • Install the tracking script on all landing pages: The visitor fingerprint only works if the tracking script is present. If you run ads pointing to pages without the script, those visitors cannot be fingerprinted and will need to be matched by other methods.
  • Review flagged matches regularly: Confirming or rejecting flagged matches improves your attribution accuracy and helps the system learn which types of fuzzy matches are reliable for your specific gym.

Duplicate Detection

In addition to identity resolution, Adsu includes a duplicate contact scanner that runs weekly. It identifies CRM contacts that likely represent the same person -- for example, if a lead filled out two different forms with slightly different email addresses.

Detected duplicates are flagged with a confidence score and surfaced in the Attribution Review page. You can merge or dismiss them. Merging duplicates consolidates touchpoints and transactions under a single contact record, which improves attribution accuracy.

Related Pages