Use case
Paywall: count free articles per visitor on your server
A metered paywall gives each visitor a few free articles or uses and counts them. When the counter lives in a cookie or in local storage, clearing it gives the reader a fresh allowance. The FingerPrint Checker visitor ID does not depend on cookies or storage, so clearing them does not reset a counter that you keep on your server under that ID.
The threat
Readers who want your content for free do not need a hack. Deleting cookies, opening another window or clearing site data all reset a client-side counter. The more valuable the content, the more often it happens.
What changes
The visitor ID points at a device or a browser, not at a person. Someone who switches to another device gets that device’s own allowance, and that is a fair trade-off for a meter.
- The visitor ID stays the same after cookies and site data are cleared.
- The counter lives on your server, keyed by visitor ID, so the browser cannot edit it.
- A second browser first seen on the same computer and network usually gets the same visitor ID, so it does not bring a second allowance.
- Bots that scrape behind the meter can be told apart from readers with the bot result.
How to add it
Identify the visitor on page load, send the event ID with the page request, and read the event on your server to get the visitor ID. Increase your counter for that ID, and show the paywall when it passes your limit. Let signed-in subscribers skip the meter entirely.
Meter by visitor ID
// Server side, when an article is requested with the eventId from identify
if (!/^ev_[0-9A-HJKMNP-TV-Z]{20}$/.test(eventId)) return showPaywall(); // bad id, no free article
const r = await (await fetch(`https://api.fpchecker.com/v1/events/${eventId}`, {
headers: { 'X-Secret-Key': process.env.FPCHECKER_SECRET_KEY },
})).json();
if (!r.visitorId) return showPaywall(); // no event, no free article
if (r.eventId !== eventId || !(Date.now() - Date.parse(r.createdAt) <= 5 * 60_000)) return showPaywall(); // wrong or old event
if (!(await markEventUsed(eventId))) return showPaywall(); // your store: true only the first time
const used = await counters.increment(`free-articles:${r.visitorId}`, { ttlDays: 30 }); // your store
return used <= FREE_ARTICLES ? serveArticle() : showPaywall();Frequently asked questions
Does clearing cookies reset the count?
Not the count you keep on your server. The visitor ID does not depend on cookies or storage, so the same browser gets the same ID after they are cleared.
Should I block readers who go over the limit?
Show the paywall and the way to subscribe. A meter works as a sales prompt, and a friendly wall converts better than an error page.
Does it hurt search engine indexing?
You decide who sees the meter. Search crawlers can be recognised from the bot result, so you can serve them the full page as your own policy allows.
Try it on your own sign-up flow
Every new account gets 2,000 free checks. No card required.