Cardful

Privacy policy — Cardful Chrome extension

Last updated: September 2026

This is the privacy policy for the Chrome extension. It lives in a repository rather than on a website on purpose: a Chrome Web Store listing needs a privacy policy URL that stays reachable, and one that depends on a deployment staying up is one that can quietly break.

The short version

The extension sends nothing anywhere unless you switch on sync, which is off until you do. There are no analytics, no tracking, and no third parties.

If you do switch it on, your offers and card list are copied to your other devices through a server that cannot read them. Everything is encrypted on your own machine first, with a key that is generated there and never sent — so what the server holds is bytes, a record id, and a timestamp. That is a real change from "nothing leaves", and it is why it is off by default and described in full below.

What it stores

All of it lives in chrome.storage.local on your own machine. In full:

There is no analytics, no error reporting, and no identifier of any kind that is not listed above.

A category correction is the one entry that names a website. If the extension guesses that example.com is a restaurant and you correct it to groceries, that single pair — hostname and category — is saved so you do not have to correct it on every visit. Two things are worth being precise about:

Your Pro licence key, if you have one. A key is a signed string carrying a plan, an expiry date and a random id — and deliberately nothing else. There is no email, no name and no customer id inside it, so the extension cannot learn who paid for it even in principle.

Buying is handled entirely by Stripe, and the receipt email by our fulfillment worker. Neither is the extension, and nothing connects the two: the extension has no idea a purchase happened, only that it is holding a key that verifies.

It never asks for, and has no way to learn, a card number, a CVC, an expiry date, or a billing address.

Permissions, and what each is for

Permission What it does
storage Remembers your card list and preferences, locally.
activeTab Lets the popup read the address of the current tab — only at the moment you click the toolbar icon — to work out which store you are on. If that tab is your own bank's offers page, it is also what lets the scan below reach it, for that one tab only.
scripting Puts the offer scanner onto the bank offers page you are looking at, when you press the button that starts a scan.
Content script on all sites Runs the on-page checkout overlay. This is what Chrome describes at install as "read and change all your data on all websites."

The last permission is the broad one, so here is exactly what the script does with it.

What the content script reads

To decide whether a page is a checkout page, it looks at:

Once it has decided a page is a checkout, it also looks at:

On your bank's offers page

Nothing happens on a bank's site unless you ask for it, on that visit. There is no "connected bank" state, no timer and no background scan.

When you are signed in to your bank, on its own offers page, you can click the toolbar icon and press "Scan this page for offers". That, and only that, puts the scanner onto that one tab. Chrome's activeTab grant covers the tab you invoked the extension on and ends when that tab goes somewhere else, so the extension has no way back onto your bank's site afterwards without you doing the same thing again.

What the scanner reads is the offer tiles the page is displaying: the store name, what the offer pays, any minimum spend, the expiry date, and whether the offer is already on your card. It also reads the card's product name with the digits stripped out, so offers from two cards can be told apart. It reads no account numbers, no balances and no transactions. It clicks only buttons whose own visible name is on a short allowlist ("Add to card", "Activate" and a few more), which is checked separately from how the button was found — so a mismatch costs a missed offer rather than doing something else.

All of it is written to chrome.storage.local on your machine, and sent nowhere unless you have switched on sync.

Separately, you can grant one of these banks standing access from the offers page, which lets the extension open several banks in turn in a window you watch. That is optional, never requested at install, revocable from the same row, and the only thing it changes is how the scanner gets to the page.

What it does not read

The card recommendation itself

Computed entirely in your browser from the card list bundled in the extension. Your wallet is never transmitted in order to rank it, with or without sync.

Sync, in detail

Off by default. Turning it on asks for permission to reach the sync server, and for an email address so your devices can find each other's data.

Changes and questions

Material changes will update this file, and its history is public in the repository's git log — you can see exactly what changed and when.

Questions or concerns: email keys@cardful.xyz.