How a 47-year-old Denver driver uncovered "the hidden loyalty tax" and quietly saved over $1,140 a year without sacrificing coverage.
I'm 47, and like most experienced drivers with a clean record, I assumed my insurance company rewarded my loyalty. It didn't. Last summer, right before my family packed up for our annual road trip from Denver to Estes, we got a renewal notice that had quietly crept up — again.
It's always a beautiful drive through Lyons into the foothills, but this particular trip on US-36 was different. That 1.5-hour drive ended up sparking a conversation that led us to a low-mileage discount worth over $1,100 a year to our family.
$1,140
saved per year — same coverage, actually better liability limits
If you're in your 30s, 40s, or 50s and you've been driving for decades, this is probably more relevant to you than you'd think. Here's what happened.

The Drive Itself: Still Beautiful, Still Easy
I'll keep this part short — if you're an experienced driver, you don't need a tutorial. The Denver-to-Estes route via US-36 is one of the most forgiving mountain drives in Colorado. Wide lanes, gradual elevation gain, speed limits in the 35–55 mph range, plenty of pullouts. In good summer conditions, it's a relaxing 1.5-hour drive with some of the best scenery in the state.
A Few Things I've Learned Over the Years
Leave early. By 10 AM in July, the road through Lyons can back up with weekend traffic.
Use lower gears on the descent home. Saves your brakes, especially hauling kids, gear, or a trailer.
Fill up in Denver or Boulder. Gas in Estes runs $0.40–$0.60 more per gallon.
Check COtrip.org before you go — especially in shoulder season, when early snow can surprise you in late September.

That's the easy part. Here's the part I didn't expect.
The Conversation That Changed Things
On the drive back, Karen pulled out the mail she'd grabbed on the way out the door. Sitting on top: our auto insurance renewal notice.
Our premium had gone up. Again. Third year in a row.
I'd been with the same insurer for over 15 years. Same two cars, same clean driving record, no accidents, no claims. And yet every year, the bill quietly crept up by $80, $120, $200.
When we got home, I spent about 20 minutes that evening looking into it. Here's what I found.
What Experienced Drivers in Their 30s–60s Are Quietly Overpaying For
This is the part I wish someone had told me 10 years ago. There are several discounts and adjustments that specifically benefit drivers with long, clean records — and most of us either don't know they exist or assume we already have them. We usually don't.
Long-Tenure Safe Driver Discount
10+ years with a clean record
$150–$400
Low-Mileage Adjustment
Under 7,500–10,000 miles/year — common for remote or hybrid workers
$200–$500
Multi-Policy Bundle Review
Home + auto with the same carrier — most bundles are outdated
$300–$600
Defensive Driving Course (50+)
Available to drivers 50+ in most states
5–15% off
Vehicle Safety Feature Update
Newer safety tech the insurer doesn't have on file
$80–$200
In our case, three things stood out:
I was driving way less than I used to — closer to 6,500 miles a year since switching to hybrid work in 2021. My policy still had me listed at "12,000+ miles annually."
Our home and auto bundle hadn't been re-evaluated since 2015.
Karen was eligible for a mature driver discount in our state that we'd never applied for.
Total adjustment after re-quoting and re-bundling: $1,140 less per year. Same coverage. Actually slightly better coverage on liability.
Note: I'm not saying everyone will save exactly that. But I'd bet good money most experienced drivers reading this are leaving at least $300–$500 a year on the table. Takes about 3 minutes. No credit check. No phone calls.
The Other Thing I Didn't Know: Teen Drivers Don't Have to Wreck Your Premium
This part is for the parents. Our oldest got his license last fall. The day we added him to our policy, our premium nearly doubled. I knew it would go up — every parent warns you — but the jump was brutal.
What I Didn't Know
Good Student Discounts (B average or higher) can cut a teen's portion by 15–25%.
Driver Monitoring Programs (apps that track braking, speed, phone use) can save another 10–30% for safe young drivers — most teens are actually safer than insurers initially assume.
Assigning the teen as primary driver of the oldest, lowest-value car in the household, instead of leaving it ambiguous, can save several hundred dollars a year.
Between these three adjustments, we knocked another $680/year off the teen-driver portion of our policy.

If you've got a kid who's recently licensed or about to be, this alone is worth 10 minutes of your time.
A Word on Coverage — Don't Just Chase the Cheapest Quote
I want to be straight with you here, because a lot of "save on insurance" content glosses over this: cheaper isn't always better. If you're in your 30s–60s, you likely have real assets — a home, retirement accounts, college funds. Going with bare-minimum liability to save $200/year is a bad trade. One at-fault accident with a seriously injured other party can come after everything you've built.
When I re-shopped, I actually increased my liability coverage from 100/300 to 250/500, and added a $1M umbrella policy. Total cost was still lower than what I'd been paying before, because the discounts more than offset the better coverage.
"The goal isn't the lowest premium. It's the right coverage at the right price — which for most experienced drivers is significantly less than they're paying now."
Editor's note: Coverage needs vary by state, assets, and household. The tool linked in this article gives a free, no-obligation comparison so you can see your own numbers rather than a generic estimate.
Back to Estes Park
We had a great trip, by the way. Stayed two nights at a cabin near Lake Estes. Hiked Bear Lake with the kids. Watched a herd of elk graze near the golf course at dusk — my younger one had never seen one up close and didn't say a word for about ten minutes, just stared.
These are the trips you remember. The kids are 14 and 16 now. I'm conscious that the window for family road trips like this isn't infinite.

Which is partly why the insurance thing hit me the way it did. That $1,140 a year? That's a long weekend in Estes every summer for the next decade. Or a chunk of the kids' college fund. Or just the quiet relief of not feeling nickel-and-dimed by a company I've been loyal to for 15 years.
Frequently Asked Questions
I've been with my insurer for 15+ years. Won't I lose my loyalty benefits if I switch?
Honestly, "loyalty benefits" are largely a myth in auto insurance. Studies have repeatedly shown long-tenure customers often pay more, not less. Re-shopping every 2–3 years is standard practice now.
Will checking quotes affect my credit?
Soft quote inquiries do not affect your credit score. Only a hard pull would, and reputable quote tools use soft pulls.
I drive a lot for work. Do these discounts still apply?
Some do, some don't. High-mileage drivers benefit more from tenure, bundling, and safety-feature discounts than from low-mileage adjustments. The tool below will show what fits your actual situation.
How often should I re-shop my policy?
Every 2–3 years at minimum, or any time you have a major life change — new car, new home, kid getting licensed, switching to remote work, moving, etc.
Is this worth the time if I think my rate is "fine"?
The average driver who re-shops saves $400+/year. Even if you're happy with your current rate, 3 minutes to confirm you're not overpaying is a reasonable use of time.
Final Thought
I'm not the type to chase deals or clip coupons. But there's a difference between being frugal and being asleep at the wheel — and on insurance, most experienced drivers I know are asleep at the wheel.
If you're 35 or 55, if you've been driving for decades, if you've got a family that depends on you — take 3 minutes. Worst case, you confirm you're already getting a fair deal. Best case, you free up a thousand bucks a year for something that actually matters.
This article reflects one reader's personal experience and is intended for general informational purposes. Savings vary by driver, state, and insurer. Not affiliated with State Farm.
/*
* Universal FB ad parameter passing script (Facebook / Meta ads -> tracker links)
* ------------------------------------------------------------------------------
* Landing page URL arrives like:
* https://site.com/article?sub1=
&sub2=&...&utm_medium=paid&fbclid=IwAR...
* Tracker links inside the article look like:
* https://trc.xxx.com/cvidl0k.php?key=...&transaction_id={TRANSACTION_ID}
* &sub1={{ad.id}}&sub2={{adset.id}}&...&fbclid={{fbclid}}
*
* What this script does:
* 1. Captures sub1-sub8 / fbclid / utm_* from the landing URL and persists them
* in sessionStorage (survives navigation to inner pages).
* 2. Resolves unreplaced {{...}} double-brace FB macros in tracker links.
* - {{fbclid}} is NOT a real FB macro and never gets replaced by FB;
* it is filled from the actual fbclid on the landing URL.
* - Parameters whose {{...}} macro cannot be resolved are dropped entirely,
* so macro literals never reach the tracker.
* 3. Single-brace macros (e.g. {TRANSACTION_ID}) belong to the tracker itself
* and are passed through untouched.
* 4. Appends missing params (fbclid by default) when absent from the link.
* 5. Optional: gtag events (offer_click / paid_visit) and an FB Pixel
* custom event on click.
*
* ES5 + IIFE, no build step required — safe to inline into any page.
* Coexists with the Google (MBL) script on the same page; namespace: window.FBL.
*/
(function (window, document) {
"use strict";
var CONFIG = {
// Tracker hostnames: any match is rewritten. Can be empty if hostPrefix is set.
trackerHosts: [
"trc.goodemocratic.online",
"trc.thecartoolkit.com",
"trc.norameasurestwice.com"
],
// Fallback prefix match: any host starting with "trc." is also treated as a
// tracker (handy when one script is shared across many sites). Set "" to disable.
hostPrefix: "trc.",
// Params appended to tracker links when missing (values come from captured params)
appendIfMissing: ["fbclid"],
// GA4: leave "" if the page already loads gtag/GTM; otherwise set "G-XXXXXXXXXX"
// and the tag will be injected automatically.
measurementId: "",
gaClickEvent: "offer_click", // fired on every tracker-link click
gaVisitEvent: "paid_visit", // fired once on load when a fbclid exists
// FB Pixel: if fbq is present, a custom event fires on tracker-link clicks.
// Set "" to disable.
fbPixelClickEvent: "OfferClick",
storageKey: "fbl_ads_params",
debug: false
};
/*
* Landing-page capture table:
* key = internal canonical name (also the sub param name)
* value = list of query keys it may arrive under (first usable value wins)
*/
var PARAM_SOURCES = {
sub1: ["sub1"],
sub2: ["sub2"],
sub3: ["sub3"],
sub4: ["sub4"],
sub5: ["sub5"],
sub6: ["sub6"],
sub7: ["sub7"],
sub8: ["sub8"],
fbclid: ["fbclid"],
utm_medium: ["utm_medium"],
utm_source: ["utm_source"],
utm_campaign: ["utm_campaign"],
utm_content: ["utm_content"],
utm_term: ["utm_term"]
};
/*
* FB macro name -> canonical name aliases.
* Tracker links carry sub1={{ad.id}}; the macro "ad.id" maps to landing
* param sub1. If the macro/sub mapping ever changes, edit only this table.
*/
var MACRO_ALIASES = {
"ad.id": "sub1",
"adset.id": "sub2",
"campaign.id": "sub3",
"ad.name": "sub4",
"adset.name": "sub5",
"campaign.name": "sub6",
"placement": "sub7",
"site_source_name": "sub8",
"fbclid": "fbclid"
};
function log() {
if (CONFIG.debug && window.console && console.log) {
console.log.apply(console, ["[fbl]"].concat([].slice.call(arguments)));
}
}
function safeDecode(v) {
try { return decodeURIComponent(String(v).replace(/\+/g, " ")); }
catch (e) { return String(v); }
}
// Matches only DOUBLE-brace FB macros (including URL-encoded %7B%7B...%7D%7D).
// Single-brace macros like {TRANSACTION_ID} are tracker-side and intentionally
// NOT matched here.
function looksLikeFbMacro(v) {
return /\{\{[^}]*\}\}/.test(safeDecode(v));
}
function isUsable(v) {
if (typeof v !== "string") return false;
var s = v.trim();
if (!s) return false;
if (looksLikeFbMacro(s)) return false;
var low = s.toLowerCase();
return low !== "undefined" && low !== "null";
}
function parseQuery(qs) {
var out = {};
qs = String(qs || "").replace(/^[?#]/, "");
if (!qs) return out;
var pairs = qs.split("&");
for (var i = 0; i < pairs.length; i++) {
if (!pairs[i]) continue;
var idx = pairs[i].indexOf("=");
var k = idx < 0 ? pairs[i] : pairs[i].slice(0, idx);
var v = idx < 0 ? "" : pairs[i].slice(idx + 1);
k = safeDecode(k);
if (!(k in out)) out[k] = v; // first occurrence wins
}
return out;
}
/* ---------------------------------------------------------------- params */
function readFromUrl() {
var raw = parseQuery(window.location.search);
var out = {};
for (var key in PARAM_SOURCES) {
if (!PARAM_SOURCES.hasOwnProperty(key)) continue;
var names = PARAM_SOURCES[key];
for (var i = 0; i < names.length; i++) {
var v = raw[names[i]];
if (v !== undefined && isUsable(safeDecode(v))) {
out[key] = safeDecode(v);
break;
}
}
}
return out;
}
function readStored() {
try {
var raw = window.sessionStorage.getItem(CONFIG.storageKey);
return raw ? JSON.parse(raw) : {};
} catch (e) { return {}; }
}
function store(data) {
try { window.sessionStorage.setItem(CONFIG.storageKey, JSON.stringify(data)); }
catch (e) { /* storage blocked (private mode etc.) */ }
}
var PARAMS = (function resolve() {
var stored = readStored();
var fresh = readFromUrl();
// A new paid click (new fbclid) wipes the previous session context
// so attribution never bleeds across ad clicks.
var newClick = isUsable(fresh.fbclid) && fresh.fbclid !== stored.fbclid;
var merged = newClick ? fresh : {};
if (!newClick) {
for (var k in PARAM_SOURCES) {
if (!PARAM_SOURCES.hasOwnProperty(k)) continue;
if (isUsable(fresh[k])) merged[k] = fresh[k];
else if (isUsable(stored[k])) merged[k] = stored[k];
}
}
store(merged);
log("params", merged);
return merged;
})();
/*
* Resolve one "name=value" pair from a tracker URL.
* Returns: string = final value; null = unresolvable double-brace macro
* (caller drops the parameter). Static values and single-brace macros are
* returned as-is.
*/
function resolvePair(name, rawValue) {
var decoded = safeDecode(rawValue);
if (!looksLikeFbMacro(decoded)) return decoded; // static value or {single-brace} macro
var macro = (decoded.match(/\{\{([^}]*)\}\}/) || [])[1] || "";
macro = macro.trim().toLowerCase();
var candidates = [macro, name.toLowerCase()];
for (var i = 0; i < candidates.length; i++) {
var c = candidates[i];
// 1) macro alias table hit (ad.id -> sub1, etc.)
if (MACRO_ALIASES.hasOwnProperty(c) && isUsable(PARAMS[MACRO_ALIASES[c]])) {
return PARAMS[MACRO_ALIASES[c]];
}
// 2) direct canonical-name hit (fallback via the param name, e.g. sub1)
if (isUsable(PARAMS[c])) return PARAMS[c];
// 3) hit through PARAM_SOURCES alias lists
for (var key in PARAM_SOURCES) {
if (!PARAM_SOURCES.hasOwnProperty(key)) continue;
if (PARAM_SOURCES[key].indexOf(c) !== -1 && isUsable(PARAMS[key])) {
return PARAMS[key];
}
}
}
return null;
}
/* ----------------------------------------------------------------- links */
function getHost(href) {
try { return new URL(href, window.location.href).hostname.toLowerCase(); }
catch (e) {
var m = String(href || "").match(/^[a-z]+:\/\/([^\/?#]+)/i);
return m ? m[1].toLowerCase() : "";
}
}
function isTrackerHref(href) {
if (!href) return false;
var host = getHost(href);
if (!host) return false;
for (var i = 0; i < CONFIG.trackerHosts.length; i++) {
if (host === String(CONFIG.trackerHosts[i]).toLowerCase()) return true;
}
if (CONFIG.hostPrefix && host.indexOf(CONFIG.hostPrefix) === 0) return true;
return false;
}
// Rewrites the anchor's href in place; returns the final URL, or null for
// non-tracker links.
function rewriteLink(link) {
var href = link.getAttribute("href");
if (!isTrackerHref(href)) return null;
if (link.getAttribute("data-fbl") === "done") return link.getAttribute("href");
var hashIdx = href.indexOf("#");
var hash = hashIdx >= 0 ? href.slice(hashIdx) : "";
if (hashIdx >= 0) href = href.slice(0, hashIdx);
var qIdx = href.indexOf("?");
var base = qIdx < 0 ? href : href.slice(0, qIdx);
var pairs = qIdx < 0 ? [] : href.slice(qIdx + 1).split("&");
var kept = [];
var present = {}; // param names already on the link, for appendIfMissing
for (var i = 0; i < pairs.length; i++) {
if (!pairs[i]) continue;
var idx = pairs[i].indexOf("=");
var name = idx < 0 ? pairs[i] : pairs[i].slice(0, idx);
var val = idx < 0 ? "" : pairs[i].slice(idx + 1);
var decodedName = safeDecode(name);
present[decodedName.toLowerCase()] = 1;
var resolved = resolvePair(decodedName, val);
if (resolved === null) continue; // unresolvable {{macro}} -> drop the param
// Single-brace tracker macros are passed through with their original
// encoding so re-encoding never mangles {TRANSACTION_ID}.
if (/\{[^{}]*\}/.test(safeDecode(val)) && !looksLikeFbMacro(val)) {
kept.push(encodeURIComponent(decodedName) + "=" + val);
} else {
kept.push(encodeURIComponent(decodedName) + "=" + encodeURIComponent(resolved));
}
}
// Append missing params (typically fbclid)
for (var j = 0; j < CONFIG.appendIfMissing.length; j++) {
var pName = CONFIG.appendIfMissing[j];
if (!present[pName.toLowerCase()] && isUsable(PARAMS[pName])) {
kept.push(encodeURIComponent(pName) + "=" + encodeURIComponent(PARAMS[pName]));
}
}
var finalUrl = base + (kept.length ? "?" + kept.join("&") : "") + hash;
link.setAttribute("href", finalUrl);
link.setAttribute("data-fbl", "done");
if (!link.getAttribute("rel")) link.setAttribute("rel", "nofollow sponsored noopener");
return finalUrl;
}
function decorateAll() {
var links = document.getElementsByTagName("a");
var n = 0, url = null;
for (var i = 0; i < links.length; i++) {
var r = rewriteLink(links[i]);
if (r) { n++; url = r; }
}
log("rewrote " + n + " link(s)", url);
return n;
}
/* ------------------------------------------------------------- analytics */
function ensureGtag() {
if (typeof window.gtag === "function") return true;
if (!CONFIG.measurementId) return false;
window.dataLayer = window.dataLayer || [];
window.gtag = function () { window.dataLayer.push(arguments); };
var s = document.createElement("script");
s.async = true;
s.src = "https://www.googletagmanager.com/gtag/js?id=" + encodeURIComponent(CONFIG.measurementId);
(document.head || document.getElementsByTagName("head")[0]).appendChild(s);
window.gtag("js", new Date());
window.gtag("config", CONFIG.measurementId);
log("gtag bootstrapped", CONFIG.measurementId);
return true;
}
function basePayload() {
return {
fbclid: PARAMS.fbclid || "",
ad_id: PARAMS.sub1 || "",
adset_id: PARAMS.sub2 || "",
campaign_id: PARAMS.sub3 || "",
ad_name: PARAMS.sub4 || "",
adset_name: PARAMS.sub5 || "",
campaign_name: PARAMS.sub6 || "",
placement: PARAMS.sub7 || "",
site_source: PARAMS.sub8 || "",
utm_medium: PARAMS.utm_medium || "",
page_location: window.location.href
};
}
function send(eventName, extra) {
var payload = basePayload();
for (var k in extra) if (extra.hasOwnProperty(k)) payload[k] = extra[k];
payload.transport_type = "beacon";
if (ensureGtag()) {
window.gtag("event", eventName, payload);
}
// FB Pixel custom event (only when fbq is already installed on the page)
if (eventName === CONFIG.gaClickEvent &&
CONFIG.fbPixelClickEvent &&
typeof window.fbq === "function") {
window.fbq("trackCustom", CONFIG.fbPixelClickEvent, {
ad_id: payload.ad_id,
campaign_id: payload.campaign_id,
placement: payload.placement
});
}
window.dataLayer = window.dataLayer || [];
payload.event = eventName;
window.dataLayer.push(payload);
log("event", eventName, payload);
}
/* --------------------------------------------------------------- binding */
function closestAnchor(node) {
while (node && node.nodeType === 1) {
if (node.tagName === "A") return node;
node = node.parentNode;
}
return null;
}
// Capture phase: guarantees the href is resolved even if the user clicks
// before DOMContentLoaded, or if a link is injected later.
function onClick(e) {
var a = closestAnchor(e.target);
if (!a) return;
if (!isTrackerHref(a.getAttribute("href"))) return;
var url = rewriteLink(a);
send(CONFIG.gaClickEvent, {
link_url: url || "",
link_text: (a.textContent || a.innerText || "").replace(/\s+/g, " ").trim().slice(0, 100) ||
(a.getElementsByTagName("img").length ? "image_link" : "unknown")
});
}
function init() {
decorateAll();
if (isUsable(PARAMS.fbclid)) send(CONFIG.gaVisitEvent, {});
window.FBL = {
params: PARAMS,
refresh: decorateAll,
debug: function () { CONFIG.debug = true; return PARAMS; }
};
}
document.addEventListener("click", onClick, true);
document.addEventListener("auxclick", onClick, true); // middle-click / new tab
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", init, false);
} else {
init();
}
})(window, document);