Seven days is not a customer journey.
Safari caps every cookie written by JavaScript at seven days. Return visitors come back as new users, attribution windows collapse, and your reports quietly understate returning traffic. Cookie Keeper re-issues those cookies over HTTP from your own tagging domain, where the cap does not apply.
The cookie is re-issued over HTTP on every response, so an active visitor's expiry date keeps moving forward.
Cookie lifetime, with and without
Browser storage policy quietly rewrites your data
Intelligent Tracking Prevention does not block your analytics: it expires it. That is harder to notice, because everything keeps working and the numbers merely become wrong.
JavaScript cookies expire in seven days
Safari's cap applies to any cookie written with document.cookie, which is how GA4, Meta and Google Ads all set their client identifiers.
Returning visitors count as new
An expired identifier means a new one is issued. Your returning-visitor share falls, your user counts inflate, and neither number describes reality.
Attribution windows collapse
A 30-day consideration cycle cannot be attributed with a 7-day identifier. Longer-cycle purchases end up credited to direct traffic.
How it works
Cookies set by an HTTP response from a first-party domain are not capped the way JavaScript-set cookies are. Your tagging domain is exactly such a domain, so the gateway re-issues the cookies for you.
Read on the way in
When a request carries one of the configured cookies, the gateway picks up its current value. Nothing is invented: if the cookie is not there, nothing is written.
Re-issue on the way out
The response carries a Set-Cookie header with the same name and value and a long Max-Age, Secure and SameSite=Lax. The browser records it as a first-party HTTP cookie.
Expiry moves forward continuously
Because it happens on every response, the expiry date is pushed forward on each visit. An active visitor's identifier effectively never lapses.
What you get
Sensible defaults
_ga, _fbp, _fbc and _gcl_au are configured out of the box, the identifiers behind Google Analytics, Meta and Google Ads attribution.
Up to twenty cookies
Add any first-party cookie you rely on, up to twenty per container. Names are validated on save.
Automatic domain scoping
By default the parent domain of your tagging host is used, so cookies stay shared with your main site. Override it when your setup needs something else.
Secure attributes by default
Re-issued cookies carry Secure and SameSite=Lax. HttpOnly is available but off by default, so on-page scripts keep working.
Specification
- Default cookies
- _ga, _fbp, _fbc, _gcl_au
- Maximum cookies
- 20 per container
- Maximum lifetime
- 400 days (the browser ceiling)
- Attributes
- Secure, SameSite=Lax, HttpOnly optional
- Cost
- Included with your container
When to use it
You sell on a long consideration cycle
Anything researched over weeks rather than minutes loses attribution to the seven-day cap. Extending the identifier is the single highest-impact fix.
Safari is a large share of your traffic
In markets with high iPhone penetration, a substantial slice of your audience is affected by default and without any action on their part.
Your returning-visitor rate looks implausible
If loyal customers keep showing up as new users, expiring identifiers are the usual cause, and this is the usual fix.
Questions about Cookie Keeper
Is this compliant?
It extends the lifetime of cookies you already set; it does not create new ones or set them without consent. If a visitor has not consented and the cookie was never written, there is nothing to re-issue. Declare the extended lifetime in your cookie policy.
Why 400 days and not longer?
Chrome refuses any cookie lifetime beyond 400 days, so a longer value would simply be ignored. 400 is the practical ceiling, and it is the default.
Does it work in every browser?
The mechanism is standard HTTP cookie handling, so yes. It matters most in Safari, where the JavaScript cap is strictest, but Firefox and Chrome honour the extended lifetime too.
Can I add cookies that are not in the defaults?
Yes, up to twenty per container. Names may contain letters, digits and underscores, which covers the identifiers used by all mainstream vendors.
Other modules
Modules stack. Enable as many as you need. They compose into one configuration in front of your container.
Ready to switch it on?
Every module is included with your container at no extra cost. Create a container, open the modules panel, and toggle.