Elido
10 min readFeatures

Link rot prevention strategy for short URL campaigns

How short links decay in the wild — DNS handoffs, expired SaaS, retired subdomains — and how to detect, fix, and sunset them at scale before they hurt conversions

Ana Kowalska
Marketing solutions engineering
Five-stage funnel from active short links through decay sources, broken-redirect detection, bulk update, and graceful sunset of retired campaigns

A short link is a long-lived promise. The destination on the other side is not. We have measured campaigns where 12% of short links from a product launch year resolved to 404, parked-domain HTML, or expired-SaaS marketing fluff inside 18 months. Those links live on in PDFs, podcast show notes, NFC tags, printed conference badges, and inboxes that never unsubscribe.

Short URL infrastructure makes link rot worse before it makes it better. Worse because the opaque short URL hides the decay from the recipient until the click fires. Better because a single redirect record is the only thing you change to repair every distributed copy at once.

This post is the operational playbook we recommend to marketing teams running active campaign pipelines on Elido: what causes short links to rot, how to detect rot before customers do, and how to fix at scale without breaking the analytics your auditors are tracking.

The W3C URI style note from Tim Berners-Lee in 1998 is still the cleanest framing: cool URIs don't change. Almost nobody follows it. A 2014 Harvard Law School study found that 49% of URLs cited in U.S. Supreme Court opinions no longer resolved; a 2024 Pew Research Center analysis of a quarter of all webpages from 2013 to 2023 found them gone. The numbers are bad for any URL. They matter more for short URLs.

A short link wraps two failure modes into one. The short URL itself can be revoked, expired, or repointed. The destination URL can vanish independently. The recipient cannot distinguish — they get a 404, a parking page, or a hostile redirect — and they blame your brand.

The failure surfaces we see most often, in rough order of frequency:

Marketing SaaS sunset. A landing page hosted on a tool the team stopped paying for. The DNS still resolves; the host returns a generic "site no longer available" page or an unauthenticated login screen. The destination URL never changed; the platform behind it did.

Subdomain retirement. Engineering retires promo.example.com after a brand refresh; the wildcard cert drops coverage; the CNAME points at nothing. Marketing finds out from support tickets two weeks later.

Product URL restructuring. A CMS migration moves every post from /blog/post-title to /insights/post-title. The 301s exist for three months, then someone clears the redirect table on a routine cleanup.

Domain non-renewal. Annual registration lapses, the domain enters redemption grace, and twelve to twenty-one days later it is back on the open market. Squatter auction bots see expired domains within minutes.

Acquisition or rebrand. The destination product gets acquired, the original brand URL redirects to the acquirer's homepage, and the campaign-specific landing page is gone.

Single-use signed URLs. Marketing forgets the gated-asset URL had a 90-day signature. The short link works for the first wave of recipients and dies before the second.

None of these are exotic. All are routine campaign-pipeline events.

A long URL in a magazine article gets read by a few thousand people in the month after publication, then forgotten. A short URL on a packaging label gets clicked for the product's full shelf life — two to four years for a CPG brand. The blast radius of a rotten short link is bounded by where you distributed it, not when.

This is also why a short-link platform is the right place to fix link rot. The redirect record sits in one Postgres row. Update the row, invalidate the cache, and every future click resolves to the new destination without reprinting packaging, recutting podcasts, or asking 40,000 newsletter subscribers to update their bookmarks. Smart links extend this: a single short link can route to different destinations based on device, geography, or campaign window, so "fixing rot" can mean redirecting expired campaign traffic to an archive page while live traffic continues to a current product page.

That single point of repair is the lever. The rest of this playbook is about pulling it before the damage shows up in click-through rates.

Detection: catching rot before customers do#

Three signals tell you a destination URL has decayed. None of them are reliable on their own. Together they cover most of the routes a campaign URL takes to a 404.

HTTP status checks on a schedule#

The cheapest signal. A periodic background fetch of the destination URL, recording status code, response time, and final redirect chain. 2xx is healthy. 3xx with a final hop to a non-original hostname is a red flag — the URL still works but you no longer control what it lands on. 4xx is broken. 5xx is probably transient; flag for re-check, not action.

Elido's url-scanner service re-fetches destinations on a rolling schedule for links created in the last 12 months, with a budget that keeps the scanner from hammering the same origin host with parallel requests. The default cadence is weekly for recently-created links and monthly for older ones; both tunable per workspace. Links older than a year are not in the rolling set yet — a known gap we documented in the security checklist post.

What status checks miss: a parking page that returns 200 OK with a fully-rendered HTML body selling something unrelated. The status code is fine. The content is not.

Content fingerprint diffing#

A second pass that hashes a stable subset of the destination's HTML — title tag, the first 2 KB of meaningful body text, the canonical link tag — and compares to the fingerprint captured at link creation. Drift past a threshold triggers manual review.

This catches expired SaaS landing pages, parked domains, and silent CMS migrations that left a redirect chain pointing somewhere unrelated. It does not catch normal page updates — a blog corrigendum, a product page repricing — without false positives, which is why the threshold and the review queue matter more than the detection.

Useful heuristic: if the title tag changed and the destination's domain registrar changed between scans, the URL has rotted. If only the title changed, the page was edited.

Click-side signals — drops, 404 alerts, broken-redirect counters#

The fastest signal is the one your audience generates. If a short link's click rate falls off a cliff in a 48-hour window with no campaign change, the destination is probably broken. If your destination tracking pixel stops firing while clicks continue, the destination has changed and no longer hosts your instrumentation. Both are detectable from Elido's analytics side without scraping.

We emit a link.health.degraded event on the standard webhook event bus for two conditions: when the destination's last 50 responses include more than 10% non-2xx, and when fingerprint drift crosses the threshold. The event is for ingestion into the customer's own alerting — Sentry, Opsgenie, Slack — so marketing ops finds out before recipients do. The payload is signed with the same HMAC-SHA256 scheme as click.recorded, so existing receiver code only needs a handler for the new event type.

The combination covers most failure modes above. The remainder — single-use signed URLs that expire predictably, acquisition rebrands you read about in TechCrunch — are best addressed at the source: a workflow that flags signed URLs at creation time, plus a quarterly sweep of destination domains against a sanctions and acquisition feed.

Fix at scale: bulk update without breaking everything#

A handful of broken links you fix manually. A campaign with 4,000 short links across nine subdomains and three printed assets you fix with bulk updates, in a way that preserves analytics continuity.

The wrong way: delete the broken short link and create a new one. That breaks every distribution channel and resets the analytics. The right way: update the destination_url of the existing short link. The slug stays the same, the analytics history stays attached, and every existing copy resolves to the new destination on the next click.

Elido's bulk update endpoint accepts an array of {slug, destination_url} pairs with the same idempotency guarantees as create. Each update is a single Postgres transaction; the L1 and L2 edge caches invalidate within seconds. CLI workflow examples with cursor pagination for inventories above 10,000 links live in the UTM templates guide.

Three patterns from production:

Sunsetting an expired campaign. s.elido.me/spring-launch was distributed for a campaign that ended four months ago and the landing page is being decommissioned. Rather than letting the link 404, repoint it to a graceful sunset page — "this campaign has ended; here is the current equivalent" — that forward-links to the current product page and is instrumented for attribution. Cheap to maintain, turns residual traffic into a measurable retention signal.

Cutover to a new destination. A product page moves from /products/widget-v1 to /products/widget-v2. The pattern: a one-time bulk update on every short link pointing at the old URL, paired with a 301 from old to new for non-short-link inbound traffic. Both should land in the same deploy window; doing only one leaves a window where analytics split between two destinations.

Repointing to an archive. If the original destination is genuinely gone — the SaaS shuttered, the domain auctioned, the brand acquired — and there is no current equivalent, point the short link at an Internet Archive Wayback Machine snapshot. This preserves citation continuity for anyone who shared the link as a reference, and documents the original for future audits. We have done this for shorts in published research papers; the Wayback URL is long, but the short link in the citation never had to change.

In all three cases the analytics history is preserved. Click-through rate, geo distribution, referrer mix — nothing resets, so marketing ops can still attribute residual traffic after the destination has rotated through three real URLs.

Some links should not be repaired. They should be retired. Test links from QA, one-off demo URLs, internal sales-enablement links replaced by a CRM workflow — these accumulate in every workspace as maintenance overhead with no marketing value.

Recommended pattern: two-step retirement. Deactivate the short link with a graceful sunset page explaining the link has expired and offering a current alternative, then schedule a hard delete 90 days later. The window catches the long tail of recipients still clicking the original distribution. Hard delete cleans up workspace inventory and ClickHouse partitions. Strict retention policies can shorten the window; legal-hold obligations can extend it indefinitely per link.

Custom domains make this cleaner. A retired campaign on b.elido.me/campaign-x is just gone. A retired campaign on links.your-brand.com/campaign-x carries brand association into the sunset page; the recipient sees your brand on the explanation, not a generic "link expired".

The operational scoreboard#

A working link rot program tracks four numbers per workspace:

  • Active short links scanned in the last 30 days — detection coverage.
  • Broken or rotted links detected per month — trends down once mature; spikes mean an upstream campaign workflow regressed.
  • Median time-to-repair — alert to bulk update.
  • Sunset versus repair ratio — healthy ratio favors repair for high-traffic campaigns, retirement for the long tail.

We surface all four on the workspace dashboard for Business and Enterprise. Free and Pro see alerts but not the aggregate scoreboard. The same metrics are emitted as Prometheus counters via the conversion-forwarding guide; metric names are stable across releases, so dashboards built today survive the next major version.

What we have not solved yet#

Two known gaps worth naming.

The url-scanner's rolling re-scan covers the last 12 months by default. Older links are not in the rotation unless the workspace opts in. We have customers with seven-year-old shorts on product packaging; for those the right answer is opt-in extended rotation, but the default needs to widen. On the roadmap for H2 2026.

Content fingerprint diffing produces false positives on dynamically-rendered pages — anything with a timestamp, personalized greeting, or A/B content in the first 2 KB of HTML. The threshold is per-workspace, but a smarter fingerprint that strips known-volatile elements would shrink the review queue.

Neither gap invalidates the playbook. They mean a portion of the inventory needs human review on a schedule rather than relying entirely on automation. The marketing ops team running this program already knows which campaigns sit outside the automation's coverage; that informal mapping is the most valuable artifact the program produces.


A rotten short link in a printed campaign costs more than a year of the scan service that would have caught it. The pricing page covers what is included by tier; the playbook above is operational guidance, not a sales pitch, but the cheapest scanner is the one that already has the link inventory and click history to detect anomalies against.

Try Elido

EU-hosted URL shortener with custom domains, deep analytics, and an open API. Free tier — no credit card.

Tags
link rot
link rot prevention
broken short links
url decay
short link maintenance
url scanner
bulk url update

Continue reading