
How to set up call tracking for a service business
A practical walkthrough of call tracking for service businesses: method, dynamic number insertion, and attribution—built for owners measuring ROI.
Your phones ring. Which channel drove it?
If your leads skew heavily to calls, ad ROI is a guess until you connect calls to sessions. The fix is call tracking with dynamic number insertion (DNI) and sane attribution into Google Ads and Analytics.
This guide covers exactly how to choose a tracking method, plan number pools, implement DNI, and attribute calls—plus trade and dental/medical specifics that tend to trip teams up.
Pick a tracking approach that matches your stack and goals
There are three practical implementation paths:
Google Ads forwarding numbers (first‑party tracking)
- What it is: Google can swap your onsite number for a Google forwarding number only for Google Ads traffic and track website call conversions. Setup involves adding Google’s tag and configuring “Calls from website” conversions. See [Google Ads Help] for the official implementation and code placement steps. Google Ads Help
- When it fits: You mainly spend on Google Ads and just need ad/keyword‑level attribution in Google Ads.
Third‑party DNI provider (CallRail and peers)
- What it is: A drop‑in JavaScript snippet (e.g., swap.js) swaps visible phone numbers for tracking numbers from a pool and ties each call to the visitor session (referrer, UTM/auto‑tagging, keyword). Vendors also push conversions into ad platforms. See [CallRail’s Dynamic number insertion overview] and [CallRail API docs]. CallRail Dynamic Number Insertion overview CallRail API docs
- When it fits: You run multiple channels (organic, LSAs, Microsoft Ads, social, offline) and want one source of truth with session attribution and APIs.
DIY with telephony APIs (Twilio) + your own DNI and events
- What it is: You provision tracking numbers, implement your own swap code, and send events to GA4/Google Ads. Twilio documents number pools, assignment, and reuse—the primitives under the hood of call‑tracking vendors. See [Twilio best practices for phone numbers]. Twilio best practices
- When it fits: You need full control, custom logic, or deep integration and you’re comfortable building and maintaining it.
If you want keyword‑level attribution for PPC, plan on a “keyword/session pool” so the system can map a specific call to the clicked keyword and return that to Google Ads. Vendors document this pattern as required for per‑keyword reporting. See the [Tracking your online marketing efforts guide]. Tracking your online marketing efforts (keyword/session pools)
Plan your number pools before you touch code
DNI runs on number pools. A visitor gets a tracking number from a pool; the system ties that number to their session and reuses it after the session expires. See [CallRail Dynamic Number Insertion overview] and [Twilio Proxy number‑pool docs] for how assignment and reuse work. CallRail Dynamic Number Insertion overview Twilio Proxy: understanding phone number management
Decide what kinds of pools you need:
- Source‑level pool for channel reporting (e.g., Paid Search vs. Organic vs. Direct).
- Keyword/session pool for PPC keyword attribution.
- Campaign‑specific pools if you have high‑volume campaigns with overlapping traffic windows.
How big should the pool be? There isn’t a single credible, vendor‑independent number that applies to all sites; vendors say pool size depends on traffic and session lifetime. See the note in [CallRail API docs] that recommendations vary and no universal figure exists. CallRail API docs
Use operational inputs instead of guessing:
- Peak concurrent visitors on pages that show a phone number.
- Average session duration on those pages.
- Expected share of traffic per channel and per campaign.
- How aggressively you cache pages or use static site generation (DNI must run after render).
Two practical TTL notes by vertical:
- Trades (plumbing, HVAC, electrical): shorter sessions and quick tap‑to‑call behavior—use shorter session lifetimes and ensure all high‑intent pages (landing pages, service‑area pages) swap numbers reliably. This aligns with vendor vertical guidance that highlights fast routing for service calls and keyword pools for PPC. See [Tracking your online marketing efforts guide]. Tracking your online marketing efforts (keyword/session pools)
- Dental/medical: prioritize consent and CRM/practice‑management integration so appointments and call outcomes tie back to the session; vendor dental guides emphasize compliance and joined reporting. See the [Dental Guide to Call Tracking]. Dental Guide to Call Tracking
Implement dynamic number insertion on your site (step‑by‑step)
Here’s a field‑tested flow using a third‑party DNI provider; the DIY path mirrors these steps with your own code.
- Inventory every phone number instance
- Visible text in headers, footers, hero sections, and contact pages.
- Click‑to‑call links (tel:), CTAs, popups, and forms.
- Numbers inside images, SVGs, or CSS content; these won’t swap automatically.
- Third‑party widgets (review badges, appointment popups) that print your number.
- Install the vendor snippet site‑wide
- Use the vendor’s swap script (e.g., CallRail’s swap.js). It doesn’t require jQuery and can be placed directly in your template or injected via Google Tag Manager. See [CallRail API docs]. CallRail API docs
- Place it early so numbers swap before a user taps. Vendor docs warn about race conditions if multiple scripts attempt to swap or if the swap runs too late. See [CallRail Dynamic Number Insertion overview]. CallRail Dynamic Number Insertion overview
- Configure pools and swap rules
- Define a keyword/session pool for PPC if you want keyword attribution. See [Tracking your online marketing efforts guide]. Tracking your online marketing efforts (keyword/session pools)
- Map channels using referrer/UTM logic. Most vendors auto‑detect gclid/gbraid for Google Ads.
- Exclude areas you never want swapped with attributes like data‑calltrk‑noswap. See [CallRail API docs]. CallRail API docs
- Handle non‑text phone displays
- DNI scripts replace visible text nodes. Numbers inside images, canvas, or CSS pseudo‑elements won’t be swapped and will leak untracked calls. Rewrite those elements or add small scripts to inject the swapped number. See the caveats in [CallRail API docs]. CallRail API docs
- Test swaps across channels and devices
- Paid: hit a real ad landing page. Organic: search your brand and click through. Direct: open a clean browser and paste the root URL. Confirm different numbers appear per source and that click‑to‑call links carry the swapped number.
- Test iOS and Android, Chrome and Safari, and a browser profile with strict tracking prevention. Vendor docs recommend full‑path testing and early placement to avoid race conditions. See [CallRail Dynamic Number Insertion overview]. CallRail Dynamic Number Insertion overview
- Record and consent
- If you’ll record calls, you’re responsible for obtaining consent as required in your state. If the DNI sets cookies, notify visitors accordingly. See [CallRail Dynamic Number Insertion overview] for the vendor’s notice obligations reference. CallRail Dynamic Number Insertion overview
Attribute calls to ads or organic channels the right way
There are three reliable paths to get call conversions into your reporting and optimization loops:
Use Google’s website call conversions
- Google can insert a forwarding number on your site for Google Ads traffic and attribute calls to ads and keywords. Implementation and import templates are documented in [Google Ads Help]. Google Ads Help
- Link Google Ads and GA4 so traffic‑source dimensions persist and conversions can be analyzed alongside other events. See [Google Analytics Help on traffic‑source dimensions and linking]. Google Analytics Help
Use your DNI vendor’s integrations/APIs
- Vendors capture source/campaign/keyword via DNI and push conversions back to Google Ads and GA4 through integrations or APIs. See [CallRail API docs] for reading call metadata and automations. CallRail API docs
- Keep Ads–GA4 linked so campaign data survives across systems per [Google Analytics Help]. Google Analytics Help
DIY events into GA4 and Ads
- If you built your own DNI, send a GA4 event for started/connected calls and import as a conversion. For Ads, follow the call conversion import instructions in [Google Ads Help]. Google Ads Help
For multi‑touch analysis beyond last click, export call events to GA4/BigQuery and apply your model there; Google documents how traffic‑source dimensions are preserved when systems are linked. See [Google Analytics Help]. Google Analytics Help
Avoid relying only on tel: click events. They miss manually dialed calls and desktop‑to‑mobile handoffs. Use session‑based DNI so calls are tied to the visitor’s actual source—the standard pattern documented by [CallRail Dynamic Number Insertion overview]. CallRail Dynamic Number Insertion overview
Example: a plumbing company running PPC + organic
- Pools: One keyword/session pool for Google Ads. One source‑level pool for Organic vs. Direct to cover brand searches and existing customers.
- Pages to prioritize: ad landing pages, “emergency service” page, each service‑area page.
- Routing: Calls during business hours route to dispatcher; after hours go to an answering flow. Use the vendor’s API to tag calls by outcome for reporting. See [CallRail API docs] for reading call metadata/flows. CallRail API docs
- TTL: Short session lifetimes to reflect “need help now” behavior, so numbers recycle quickly without collisions. Pool size depends on concurrent traffic; there’s no universal number—see [CallRail API docs] note that vendor recommendations vary. CallRail API docs
- Attribution: Send conversions back to Google Ads for keyword optimization via the vendor integration. Link Ads and GA4 so you can compare call conversions vs. form fills. See [Google Analytics Help] and [Google Ads Help]. Google Analytics Help Google Ads Help
- QA traps to avoid: header/footer numbers embedded in SVG logos; popups powered by a theme; images with the number baked in—all must be text‑based or programmatically swapped. See caveats in [CallRail API docs]. CallRail API docs
Example: a dental practice focused on booked appointments
- Compliance: Confirm call‑recording consent for your state and display a clear notice on IVR and website. Vendors state you’re responsible for visitor notification when cookies/recordings are used. See [CallRail Dynamic Number Insertion overview]. CallRail Dynamic Number Insertion overview
- Integration: Push call events and metadata (source, campaign, first‑time caller) into your practice‑management system or CRM so booked appointments, cancellations, and no‑shows roll up to campaigns. Vendor dental guides emphasize this linkage. See the [Dental Guide to Call Tracking]. Dental Guide to Call Tracking
- Pools: One pool covering Paid/Organic for website sessions, plus a keyword/session pool if you optimize by search terms.
- Patient experience: Ensure the swapped number routes to a line with live pickup during business hours and a voicemail/answering flow that references the practice by name.
- Attribution: Link GA4 and Google Ads so traffic‑source dimensions and conversions line up for ad optimization and broader analysis. See [Google Analytics Help] and [Google Ads Help]. Google Analytics Help Google Ads Help
Common failure points—and how to avoid them
- Not swapping every visible instance: Numbers in images, CSS, or third‑party widgets don’t swap automatically and leak untracked calls. Fix by converting to text or adding small DOM replacement scripts. See [CallRail API docs]. CallRail API docs
- Running multiple swap scripts: Two trackers race and numbers flicker or revert after a tap. Centralize on one DNI script and follow vendor placement guidance. See [CallRail Dynamic Number Insertion overview]. CallRail Dynamic Number Insertion overview
- No keyword pool for PPC: You’ll miss keyword‑level attribution without a session/keyword pool. See the [Tracking your online marketing efforts guide]. Tracking your online marketing efforts (keyword/session pools)
- Testing only in one browser: Ad/tracker blockers and strict privacy settings can delay or block swaps; test on iOS Safari and Android Chrome at minimum. Vendor docs recommend broad testing. See [CallRail Dynamic Number Insertion overview]. CallRail Dynamic Number Insertion overview
- Recording without consent: Especially risky for medical/dental. Add clear IVR/website notices. See [CallRail Dynamic Number Insertion overview]. CallRail Dynamic Number Insertion overview
- Tracking only click‑to‑call: Misses manually dialed calls. Use session‑based DNI per [CallRail Dynamic Number Insertion overview]. CallRail Dynamic Number Insertion overview
Quick answers to the three big questions
- Which call tracking method should you use? If you only care about Google Ads, start with Google’s website call conversions per [Google Ads Help]. If you need multi‑channel coverage and APIs, use a third‑party DNI provider as described in [CallRail Dynamic Number Insertion overview] and [CallRail API docs]. If you require full control and have engineering support, build on Twilio following [Twilio best practices]. Google Ads Help CallRail Dynamic Number Insertion overview CallRail API docs Twilio best practices
- How do you implement dynamic number insertion? Install the vendor snippet site‑wide or via GTM, configure pools (source‑level and keyword/session as needed), exclude off‑limits elements with data attributes, handle non‑text numbers manually, and test across channels/devices. See [CallRail API docs] and [CallRail Dynamic Number Insertion overview]. CallRail API docs CallRail Dynamic Number Insertion overview
- How do you attribute calls to ads or organic? Use Google’s website call conversions for Ads‑only, or have your DNI vendor send conversions to Google Ads and GA4. Link Google Ads–GA4 so traffic‑source dimensions persist for analysis. See [Google Ads Help] and [Google Analytics Help]. Google Ads Help Google Analytics Help
If you want this wired into a custom site with clean testing and a live analytics view, Fluxaro builds hand‑coded, conversion‑focused websites and also handles call tracking as part of marketing and growth work. See what we build on our Services page, or browse live Examples.
Your next step
Pick your method (Google Ads first‑party, third‑party DNI, or DIY), then inventory every phone number on your site and set up your first pool. If you want a practitioner to implement it end‑to‑end and validate attribution, book a quick call with us here: Book a call.
Common questions
Do I need a different tracking number for every traffic source?
Not necessarily. A source‑level pool can cover multiple channels by assigning numbers at the session level based on referrer/UTMs. For PPC keyword attribution you’ll need a keyword/session pool as documented in vendor guides.
Will dynamic number insertion hurt my local SEO or NAP consistency?
DNI swaps numbers in the rendered page for users, not in your structured data or business listings. Keep your canonical business number consistent in Google Business Profile and citations; use DNI only on the website.
How do I send call conversions back to Google Ads?
Use Google’s website call conversions with a Google forwarding number, or connect your call‑tracking provider’s integration/API to push conversions. Google documents both paths, including import templates, in Google Ads Help.
What should I test before going live?
Hit real landing pages from Paid, Organic, and Direct; verify different numbers display and tel: links use the swapped number; test on iOS and Android; and confirm conversions appear in Google Ads and GA4 after linking the accounts.
Fluxaro builds custom-coded websites and software for small local businesses — no templates, and you only pay for the features you actually want.
Book a free 15-minute callSources (8)
- Dynamic number insertion overview – CallRail Help Center
- Import phone call conversions - Google Ads Help
- CallRail API v3 Documentation
- Phone Number Management | Twilio
- Tracking your online marketing efforts (CallRail guide, PDF)
- About traffic-source dimensions - Analytics Help
- Best practices for phone number use | Twilio
- Dental Guide to Call Tracking (CallRail PDF)