Migrating Off a Retired UTM Tool Without Breaking Links
Last updated
When your UTM tool is being retired, export everything it holds while it still answers. Then rebuild the naming model it enforced in the new tool, and import only the links still in circulation. Short links on a domain you own survive the move: point DNS at the new tool and recreate their slugs. Links on the vendor’s own domain can’t move at all, so plan reprints and replacements for them before the account closes.
TL;DR
- Export before anything else: links, value lists, naming docs, click history, and every short-link domain with its destinations. A closed account takes all of it with it.
- Old rows are evidence. Read them to recover the fields and the rules behind them, build those, and leave the rows behind.
- Import only the live set (links still in print or in running placements) through a CSV round trip that validates every row.
- Short links on your own domain move with a DNS change and recreated slugs. Links on a vendor’s domain last only as long as the vendor keeps serving them.
- Put dates on the cutover. Start about eight weeks before the old tool goes dark.
Export Everything While the Old Tool Still Answers
The retirement notice starts a clock.
Once the contract lapses or the in-house builder’s server gets decommissioned, whatever you didn’t export is gone. And what teams forget is everything around the links.
Pull all of this, in the tool’s own format first, then again as CSV:
| Export | Why you’ll want it |
|---|---|
| Every link, including archived and paused ones | The raw evidence for rebuilding the model, and the only record of what was ever sent out |
| Every dropdown or values list, with its full option set | The allowed values, including retired ones that still appear in old data |
| Naming docs, wiki pages, onboarding decks, the pinned message in the channel | The rules people were told, to compare against the rules they followed |
| Click history, as granular as the tool allows (often per-link totals, and only as far back as your plan kept) | Your new tool starts counting on cutover day. Old clicks don’t come with you |
| Short-link domains, with every slug and its current destination | The map for keeping printed and live links working |
| Integrations and scheduled exports | Everything downstream that breaks when the old tool stops answering |
| Users, and which team each belongs to | Who used which fields, which shows you where the model forks |
If the tool has both an API and a UI export, use both and compare row counts. UI exports tend to cap rows or drop archived items, and you won’t know which until you check.
And screenshot the forms. Option order and help text don’t survive a CSV. For an in-house builder, the form is often the only documentation anyone kept current.
Read the Rows to Recover the Model
Here’s the mistake that makes migrations drag. The team exports 40,000 rows (an illustrative number), imports all 40,000 into the new tool, and calls it done. Now the new tool holds every misspelling a contractor ever typed, and it validates none of them, because the rules were never written down anywhere the new tool could read.
The rows aren’t the asset. The model behind them is.
A model is four things: the fields, the values each field allows, the rules that assemble and constrain them, and which teams use which parts. Your old tool enforced some version of that, even if nobody could describe it. Your job is to get it back out.
Start with a frequency count per field. Count distinct values in utm_source, utm_medium, and every custom field. The shape of each distribution tells you what the rule was:
- A short list with a long tail of near-duplicates (
linkedin,LinkedIn,linkedin.com,li) means there was a picklist and people found ways around it. Keep the list. Map the tail. - Hundreds of distinct values with a repeating structure (
webinar-product_demo-2026_09,webinar-onboarding-2026_10) means a concatenated name. Work out the segments and their order. - Hundreds of values with no structure means free text. Decide now whether it stays that way. It usually shouldn’t.
Then find the forks. Filter by team. Paid media probably needs ad group and match type; email probably needs a send date and a list name. Different work needs different forms built on the same shared fields, and the export shows you exactly where each team’s form differs.
Then write the mapping. A two-column table: old value, canonical value. Anything nobody can identify gets flagged for its owner to decide. You’ll use this mapping twice, once for the live links you import and once in your reporting layer, where historical data keeps its old values forever.
We’ve talked with a team whose link builder had been written in-house by someone who had since moved on. The dropdowns still worked, but nobody could edit them, and the tool was shaped so closely around how that organization worked that no off-the-shelf product looked like a match at first. The rules existed. They were locked in code.
If your old tool was a spreadsheet, the same method applies, and our comparison with spreadsheets has a step-by-step version for a sheet. For settling the naming rules themselves, the UTM naming conventions guide covers segment order, separators and placeholders like _na_.
Rebuild the Model, Then Import Only the Live Set
With the model recovered, build it before you move a single link.
In Terminus, the marketing taxonomy governance platform, that means a governance model: fields with their rules attached, picklists that supply every dropdown, and taxonomies that decide which fields each team’s form shows. What you found in the rows maps across directly:
- The short list with a long tail becomes a static picklist. The tail doesn’t make it in.
- Values that depend on another choice (sources that only make sense for a given medium) become a hierarchical list, where picking the parent narrows the child options.
- The structured campaign name becomes a concatenated field, assembled from its segments, so
us-paid_social-linkedin-year_end-awareness-2026_q4is spelled the same way every time by construction. - Casing and character rules become validation. Lowercase on the way in, spaces to underscores, refuse what doesn’t conform.
Build it as a draft. The team keeps working in the old tool while you edit, and nothing reaches them until you publish. If you’d rather not start from a blank page, the template library has starting models by use case and team maturity. To see what a governed model refuses, try the live demo. Then start the 21-day trial, no credit card required, and build the draft against your own frequency counts.
Now the import, and the one term worth carrying through the rest of this post: the live set. The live set is every link someone could still click next month. Printed on packaging, running in an ad, sitting in an email signature, pinned in a social bio. Everything else is history, and history stays in your export.
The live set is often much smaller than the full export. Filter the export for links with clicks in the last 90 days, then add anything known to be in print or in long-running placements, whatever its recent traffic. A QR code on a conference booth panel in storage shows no recent clicks, and it will be scanned again next spring.
Load the live set through a CSV round trip. In the Grid builder, export an empty grid to get a template keyed by field handles, paste in the live set with every old value already run through your mapping, and import. Every row goes through the same validation as a link typed by hand, so the import doubles as a test of the mapping: a row that fails is a value you haven’t mapped yet. The API applies the same validation if you’d rather script it. Professional imports up to 25 records at once and Business up to 1,000, so split a larger live set into batches.
Don’t import first and plan to clean later. A dirty import hands your team the same mess inside a nicer interface.
Keep Printed and Live Links Working
A printed link outlives the tool that made it.
Picture a product insert with a QR code, printed in a run meant to last two years. The tool behind it gets retired in year one. Nobody remembers the insert. For the next twelve months every customer who scans it lands on a generic error page from a company you no longer pay, and your analytics records nothing, because the visitor never reached your site.
Whether you can prevent that depends entirely on whose domain sits in front of the slash.
Short links on a domain you own
If your short links run on your own hostname, say go.example.com, you control its DNS, so you control where those links resolve. Moving them takes two things: point the hostname at the new tool, and make sure every slug in the live set exists there with the right destination.
Check who holds the registration first. If the old vendor bought the domain for you or hosts its DNS, move both into an account your company controls well before cutover, because a registrar transfer can take several days.
In Terminus, you add the domain, point DNS at us (a CNAME for a subdomain, A records or your provider’s ALIAS for a bare domain), and run the check. HTTPS is issued automatically once the domain verifies. Then you recreate the live set’s slugs by importing them: a short-link field set to let people write their own slug accepts the old slug straight from the CSV.
Three details decide whether that goes cleanly:
- Verification needs the DNS to point at us first. Terminus proves ownership over HTTP, so the domain can’t be chosen on a short-link field, or carry links, until the record has moved and the check passes. Until then, visitors on existing links get a browser error. So the cutover hour runs in a fixed order: switch DNS, verify, point the short-link field at the domain and publish, then import the live set. Have the import file finished and tested against a spare subdomain before you touch DNS, and switch during a quiet hour.
- Some old slugs won’t fit. Slugs in Terminus use letters, digits, hyphens and underscores. Slashes and dots aren’t allowed, so path-style slugs like
spring/offerneed new names. On a custom domain they’re also unique regardless of letter case, so if your old tool generated mixed-case random slugs,aB3xZandAb3xzcan’t both exist. Find these collisions in the export during planning, while there’s time to decide what each one becomes. - Set a fallback page. Any slug you missed or couldn’t recreate sends the visitor to a page you choose instead of a 404. The redirect doesn’t carry the missed slug, so tag the fallback URL with its own campaign value, such as
short_link_fallback, and watch its traffic the week after cutover. If visits keep arriving, compare the live set against your final slug export to find what’s missing.
A reporting note. Terminus tells a QR scan from a link click by a marker in the codes it generates. Codes printed by your old tool don’t carry it, so their scans report as link clicks. Don’t read that as a sudden collapse in QR usage.
Short links on the vendor’s domain
If your links look like vendor-domain/abc123, nothing you do at your registrar moves them. The vendor owns that DNS, and those links stop resolving whenever the vendor stops serving them.
What we’d do, in order:
- Ask the vendor, in writing, what happens to redirects after the shutdown date, after cancellation and after a downgrade. Get the answer before you plan around it.
- If only your account is closing, not the product, keep it at its cheapest tier until print runs out, provided redirects survive a downgrade. For long-lived packaging, that can cost less than a reprint. If the product itself is shutting down, there’s no tier to keep, so go straight to replacements and reprints.
- Replace every digital placement you control. Email signatures, bios, evergreen posts, help-center articles. Build the replacements on your own domain this time.
- Schedule reprints for the rest, longest shelf life first: signage and packaging before brochures.
If you’re choosing where the next generation of short links lives, this is the case for a domain you own, whichever tool serves it. Custom domains are on every Terminus plan.
DNS and redirect mechanics, briefly
General guidance for whoever makes the DNS change:
- Lower the TTL ahead of time. A record’s TTL is how long a resolver may cache it before asking again (RFC 1035, section 3.2.1). Drop the short-link hostname’s TTL to a few minutes at least one full old-TTL before cutover. Cached copies of the old record will have expired by then, and a rollback takes minutes.
- A bare domain can’t take a CNAME. A name with a CNAME record can hold no other data (RFC 1034, section 3.6.2), and a zone apex always carries SOA and NS records. So an apex needs A records, or your DNS provider’s ALIAS or flattening feature.
- Know which redirect your old tool served. A 301 can be cached without explicit cache headers (RFC 9110, section 15.1; RFC 9111, section 4.2.2), so unless the old tool’s responses limited caching, a browser that followed an old 301 short link may later go straight to its old destination without asking the shortener. The visitor still arrives; the new tool just never counts that click. A 302 isn’t cached unless the response explicitly allows it, which is why Terminus short links answer with a 302: change a destination and the next click follows it. Our URL shortener roundup has a one-line curl check for the status and cache headers.
One more, for any paid tool: don’t move a production domain onto a trial you haven’t committed to. When a Terminus trial ends without a plan, the account locks and links stop redirecting until you subscribe. Prove the steps on a spare subdomain during the trial, then move the real hostname.
Keep the Downstream Consumers Fed
The old tool had readers you’ve forgotten about. A dashboard filtering on exact utm_medium values. A warehouse job expecting specific column names every Monday.
A team we spoke with fed its tracking codes from a shared sheet into an analytics upload, which worked only because the column names never changed. They wanted old and new running side by side for months, so reports could prove the new output matched. That’s the right instinct for reporting.
Another team’s link form lived inside a marketing platform being switched off, while the CRM that received its campaign records was staying. Retiring the form meant finding a new source for those campaign records as well as a new link builder.
So for every consumer on your integrations list, answer two questions. What exactly does it read? And what will produce that after cutover?
In Terminus, the records CSV export uses your field names as column headers, so name the fields to match what a consumer expects and it keeps reading the file. The API returns each record in the same shape every time. On the Business plan, outbound connectors push that same shape to an endpoint you run whenever a record is approved, changed or archived, so a downstream system receives changes instead of polling.
And a view we hold: a new tool doesn’t fix a process on its own. If people bypassed the old builder, they’ll bypass the new one for the same reasons. Ask them why before cutover, while the answers can still change the model.
The Cutover Checklist
Dates make this real. Say, as a hypothetical, the old tool goes dark on Friday, January 29, 2027. Work backward.
| Date | Do this | Done when |
|---|---|---|
| Fri, Dec 4, 2026 | Run every export. Compare API and UI row counts. Screenshot every form. Ask the vendor about redirects after shutdown and cancellation. | Exports live somewhere that doesn’t depend on the old tool |
| Fri, Dec 11 | Frequency counts, forks by team, the old-to-canonical mapping. List every downstream consumer. | Every live value maps to a canonical value or is flagged |
| Fri, Dec 18 | Build the model as a draft. Pilot it with one team. Connect a spare subdomain to prove the DNS steps. | The pilot team builds real links without asking for help |
| Fri, Jan 8, 2027 | Publish the model. New tagged links come from the new tool from here on; short links on your domain stay in the old tool until cutover. Tell downstream consumers the date. If you’re on a trial, pick a plan. | Nobody opens the old builder for a new tagged link |
| Fri, Jan 15 | Identify the live set. Order reprints for vendor-domain links. | The live set is one file, and reprints are ordered |
| Mon, Jan 18 | Lower the short-link hostname’s TTL. Test the import CSV against the published model. | A test import passes validation |
| Wed, Jan 20 | Freeze short-link creation in the old tool. Re-export slugs so the live set is final. | Every short link is in the import file |
| Thu, Jan 21 | Cutover, in a quiet hour: point DNS, verify, set the fallback page, switch the short-link field to the verified domain and publish, import the live set in batches (approving them if the workspace requires review), then test a sample of slugs including printed ones. | The sample resolves to the right destinations |
| Thu, Jan 28 | Review fallback-page traffic. If it isn’t near zero, compare the live set against the final slug export and recreate what’s missing. Confirm consumers got post-cutover data. Restore a normal TTL. | Fallback traffic is near zero |
| Fri, Jan 29 | Final export of click history and anything changed since December. Let the old tool go. | Nothing you need still resolves through the old tool |
The cutover sits eight days before the deadline on purpose. Something will turn up that week, and you want the old tool still answering when it does.
Put your real shutdown date in the last row, count back eight weeks, and run the exports this week.
FAQ
Can I import my old tool’s historical clicks into Terminus?
No. Click analytics in Terminus begin with the first click a link receives in Terminus, grouped by the governed fields recorded at click time. Export click history from the old tool, as granular as it allows, and keep it in your warehouse alongside the new data.
Should I import every old link so the history is in one place?
We wouldn’t. A full import brings every misspelling into a tool that’s supposed to enforce clean values. Import the live set and keep the full export as your archive. Apply the old-to-canonical mapping to historical data in your reporting layer.
How do I find which links are still live?
Filter the export for links clicked in the last 90 days, then add anything known to be in print, on packaging, in email signatures or in long-running ads, whatever its recent traffic. Printed codes often go quiet for months and come back.
What happens to short links on my own domain when I switch tools?
They keep working if you point the domain’s DNS at the new tool and recreate each slug there with its destination. If the new tool supports a fallback page (Terminus does), any slug you miss lands there instead of a 404, so watch that page’s traffic after cutover.
Can I keep short links that live on the old vendor’s domain?
You can’t move them. The vendor controls that domain, so those links resolve only as long as the vendor keeps serving them. Replace every placement you control, and ask in writing what happens after cancellation before paying for reprints.
Do I need to rename fields to match the old tool?
Only where something downstream depends on the names. The records CSV export uses field names as column headers, so name each field to match the column your warehouse job expects and it keeps reading the file. A classification upload usually needs its own template, so plan a small transform step for that either way.
How long does a migration like this take?
The export and the DNS change take hours. Recovering the model and agreeing the mapping take weeks, because they need decisions from the people who own each channel. A realistic plan spans about eight weeks, including a pilot and a buffer before the old tool closes.
Should we run the old and new tools in parallel?
For reporting, yes, while the old tool still answers: compare outputs until downstream consumers confirm the new data matches. For building links, no. Once the model is published, new tagged links come from the new tool only. The one exception is short links on your own domain, which stay in the old tool until the DNS moves and are then recreated with the rest of the live set.
Every account starts with a 21-day trial, no credit card required.