Back to Blog
Tutorial14 min read

CallRail Migration Guide: Moving Tracking Numbers and Attribution to VeloCalls

Step-by-step CallRail migration — export number pools, rebuild DNI, port tracking numbers, and re-map call attribution without losing data.

Look, CallRail built a solid product. Its dynamic number insertion is probably the most polished in the market. Its form tracking integration is genuinely useful. For agencies managing 15 clients on a shared account, CallRail often makes sense.

But the economics shift when you're a single-vertical operator running high call volume. Per-number monthly fees add up. And if you're also doing pay-per-call — not just tracking attribution but actually routing calls to buyers — you need routing features CallRail doesn't have.

This is the step-by-step walkthrough for moving from CallRail to VeloCalls. Tracking numbers, DNI, attribution mapping, the whole thing. Plus the mistakes people commonly make, like cancelling a CallRail account before confirming port requests have completed.

What You'll Have at the End

By the end of this tutorial, you'll have:

  • All CallRail tracking numbers ported or replaced
  • Dynamic number insertion rebuilt on your landing pages
  • Call attribution passing through to your CRM and ad platforms
  • Routing rules configured (if you're doing pay-per-call)
  • Historical data archived before cancellation

Straightforward setup — one website, one number pool, basic attribution? The setup is a weekend project. Maybe less. The 7-14 day parallel run in Step 9 comes on top of that.

But if you're running DNI across 30 landing pages with custom integrations feeding Salesforce, budget two weeks for setup alone and clear your calendar. I'm serious. This is not the migration you knock out between other tasks.

Prerequisites

Before you start:

  • CallRail admin access for exports and number management
  • VeloCalls account — free trial, no card required
  • Access to your website for DNI script replacement
  • Carrier account (Twilio, Telnyx, or Bandwidth) if using BYOC
  • Your Google Ads / Meta / analytics accounts for conversion tracking updates
  • 2-3 hours blocked for the initial export and audit

Know your current call volume. You'll use it to estimate per-minute costs. VeloCalls pricing is per-minute, lifetime-usage-tiered. Managed Carriers start at 4¢/min (0-10K lifetime minutes) and step down to 2¢/min at 200K+ lifetime minutes. BYOC starts at 2¢/min and drops to 0.5¢/min at scale.

Step 1: Export Everything From CallRail

Pull all your data while you still have access. This is your migration bible.

Tracking numbers. Export the list from CallRail's tracking numbers page: phone numbers, friendly names, which website or campaign they're assigned to. If you're porting these numbers, you'll need the actual phone number strings for port requests.

Number pools. Document each pool: how many numbers, which domain it's assigned to, any source or campaign filters. CallRail pools are the heart of their DNI — you'll recreate this logic in VeloCalls.

Call history. Export the call log for the full date range you care about: caller ID, tracking number, duration, source attribution. Download recordings separately if you need the audio files — and do it before the account closes.

Integrations. Screenshot or document every integration: Google Ads conversion import, Salesforce CRM push, HubSpot webhook, whatever you've wired up. These connections break during migration. You'll rebuild them pointing to VeloCalls.

DNI script configuration. Note which domains have DNI installed, what the swap targets are, and any custom CSS selectors you configured. You'll need this when you install VeloCalls DNI.

What you should have after this step: a folder with number lists, pool configurations, call history CSVs, integration docs, and DNI settings. Don't skip this. Operators sometimes cancel CallRail, realize they needed historical data a month later, and find out it was gone. Export everything.

Step 2: Audit and Decide What You Actually Need

This is where you simplify.

Honestly? Most CallRail setups have cruft — numbers nobody calls, pools for campaigns that ended six months ago, integrations that push to a CRM nobody checks. It's embarrassing how much dead weight accumulates when you're busy running campaigns instead of cleaning up after them.

Go through your exports and ask:

  • Which tracking numbers received calls in the last 90 days?
  • Which number pools are actually doing DNI swaps? (Check your analytics for traffic to those pages)
  • Which integrations actually get used?

Document your simplified list:

  • Active tracking numbers (the ones you'll port or replace)
  • Active number pools (the DNI configurations you'll rebuild)
  • Active integrations (the CRM/ad platform connections you'll re-wire)

Step 3: Set Up Your VeloCalls Account

Create your account at velocalls.com. Free trial, no credit card required.

First decision: Managed Carriers or BYOC?

Managed Carriers — VeloCalls handles telephony. You provision tracking numbers from the platform. Pricing starts at 4¢/min and steps down as you scale. Simple. No carrier relationship to manage.

BYOC (Bring Your Own Carrier) — You connect your Twilio, Telnyx, or Bandwidth account. Pricing starts at 2¢/min (Starter tier), dropping to 0.5¢/min at 200K+ lifetime minutes. Lower platform cost, but you manage the carrier.

For CallRail migrations, BYOC often makes sense if you're porting numbers. Port your CallRail numbers to Twilio or Telnyx, then route through VeloCalls. Your callers see the same numbers they've always seen.

If you're starting fresh and don't care about keeping specific numbers, Managed Carriers is easier.

Step 4: Port or Provision Tracking Numbers

This is the scary part. Numbers are where things go wrong.

(Deep breath.)

Option A: Port existing numbers.

If your tracking numbers are on yard signs, truck wraps, Google Business Profile, or anywhere else callers see them — port them. Don't change numbers that people have saved.

Port process:

  1. Choose your target carrier (Twilio, Telnyx, or Bandwidth), which you'll then connect to VeloCalls as BYOC
  2. Gather your port information: current carrier name (CallRail's underlying carrier varies), account number, PIN or CSR, authorized contact
  3. Submit port request through your new carrier
  4. Wait — typically 7-14 business days for standard numbers, longer for toll-free

Critical: Don't cancel CallRail until ports complete. The numbers need to be active to port. Canceling first kills the numbers.

Option B: Provision new numbers.

If you're using BYOC, provision in your carrier account, then add them to VeloCalls. If using Managed Carriers, provision new numbers from the platform.

During porting, run parallel. Old CallRail numbers stay live until port completes. New VeloCalls numbers are ready. Test the new numbers work before updating anything public-facing.

Step 5: Rebuild Dynamic Number Insertion

CallRail's DNI is probably why you picked CallRail in the first place. The good news: DNI is a solved problem. Every call tracking platform does it similarly.

Remove CallRail's DNI script.

Find the CallRail JavaScript snippet on your site. It's usually in the header or before the closing body tag. Looks something like:

<script src="//cdn.callrail.com/companies/XXXXX/..."></script>

Remove it. If you're using a tag manager (GTM), find the CallRail tag and pause or delete it.

Install VeloCalls DNI.

In VeloCalls, open the DNI setup for your number pool and copy the JavaScript snippet. Add it to your site the same way CallRail's was installed — header, footer, or through your tag manager.

Configure swap targets: which phone number(s) on your pages should be replaced with tracking numbers? You'll typically point the script at them with a CSS selector.

Example: If your hardcoded number is in an element like <a href="tel:+15551234567" class="phone-link">, configure the selector as .phone-link or a[href^="tel:"].

Test DNI before going live.

Open your site in incognito. The phone number displayed should be a VeloCalls tracking number, not your original hardcoded number. Click through from a Google ad or UTM-tagged link — the number should reflect that source in your VeloCalls dashboard.

Common DNI issue: caching. If your site uses aggressive caching or a CDN, the old CallRail-swapped numbers might persist. Clear cache, purge CDN, test again. Then test once more because caching is a common source of stale numbers.

Step 6: Re-Wire Call Attribution and Integrations

CallRail's integrations break when you migrate. Every platform's webhooks and API connections are different.

Predictable, but annoying as hell.

Google Ads conversion tracking.

In CallRail, you probably had Google Ads conversion import enabled — phone calls from click-to-call or website calls showing as conversions in Google Ads.

On VeloCalls, rebuild this with Google Ads offline conversion import: capture the GCLID on your landing pages, send completed calls out through a webhook or the REST API, and upload them to Google Ads with the GCLID attached. Decide up front which calls count as conversions (duration threshold, first-time caller, etc.).

CRM push (Salesforce, HubSpot, etc.).

Re-create webhook connections by adding a webhook endpoint in VeloCalls.

Typical setup:

  • Endpoint URL: your CRM's webhook receiver
  • Trigger: the call event you want to push (for example, a completed call)
  • Fields to map: caller number, tracking number, duration, source, recording URL

VeloCalls field names differ from CallRail. Your CRM might need payload mapping adjustments. Test with a few calls before cutover.

Form tracking — the exception.

Here's the thing: VeloCalls doesn't do form tracking. CallRail does.

If you're using CallRail's form tracking alongside call tracking, you have options:

  1. Keep CallRail for forms only, on the smallest plan that includes form tracking
  2. Switch to a dedicated form tool (HubSpot forms, Gravity Forms with webhooks, Typeform, etc.)
  3. Roll your own UTM pass-through — forms capture UTMs in hidden fields, submit to your CRM with source data attached

Many operators prefer separating form and call tracking anyway. Different tools, different optimization levers. (Strong opinion: mixed-purpose tools rarely excel at either purpose. Fight me.)

Step 7: Configure Routing (If Doing Pay-Per-Call)

CallRail is primarily a tracking tool. Calls come in, you see attribution, calls ring your business line. Simple.

VeloCalls can do that too — but if you're doing pay-per-call, you also get the pay-per-call routing CallRail isn't built for: multiple buyers, real-time bidding, buyer caps.

If you're just tracking calls (not routing to buyers):

Set up a simple routing rule that sends every call on the tracking number to your main business line.

If you're doing pay-per-call:

Add each buyer with:

  • Target phone number
  • Volume caps
  • Operating hours
  • Geo restrictions

Then build routing rules that decide which calls go to which buyers based on geography, time, buyer bids, caller input (IVR), or custom rules.

If you're new to pay-per-call routing, our call routing best practices guide covers the basics.

Step 8: Test Before Cutover

I can't say this enough.

Test.

Test matrix — run at least 20 calls:

  • Call from a direct dial (no DNI, no tracking — baseline)
  • Call through DNI-swapped number from organic search
  • Call through DNI from a Google Ads click
  • Call through DNI from a Meta ad
  • Call at different times of day (if you have time-based routing)
  • Call that should hit overflow or voicemail

For each test, verify:

  • Call routes correctly
  • Attribution shows correct source in VeloCalls dashboard
  • Recording starts (if enabled — 3¢/min add-on)
  • Webhook fires to CRM with correct data
  • Google Ads sees the conversion (if conversion tracking enabled)

Common errors during testing:

DNI not swapping: Check script installation. Check CSS selectors. Check caching. The number displayed should be a tracking number, not your hardcoded business line.

Wrong source attribution: Verify UTM parameters are passing through. If you're using custom tracking URLs, make sure they match VeloCalls' expected format.

Recording not starting: Check that recording is enabled (3¢/min). For two-party consent states (California, Florida, etc.), configure a prompt that tells callers the call is being recorded.

Webhook not firing: Check endpoint URL. Check authentication headers. Check that the trigger event (a completed call, etc.) matches when you expect the webhook to fire.

Step 9: Run Parallel for 7-14 Days

Don't kill CallRail the day you finish setup.

Run both platforms in parallel:

  • Keep CallRail DNI live on the landing pages that carry 70-80% of your traffic
  • Move the pages carrying the other 20-30% to VeloCalls
  • Compare: attribution accuracy, call quality, CRM data delivery

After 7 days, if VeloCalls data matches or beats CallRail, flip the ratio. After 14 days, cut over fully.

Yes, parallel costs money. You're paying two platforms briefly.

Skip it at your own risk. Parallel running catches attribution bugs, routing edge cases, and CRM integration issues that would take weeks to diagnose after cutover. Operators who skip it tend to regret it.

Common Errors and How to Fix Them

Error: DNI shows the wrong number or doesn't swap

Cause: Script not loading, wrong CSS selector, or caching serving the old page.

Fix: Verify VeloCalls DNI script is installed and loading (check browser dev tools for network requests). Verify CSS selector matches your phone number elements. Clear all caches — browser, CDN, page cache plugins.

Error: Calls showing "direct" source when they should have attribution

Cause: UTM parameters not passing through, or DNI pool assignment misconfigured.

Fix: Check that your traffic sources include UTM parameters. Verify your tracking number pool in VeloCalls is configured to capture source data. Test with a known UTM-tagged link and confirm the source shows correctly in the dashboard.

Error: Google Ads not seeing conversions

Cause: Offline conversion upload not running, or GCLID not passing through.

Fix: Check that completed calls are reaching your Google Ads upload. Check that calls are matching to ad clicks (this requires GCLID capture — make sure your landing pages preserve the GCLID parameter).

Error: Webhook delivering incomplete data

Cause: Payload field mapping differs between CallRail and VeloCalls.

Fix: Review VeloCalls webhook payload structure. Update your receiving system to accept VeloCalls field names, or add a transformation layer (Zapier, Make) between VeloCalls and your CRM.

Next Steps

Once you're live on VeloCalls:

  • Enable AI conversation intelligence for intake QA — transcription at 4¢/min, sentiment at 5¢/use, AI summary at 10¢/call
  • Review your TCPA compliance setup — 2026 enforcement has teeth
  • Check vertical-specific setup guides: home services or legal/mass tort

Run the math in 30 days. Compare your per-minute VeloCalls cost against what CallRail was charging per-number monthly, factor in your call volume, and see where you landed. No spreadsheet template — just multiply your minutes by your tier rate and compare. Simple.

Whether it pencils depends on your minutes and how many numbers you were paying for. For agencies running 15 clients on a shared account with minimal call volume each, CallRail might still make sense.

We're not for everyone.

And honestly? That's fine. If CallRail serves you better, stay there. (If you're still evaluating, the pay-per-call benchmarks report has the industry cost comparisons. For Ringba users, check our Ringba alternatives comparison.)

Migration is the hard part.

You did it.

Frequently Asked Questions

How long does a CallRail to VeloCalls migration take?

Plan for 2-3 weeks. Week one is export, audit, and account setup. Week two is DNI rebuild, routing configuration, and number porting. Week three is parallel testing and cutover. Operators who rush this in a weekend usually spend the following month chasing attribution gaps.

Can I keep my CallRail tracking numbers when switching?

Yes. Port tracking numbers to your own carrier (Twilio, Telnyx, Bandwidth) and run BYOC on VeloCalls. Porting typically takes 7-14 business days. Run parallel numbers during the transition so you don't lose calls while the port processes.

What happens to my CallRail form tracking after migration?

VeloCalls focuses on call tracking and routing. For form attribution, you'll either keep CallRail for forms only, switch to a dedicated form tool, or wire form submissions through your CRM with UTM pass-through. Most operators separate call and form tracking anyway.

Will I lose historical call data when leaving CallRail?

No — export your call history before canceling. Export the call log with its source attribution, download any recordings you need, and store them externally. VeloCalls starts fresh with new data, so your historical archive will have a clean break at migration date.


Try VeloCalls for Your Vertical

AI calling + pay-per-call platform built for HVAC, plumbing, roofing, PI lawyers, Medicare brokers, and insurance. Smart routing, real-time bidding, visual IVR builder, AI conversation intelligence. Per-minute pricing — Managed starts at 4¢/min, BYOC at 2¢/min, both drop as you scale.

See pricing → · Book a demo

callrail-migrationcall-trackingdynamic-number-insertionnumber-portingcall-attributionbuildinpublicsaasstudioaiworkforcebuildwithclaude
Share

Ready to try VeloCalls?

Set up intelligent call tracking and routing in minutes. No credit card required.

Get Started Free

Stay Updated

Get the latest articles and industry insights delivered to your inbox.

No spam. Unsubscribe anytime.

Related Articles