---
title: Call Attribution Strategy — DNI vs. Static Numbers
type: article
created: '2026-04-05'
updated: '2026-04-05'
source_docs:
- raw/2025-12-12-internal-adava-care-callrail-setup-108448388.md
tags:
- callrail
- call-tracking
- attribution
- dni
- marketing-ops
- google-ads
layer: 2
client_source: null
industry_context: null
transferable: true
---

# Call Attribution Strategy — DNI vs. Static Numbers

## Overview

When running paid campaigns, the digital attribution path breaks the moment a visitor picks up the phone instead of filling out a form. Call tracking tools like [[tools/callrail]] solve this by inserting a forwarding layer — tracking numbers that record calls, capture source data, and pass the call through to the client's real phone system. The client's existing numbers remain unchanged.

The recommended approach is a **hybrid model** combining two complementary tracking methods: a Dynamic Number Insertion (DNI) pool for the main website number, and static tracking numbers for location pages and offline campaigns.

---

## The Two Methods

### Dynamic Number Insertion (DNI) Pool

**Best for:** Tracking calls originating from the main website, especially from paid ad traffic.

A JavaScript snippet (deployed via the [[tools/callrail]] WordPress plugin or direct script injection) monitors each site visitor and swaps the target phone number with a unique number from a pool. That pool number is reserved for the visitor for approximately 20 minutes. If they call within that window, CallRail captures the Google Click ID and attributes the call back to its original source — campaign, keyword, ad group, etc.

**Key parameters:**
- One pool per website (running two pools on a single site causes conflicts)
- Pool size should match expected concurrent visitor volume; 4 numbers is a reasonable starting point for most SMBs
- Swap target is a single number (e.g., the main number displayed in the header/footer)
- Attribution degrades if the visitor calls after the 20-minute window, but the call still routes correctly

**Limitation:** Google does not always connect the search keyword to the Click ID in real time — it can take up to 12 hours. A webhook can be configured to backfill this data retroactively.

### Static Tracking Numbers

**Best for:** Location-specific pages, offline campaigns (print, direct mail, billboards), and ad call extensions.

A static CallRail number is a permanent forwarding number assigned to a specific source. It records every call and captures available source data, but does not perform visitor-level swapping. The number is manually placed on the relevant page, ad, or printed material.

**Key parameters:**
- One static number per tracked source (one per location page, one per offline campaign, one per ad call extension)
- Must be manually updated in both the visible text and the `tel:` href link on the page
- Whisper messages (which announce the call source to the recipient before they speak) should be disabled initially to avoid staff confusion; enable once staff are trained
- Attribution granularity is lower than DNI — source is captured (e.g., "website"), but not keyword-level detail

---

## Hybrid Model in Practice

| Use Case | Method | Notes |
|---|---|---|
| Main website number (header/footer) | DNI Pool | Full ad source + keyword attribution |
| Individual location pages | Static number per location | Routes to that location's real number |
| Google Ads call extension / call-only ad | Dedicated static number | Name it clearly (e.g., "Glendale Google Ads") |
| Print ad / direct mail / billboard | Dedicated static number | One number per campaign for clean attribution |

> **Rule of thumb:** If it's on the website and you want to know which ad drove the call, use the DNI pool. If it's a specific place or campaign you want to isolate, use a static number.

---

## Attribution for Google Ads Specifically

Static location numbers will capture that a call came from "the website," but will not surface keyword-level data. For granular Google Ads attribution:

1. Create a **dedicated static CallRail number** for each Google Ads campaign or call extension
2. Use that CallRail number as the call extension number in Google Ads (instead of the client's real number)
3. Name the number descriptively in CallRail (e.g., "Glendale — Google Ads")

This gives you a clean signal: every call to that number came from that specific campaign.

---

## WordPress Implementation Notes

When deploying via the CallRail WordPress plugin:

1. Install and activate the **CallRail plugin** from the WordPress plugin directory
2. In CallRail, navigate to **Integrations → WordPress** to retrieve the WordPress-specific connection code (this is *not* the general API key)
3. Paste that code into the plugin settings under **Settings → CallRail → Plugin Key**
4. After saving, the DNI swap activates within a minute or two

After any phone number changes on the site:
- Clear the **WP Engine cache** (WP Engine → Caching → Clear All)
- Clear the **WP Rocket cache** (WP Rocket toolbar → Clear Cache)
- Verify changes using an **incognito window** to bypass local browser cache

---

## CRM Integration (Future)

Call recordings are available after the call completes. To surface recordings inside HubSpot leads, a **webhook** must be configured to pull the recording from CallRail and attach it to the corresponding contact/deal. This is not real-time — it runs post-call. See [[integrations/callrail-hubspot-webhook]] (future).

---

## Cost Considerations

Most CallRail plans include 10 numbers. Each additional number incurs a small incremental monthly cost. For accounts with many locations or campaigns, number count should be reviewed periodically against the plan tier.

---

## Reference

- First implemented for [[clients/adava-care]] — see [[meetings/2026-04-05-adava-care-callrail-setup]] for the full walkthrough
- Related tool: [[tools/callrail]]