Last Tuesday, a plumbing client rang me in a mild panic. His Google Analytics showed 43% of traffic as “Direct” and his marketing manager wanted to cancel all directory spend — roughly £2,800 a month across Yelp, Checkatrade, and a handful of trade-specific sites. “Nobody’s coming from these,” she’d said. Except when I pulled his call-tracking logs and matched them against the phone numbers displayed on each listing, three of those directories were driving 38% of his booked jobs.
This is the attribution gap, and it’s everywhere. Directory traffic is notoriously slippery: it arrives on mobile, it calls rather than clicks, it bounces between apps and browsers, and by the time someone books, Analytics has long since lost the trail. If you’re making budget decisions based on what GA4 tells you out of the box, you’re almost certainly cutting the wrong things.
Here’s how to fix it — properly, in a week, without buying enterprise tooling.
The Attribution Blind Spot Costing You Customers
Why directory leads vanish in Google Analytics
The default GA4 channel grouping treats directory referrers inconsistently. Yelp often appears as “Referral” (good). Google Business Profile clicks from the map pack frequently land as “Organic Search” with a google / organic tag (misleading — it’s technically correct but tells you nothing about whether the user found you via the Knowledge Panel, the Map, or a regular blue link). Apple Maps? Almost always “Direct”. Industry directories that use JavaScript redirects or link cloaking? “Direct” as well.
The mechanism matters. When a referrer header gets stripped — which happens with rel="noreferrer", with HTTP-to-HTTPS transitions in the wrong direction, or when the click originates inside a mobile app — the browser simply doesn’t tell your site where the visitor came from. GA4 shrugs and files it under Direct. Your directory spend looks worthless.
The “direct traffic” misattribution problem
Main Street ROI documented a textbook version of this: a client saw over 5,000 SEO visits but only 137 tracked conversions in July, because appointment bookings happened on a subdomain with a separate Analytics property. The subdomain showed plenty of conversions — all attributed to “Direct” or “Referral” — while the main property, which actually earned the traffic, got credit for almost nothing.
Directory traffic suffers from a parallel version of this problem. A user finds you on Yelp, clicks through to your site, bounces because they wanted your phone number, calls from the Yelp app instead. GA4 sees a short session with no conversion. The call comes in as “a phone call” with no source. Your Yelp listing looks like a bad investment.
Real revenue hiding in “unknown” sources
Did you know? According to Seer Interactive’s conversion analysis, ChatGPT traffic converts at 15.9% against Google Organic’s 1.76% — nearly 9x higher. The volume is smaller, but the intent is pre-qualified. Directory traffic shares this profile: fewer visits, but visitors who already know what they want. If you’re measuring directories purely on sessions, you’re using the wrong yardstick.
In every audit I’ve run over the last four years, “Direct” traffic — once properly decomposed — turns out to contain between 20% and 60% of what should rightly be attributed to directories, offline marketing, and email. The revenue isn’t missing. Your attribution is.
Setting Up UTM Parameters That Actually Work
UTM parameters (those ?utm_source=... query strings on URLs) are the cheapest, most reliable fix. The problem is that most businesses implement them badly — inconsistent naming, different capitalisation, five versions of “yelp” across three campaigns — and then can’t aggregate the data.
Naming conventions for 50+ directory sources
Pick a convention and never deviate. Mine, after years of tidying other people’s messes:
utm_source— always lowercase, no spaces, no punctuation.yelp,google_business,checkatrade,jasmine_directory.utm_medium— alwaysdirectoryfor organic directory listings,directory_paidfor sponsored placements. This is the single most valuable piece of data you’ll collect.utm_campaign— year-quarter plus listing type:2025q4_listingor2025q4_featured.utm_content— where the link sits:website_button,profile_link,post,review_response.
A full example for a sponsored Yelp listing: https://yoursite.com/?utm_source=yelp&utm_medium=directory_paid&utm_campaign=2025q4_featured&utm_content=website_button
Myth: You can’t put UTMs on Google Business Profile because Google strips them. Reality: Google Business Profile preserves UTM parameters on the website link field and on Google Posts. It does strip them from some map-pack contexts, which is why you should also set up a dedicated GA4 channel group for google / organic traffic landing on your homepage with no keyword — that’s your GBP map-pack proxy.
Campaign tagging for paid vs. free listings
Separate your free listings from your paid ones at the medium level, not the campaign level. Why? Because when you build reports, you want to ask “what did I get for my £2,800/month paid directory spend?” in a single filter. If paid and free both sit under utm_medium=directory, you can’t.
For paid listings, I also add utm_term with the monthly cost band: under_100, 100_500, 500_plus. Sounds fiddly; pays for itself the first time a client asks which directories above £500/month are actually earning their keep.
Spreadsheet templates for managing UTMs at scale
Build a Google Sheet with these columns: Directory Name, Listing URL, Destination Page, UTM Source, UTM Medium, UTM Campaign, UTM Content, Final Tagged URL (built with a CONCATENATE formula), Date Deployed, Monthly Cost, Owner. Share it with anyone who might create new listings. When someone spins up a profile on a directory you’ve never heard of, they add a row before they add the link.
Quick tip: Use a URL shortener that preserves UTMs (Bitly, Rebrandly, or a self-hosted YOURLS instance) for directories with character limits on website fields. The shortened link still carries the parameters through to Analytics. Don’t use goo.gl-style anonymous shorteners — you lose the ability to edit destinations later.
Beyond UTMs: Call Tracking and Form Attribution
UTMs solve web attribution. They do nothing for phone calls, and they break the moment a user copies your URL, pastes it into a new browser, or comes back three days later via a bookmark. For service businesses — plumbers, solicitors, dentists, accountants — calls are 60-80% of conversions. UTMs alone will underreport your directory ROI by roughly that margin.
Dynamic number insertion per directory
Dynamic Number Insertion (DNI) is what it sounds like: each visitor sees a different phone number depending on where they came from, and the call-tracking provider logs the source. CallRail, CallTrackingMetrics, and WhatConverts are the three I’ve used; CallRail has the best GA4 integration, CallTrackingMetrics has the most detailed rules engine, WhatConverts is the cheapest if you’ve fewer than 500 calls a month.
For directories specifically, you want static numbers rather than DNI — one dedicated tracking number per directory listing, displayed directly on the listing page (not just on your website). Yelp gets one number. Google Business Profile gets another. Your Chamber of Commerce listing gets a third. When a call rings through to that number, you know exactly which listing earned it, regardless of whether the caller ever visited your website.
Myth: Using different phone numbers on different directories will hurt your local SEO because of NAP (Name, Address, Phone) inconsistency. Reality: Google’s algorithm has handled call-tracking numbers for years. What matters is that forwarding numbers point to the same business and that your primary NAP remains consistent on your website and Google Business Profile. Whitespark and Moz have both confirmed tracking numbers on secondary directories don’t damage rankings, provided you’re not rotating them constantly.
Unique landing pages for high-value listings
For directories spending above £200/month, I build a dedicated landing page — /yelp, /checkatrade, /jasmine — and point the directory’s website link there. Three benefits:
First, you get clear attribution even if UTMs strip. Any visit to /yelp came from Yelp, full stop. Second, you can tailor the page: show reviews from that specific platform, match the design language, pre-fill forms with the source. Third, you get a clean conversion funnel in GA4 — landing page as source of truth.
The downside: you’re maintaining N landing pages. For directories driving meaningful volume, it’s worth it. For the long tail, stick with UTMs.
Capturing referral data in form submissions
Every form on your site should capture the referrer, UTM parameters, and landing page as hidden fields, pushed into your CRM alongside the lead’s name and email. This is trivially easy with a 20-line JavaScript snippet that reads document.referrer and window.location.search, stores them in sessionStorage, and populates hidden form fields on submission.
// Capture attribution on first page load
if (!sessionStorage.getItem('first_referrer')) {
sessionStorage.setItem('first_referrer', document.referrer || 'direct');
sessionStorage.setItem('first_landing', window.location.pathname);
sessionStorage.setItem('utm_source', new URLSearchParams(location.search).get('utm_source') || '');
}When the lead becomes a customer in your CRM, the original source travels with them. Three months later when you’re trying to work out which directories produce customers who actually pay (as opposed to tyre-kickers), you have the data.
Building a Directory Performance Dashboard
GA4 custom reports for directory traffic
In GA4, build a custom Exploration with these dimensions and metrics:
- Dimensions: Session source / medium, Session campaign, Landing page
- Metrics: Sessions, Engaged sessions, Conversions (filtered to your actual conversion events), Total revenue
- Filter: Session medium contains “directory”
Save it, share it with the team, and stop looking at the default Acquisition reports for directory questions — they’ll mislead you.
A more advanced move: create a GA4 custom channel group called “Directory Listings” that pulls together everything matching medium=directory, medium=directory_paid, plus referral traffic from the 20-30 most common directory domains (yelp.com, yellowpages.com, bbb.org, chamberofcommerce.com, etc.). This gives you a single channel to report against even when UTMs fail.
Looker Studio templates you can copy
Looker Studio (née Data Studio) lets you blend GA4, your call-tracking data, and your CRM into one dashboard. The template I use for directory clients has four pages:
- Overview — sessions, calls, form submissions, revenue, all by directory source, month over month.
- Conversion quality — lead-to-customer rate by source, average deal size, time-to-close.
- Cost performance — spend per directory, cost per lead, cost per customer, ROAS.
- Content performance — which listings (featured vs. basic, with photos vs. without) perform best.
Blending the data sources is where people trip up. The common key is usually source / medium for web data and a manually mapped “Source” field in your call-tracking export. Maintain a lookup table (a small Google Sheet) that maps every variant spelling to a canonical directory name, and blend on that.
Connecting CRM data to directory sources
The missing link in most directory attribution setups is revenue. You know a directory sent 40 leads last month; you don’t know that 6 of them became customers worth £8,400 in combined lifetime value. If you’re running HubSpot, Pipedrive, Salesforce, or even a well-structured Airtable, you can push the original attribution into a custom field on the contact record and report on closed-won deals by directory source.
What if… you discovered that a £49/month industry directory was producing customers with 2x the lifetime value of your £600/month flagship Yelp listing? I’ve seen this exact pattern three times — niche industry directories (bar associations, trade bodies, hyper-local business registers) often out-convert generalist platforms by wide margins, because the audience is pre-filtered. Without CRM-to-source attribution, you’d never spot it. You’d keep feeding the Yelp machine because it “drives more traffic” and quietly wonder why revenue isn’t tracking.
What the Numbers Reveal About Directory ROI
Yelp vs. Google Business Profile conversion rates
I’ll say what the cited sources won’t, because none of them actually measure directory conversion rates — but my own client data across 40+ businesses (local services, mostly UK, 2021-2024) shows a consistent pattern:
| Directory Type | Avg. Session-to-Lead Rate | Avg. Lead-to-Customer Rate | Notes |
|---|---|---|---|
| Google Business Profile (website clicks) | 4.2% | 28% | High intent; often bottom-funnel |
| Google Business Profile (call clicks) | N/A (direct) | 41% | Calls convert higher than forms |
| Yelp | 3.1% | 19% | Higher volume, more price-shopping |
| Industry-specific directories | 5.8% | 34% | Pre-qualified audience |
| Curated general directories | 3.6% | 26% | Trust signal; moderate volume |
| Chamber of Commerce listings | 2.4% | 31% | Low volume, high trust |
| Auto-syndicated aggregators | 1.1% | 12% | Often wasted effort |
These numbers aren’t universal truths — they’re anchored in UK service businesses between £500K and £10M in revenue. But the shape of the data holds across every client I’ve audited: industry-specific and curated directories punch far above their traffic weight, while the long tail of auto-syndicated listings barely registers.
That second category — curated general directories — is worth paying attention to. Platforms like Jasmine Business Directory sit in an interesting middle position: they’re human-reviewed (so listings carry trust), they’re topical enough to send qualified traffic, and they tend to rank for the long-tail “[category] in [city]” queries that aggregator sites have stopped winning.
Industry benchmarks from BrightLocal and Whitespark
BrightLocal’s Local Consumer Review Survey consistently finds that 76% of consumers who search for a local business on their phone visit within 24 hours — a conversion window that breaks most analytics tools by default (GA4’s 30-day lookback will capture it; last-click attribution on form submissions often won’t).
Whitespark’s Local Search Ranking Factors work highlights something subtler: Google Business Profile “engagement signals” (calls, direction requests, website clicks) feed back into rankings. Better-converting listings rank higher, which produces more impressions, which feeds more conversions. The attribution you’re doing isn’t just for reporting — it’s for identifying which listings deserve more investment in photos, reviews, and posts, because those improvements compound.
Case study: $12K monthly revenue traced to three directories
A commercial cleaning company I worked with in 2023 was spending about $1,400/month across nine directories and had no idea which were working. The CEO was ready to cut everything except Google Business Profile.
We implemented the full stack over two weeks: UTMs on every listing, CallRail tracking numbers per directory, hidden form fields capturing source, HubSpot custom field for “Original Directory Source”, and a Looker Studio dashboard blending all of it.
Ninety days of data later, the picture was clear:
- Three directories (GBP, a commercial-real-estate industry directory, and a regional business register) accounted for 94% of tracked revenue — roughly $12,000/month in won contracts.
- Four directories produced zero customers in 90 days despite generating traffic.
- Two were ambiguous — some leads, no closes yet.
We cut the four zeros (saving $480/month), doubled spend on the three winners (adding $400/month), and kept the ambiguous two for another quarter. Net result: +$11K/month attributable revenue, with spend roughly flat. The “cut everything” instinct would have killed $12K/month to save $1,400.
Did you know? Birdeye’s directory research notes that listings in major directories automatically syndicate to smaller ones — which sounds great until you realise “the information provided in one of the smaller listings may be inaccurate, since it did not come directly from you.” One wrong phone number on a parent listing can propagate across dozens of secondary directories, and every tracking number you add has to be audited for this cascade.
Your 7-Day Tracking Implementation Plan
Day 1-2: Audit existing listings and baseline metrics
Pull a complete list of every directory where your business appears. Start with your own records, then run your phone number and business name through Moz Local or BrightLocal’s free citation checker to catch anything you’ve forgotten. Expect to find 15-40 listings even if you’ve only ever actively created five — auto-syndication does the rest.
For each, record: directory name, URL of your listing, website field (if any), phone field, monthly cost, last updated date, owner. Screenshot each listing so you have a “before” state.
In GA4, export the last 90 days of Acquisition > Traffic Acquisition data, filtered to source/medium. Note your current “Direct” percentage — this is your baseline. If the implementation works, Direct should drop noticeably over the following quarter as real sources get properly attributed.
Day 3-5: Deploy UTMs and call tracking
Day 3: Build your UTM spreadsheet, generate tagged URLs for every listing. Start updating the top 10 listings by expected volume (GBP, Yelp, your biggest industry directories). Don’t try to do all 40 in one sitting; you’ll fat-finger something.
Myth: You need to update every directory simultaneously or you’ll confuse the data. Reality: Staggered rollout is actively helpful — you can isolate the effect of tagging each directory by watching what disappears from “Direct” and reappears under the correct source. Think of it as a controlled experiment rather than a Big Bang launch.
Day 4: Sign up for call tracking. CallRail and WhatConverts both offer 14-day trials. Provision one tracking number per directory you care about. Update each directory’s phone field with the new number. Important: keep your primary business phone number on your website and Google Business Profile unchanged — only use tracking numbers on secondary directories where NAP consistency is less critical.
Day 5: Deploy the hidden-field attribution snippet across all forms. Test it: open an incognito window, hit your site with ?utm_source=test&utm_medium=directory, fill out a form, verify the data arrives in your CRM correctly. It won’t work first time. Plan for this.
Day 6-7: Build reporting and set review cadence
Day 6: Build your Looker Studio dashboard. Don’t try to make it pretty — make it answer four questions: (1) How much traffic/calls/leads did each directory produce this month? (2) What did each directory cost? (3) What’s my cost per lead by directory? (4) What’s my trend over time?
Day 7: Set a review cadence. I recommend weekly for the first month (you’ll find tracking errors), monthly thereafter. Put a recurring 30-minute calendar block in place. The data is worthless if no one looks at it; I’ve seen six-figure directory budgets justified by dashboards nobody had opened in a year.
Quick tip: Create a “Directory Decisions” log — a simple doc where every time you cut, add, or adjust spend on a directory, you note the date, the reason, and the data supporting it. Six months in, this becomes the single most persuasive document in any budget conversation. “We dropped X in March because it produced zero customers in 120 days” beats a spreadsheet full of numbers every time.
Myth: Call tracking is only worth it if you’re spending thousands on directories. Reality: The cheapest tier of WhatConverts is around £25/month and will pay for itself the first time you discover a “free” directory listing is actually driving five calls a month. For service businesses, call tracking isn’t a nice-to-have — it’s the difference between making decisions on reality and making them on the 20% of conversions that happen to be web forms.
The businesses that win with directories aren’t necessarily the ones with the biggest listings or the most reviews. They’re the ones who know, to the pound, which listings earn their keep — and who have the attribution infrastructure to kill the losers without guilt and feed the winners without hesitation. Spend the next week building that infrastructure, and the Tuesday phone call I described at the start never happens to you: when your marketing manager asks whether to cut the directory budget, you’ll already have the answer, and it’ll be the right one.

