Privacy policy
No third-party analytics. No ad trackers. No third-party scripts at all, and the security header we send forbids them outright. The calculators need no account and keep nothing. Below is every value we store, where it lives, and how to have it deleted.
The short version
- Every calculator, the whole Learn course and the formula sheet work with no account, no email and no cookie.
- No analytics product, no advertising pixel, no third-party script. The
Content-Security-Policyheader allows scripts and network connections from this origin only, so a tracker could not run here even if one were added by accident. - Nothing is sold, rented or shared for marketing.
- The only personal data the site can hold is an email address (if you sign in, or leave one on the pre-launch list), plus what Stripe holds once billing opens.
Everything below is the long version, written against the code rather than from a template. Where something cannot be verified from the code, it says so.
What stays in your browser
Most of what the site remembers never leaves your device. It is kept in localStorage under the origin teachersbet.com, which is readable only by this site and is cleared the moment you clear site data.
Every key, and what is in it
tb-age-ok: set once you confirm you are of legal betting age. A single character. Never sent anywhere.tb-report: the Report Card, meaning prices you chose to log, each with the event, the side, the moneyline, the market and line, an optional stake and bankroll, the book, and when you logged it. On an Extra Credit account this key is a holding area rather than the store: an entry sits here until the server has it, then leaves.tb-bankroll: the last bankroll typed into the Kelly Sizer or saved on the Report Card, so it does not have to be retyped. It also sizes the one-tap half-Kelly log when no account bankroll is set.tb-learn-doneandtb-learn-phd: which Learn course lessons you have passed, and the derived PhD claim code. Signed out, this never leaves your device. Signed in (any tier, free included), the passed-lesson list is also copied to your account so your rank follows you between devices and survives a cache clear; the server only ever adds to that list, never removes from it. If you have linked a Discord account, the bot can also set your current course rank as a role in our Discord server. Deleting your account deletes the list and unlinks the Discord account with it.tb-attendance: the day’s answer from the attendance counter, cached so the site asks the server at most once a day. The record itself is on your account when you are signed in, any tier: one row per Eastern Time calendar day you opened the site, from which the streak is derived. It stores the date only, nothing about what you did that day, and deleting your account deletes it.tb-bellandtb-bell-seen: the in-app alert setting (which ships switched off) and the ids already shown, so the same flag does not fire twice.tb-tour-done: whether the one-time guided tour has already run.tb-first-touch: how you first found the site. One label from a fixed list (meta,google,reddit,directand so on), the page you landed on, and the day and minute you arrived. When the site that linked you is not one we recognise, it also holds the bare name of that site: the host only, never the page and never the full link. If you followed a campaign link or an affiliate link, it holds that campaign or affiliate name instead. It is written on the first arrival that shows where you came from, and a later visit does not change it while it is under 90 days old. Past 90 days it is deleted on your next visit and the next arrival starts over, so a browser that never comes back keeps it until you clear site data. It is sent with every sign-in request, and it is kept only if that sign-in creates a new account; either way the browser copy is deleted the moment you are signed in. The tracking code a social link puts on the address arrives with the page request, the way every part of a web address does. It is read to pick the label and then dropped: it is never written to your browser and never stored on our server. If your browser sends the Global Privacy Control signal, nothing is written and nothing is recorded, on either side.tb_pro: after a subscription purchase, the signed entitlement token. It carries the subscriber’s email or Stripe customer id, the tier and an expiry, and it goes back to the server to unlock the paid board.
An operator-only admin page also keeps an access key in sessionStorage. It is not part of any visitor’s use of the site.
The Report Card is worth a note, because there are two versions of it and only one of them stores anything at all.
Without an Extra Credit subscription (signed out, or on a free account), nothing is stored anywhere. Not on our server, and as of 1 August 2026 not in your browser either. You grade one bet at a time: the entry is held in the page’s memory, sent to /api/report/grade, which compares it against stored closing prices and returns a grade, and then it is gone the moment you reload. It is not written to the database and it is not written to localStorage. Keeping a running card is what the subscription is for. Entries logged into localStorage before that date are still on your device; the site no longer reads or adds to them, and clearing site data removes them.
With an Extra Credit subscription, the archive is saved on the server. That is the point of it, since a history that evaporates cannot show you a season’s worth of closing line value. It went live on 1 August 2026; before that date nothing was stored for anyone.
One detail worth stating plainly, because it involves your browser sending us something you logged earlier. On a subscribed account a price you log lands in localStorage first, as a queue, and is then copied to the server and removed from the browser: that is what stops a tap being lost if the network drops mid-request. So when you subscribe or sign in on a device that already has entries in it, those entries move into your account, and the card says how many did. That is what makes the same card appear on your phone and your computer. If you would rather it had not, delete them from the card: one entry or all of them, and they are gone from the database immediately.
Each saved entry holds the game, the market and side, the venue, the price you logged, when you logged it, the stake and bankroll if you supplied them, and the grade once the game closes. It is attached to your account, so it survives a cache clear and follows you between devices. A subscribed account can also save one number that is not an entry: a starting bankroll, which the card combines with settled results to derive a current bankroll. Save the field empty and the stored number is deleted.
This is the most personal thing the site keeps, so the terms are strict and they are enforced in code, not just written here:
- It is yours to take. Export the whole archive as CSV or JSON from the Report Card, any time, in one click. Not a page of it: all of it.
- It is yours to delete. Delete a single entry or the entire archive from the same place, and it is gone from the database immediately. Deleting your account deletes the archive with it, by a foreign key the database enforces. There is no orphaned copy left behind for someone to find later.
- No IP address, no device fingerprint, no user-agent is stored alongside these entries.
- It is never sold, shared, or used to advertise to you. Aggregate, de-identified accuracy statistics may inform how venues are weighted in the fair line; your individual entries are not published, and no entry of yours is ever shown to another user.
- Nothing is stored without a subscription. The free Report Card is browser-only, by design rather than by omission.
Cookies
Two, both first-party, both functional. Neither is for advertising and neither follows you anywhere else.
tb_session: set when a sign-in completes. An opaque 256-bit random id; the server stores only its SHA-256 hash, never the value in the cookie.HttpOnly,Secure,SameSite=Lax, with a 90-day expiry that slides forward as you use it.tb_auth_nonce: set the moment a sign-in link is requested and dead 15 minutes later. It binds the emailed link and the six-digit code to the browser that asked for them, so a forwarded email, or a mail scanner that opens links, cannot sign anyone in. Cleared as soon as sign-in completes.
tb_pro, the entitlement token in the list above, is not a cookie: it is kept in localStorage and sent to the server in an Authorization header. The server will also accept it as a cookie if some client chooses to send one, but nothing on this site sets it that way: no code here writes document.cookie at all.
There is no consent banner because there is no tracking cookie to consent to.
One thing we do want to know is roughly where people find us, so that time is not spent on channels nobody arrives from. When you arrive from a link somewhere else, the page writes a single label into localStorage, not a cookie: a word like meta or google, plus the page you landed on and, when the linking site is not one we recognise, that site’s bare host name. It travels with every sign-in request, and it is copied onto the account only when that sign-in creates one. Signing in deletes the browser copy either way. If you never sign in, your next visit after 90 days deletes it and starts over. It is a label, not an identifier: everyone who arrives from the same post stores the same word, so it cannot single anyone out and it cannot follow you anywhere. If your browser sends the Global Privacy Control signal, the page writes nothing.
What the server stores
Server-side data lives in a Cloudflare D1 database (SQLite at the edge). These are all of the rows that can contain anything about a person:
- Accounts: created only if you sign in. The email address, lower-cased and trimmed; the entitlement tier; the Stripe customer id once billing is connected; and created, updated and last-login timestamps.
- How the account first arrived: one label from that same fixed list, the page it first landed on, and when, plus the bare host of the linking site when it is not one we recognise, or the campaign or affiliate name a link carried. Written once, when the account is created, and a later sign-in never changes it. No IP address, no user-agent, no advertising identifier. Deleting the account deletes it, by the same foreign key.
- Sign-in tokens: the SHA-256 of the emailed link token, of the browser nonce and of the six-digit code, never the values themselves; the email address; when it was issued and when it expires; how many code attempts have been made; the IP address that requested it; and the first-touch label described above, which travels with every sign-in request and is erased from this row the moment the sign-in completes. A scheduled sweep deletes the rows themselves after expiry, on the same daily job as the site’s other housekeeping.
- Sessions: the SHA-256 of the session id, the account it belongs to, timestamps, the first 256 characters of the browser’s user-agent string (so a device list is legible), and the IP the session was created from. Three devices maximum; a fourth sign-in drops the least recently used. Signing out of all devices deletes every row instantly.
- Pre-launch list: only if you enter an address: the email, which tier you asked about, the timestamp, and a short label for the page it came from.
- Market snapshots: venue prices with timestamps. No user is attached to them and none can be.
Every credential is stored only as its SHA-256 hash, so a copy of the database yields nothing usable: the raw session id, link token and sign-in code exist only in your browser and in your inbox. The link token, browser nonce and session id are 256-bit random values.
The six-digit code is short by design, because it has to be typed. It is protected instead by the browser binding, a five-attempt cap and a 15-minute expiry.
What is never collected
- No name, postal address, phone number, date of birth or government ID. The age gate asks for a confirmation, not a birthday (see responsible gambling).
- No card number, expiry or CVC. Those go to Stripe and never touch this site’s servers.
- No location beyond the country and region code Cloudflare attaches to every request, which is read only by the availability gate described in the terms and is not stored.
- No bets, balances or sportsbook credentials. The site has no connection to any book or exchange account, because it places nothing.
- No calculator inputs. Each calculator posts to a stateless endpoint that computes an answer and returns it; nothing about the request is written down.
- No fingerprinting, no session recording, no heatmaps, no A/B cookies.
Who holds it
Escapement Technologies LLC, a New York company in Syracuse, New York, owns and operates teachersbet.com and is the controller of everything on this page. Teacher’s Bet is the name of the site, not a separate company. Requests about your data go to support@escapementtech.com and reach a person.
Who else is involved
Four processors, each doing one job:
- Cloudflare: hosts the site, runs the server code and stores the database. As the host it necessarily sees each request’s IP address, user agent and URL, as any web host does.
- Stripe: payments. Card details are entered on Stripe’s own page. From Stripe this site learns the billing email, the customer id and the subscription status. Nothing else.
- Resend: delivers the sign-in email, and therefore receives the address and the message. The email deliberately contains no link tag and no image, so there is nothing in it to wrap in a click tracker and no pixel to load; provider-side click and open tracking are kept off for this domain as a standing rule.
- Kalshi and The Odds API: the market-price sources. Data flows one way, inbound. Nothing about you is sent to either.
There is no advertising network, no data broker, no analytics vendor and no CDN-hosted font or script. Everything the browser loads is served from this origin, including the maths typesetting.
Logs
The server writes short diagnostic lines: sign-in outcomes (whether it worked, why not, and the first 80 characters of the user-agent string, never the token or the code), unmatched URLs (the method, the path, the length of the query string rather than its contents, a truncated referrer and a truncated user-agent), and payment-webhook errors. Those exist so a broken sign-in can be diagnosed while a user is reproducing it.
No log-drain, Logpush destination or analytics dataset is configured for this application, so it keeps no request log of its own. Cloudflare’s platform-level logging and retention apply as they would to any site it hosts, under Cloudflare’s policy rather than this one.
Deleting your data
- The browser half. Clear site data for
teachersbet.comand every key listed above is gone. Instant, no request, nobody to ask. - Sessions. “Sign out of all devices” in the app deletes every session row immediately and invalidates any that were missed.
- The account itself, by yourself. The account menu ends with Delete your account, for any signed-in tier, free included, on the website and in the app. Confirm once and it deletes the account row (the email address, the tier and the Stripe customer id) along with the Report Card archive, the saved bankroll, the Learn progress, the attendance rows, the alert registrations, any Discord link, the first-touch label, every session, any outstanding sign-in code and any pre-launch-list entry under the same address. The account row and everything attached to it go in one database batch. It cannot be undone, so export the Report Card first if you want to keep it. A live subscription has to be cancelled before the account can go, because Stripe would otherwise keep billing an account that no longer exists, and because access runs to the end of the period you have paid for, the delete control keeps refusing until that period ends; a season pass is a single payment that never renews, so it does not stand in the way. The full walk-through is at delete your account.
- The account itself, by email. If you cannot sign in, or you left an address on the pre-launch list and never made an account with it, email support@escapementtech.com from the address in question. The request is honoured wherever you live; no legal-regime test is applied first. Expected response times are on the contact page.
- Payment records. Stripe keeps its own under its own policy. Deleting an account here does not reach into them.
Age
This site is built for adults and is not directed at children. No data is knowingly collected from anyone under the legal betting age, and there is no mechanism here that could collect a child’s data other than an email address typed into a form. If you believe a minor has entered one, email the address above and it is deleted.
What this page does not claim
It describes what the code does, checked against the code. It is not a compliance certificate for any particular privacy regime and it is not legal advice. A pre-launch legal review is under way; if it changes anything here, this page changes and the date at the top moves with it.
Material changes get described rather than quietly substituted: the same corrections rule the rest of the site runs on, set out in the editorial policy.
Changed on 9 August 2026: the site now keeps one label recording which link first brought a reader here, described above under Cookies, in the browser-storage list and under what the server stores. That is the only new thing on the page. The word “analytics” was narrowed to “third-party analytics” in a few places, because counting where our own readers come from is analytics of a kind and the broader word had stopped being exactly true.
Also changed on 9 August 2026: you can now delete your account yourself, from the bottom of the account menu, instead of emailing and waiting. This page used to say email was the only route to deleting the account row, and that is no longer true, so the sentence changed rather than being quietly left standing. Email is still the route if you cannot sign in. The new page is delete your account.
Frequently asked questions
Does Teacher’s Bet track me?
No. There is no analytics product, no advertising pixel and no third-party script. The Content-Security-Policy header allows scripts and network connections from this origin only, so a tracker could not run even if one were added by mistake. There is no advertising cookie and no cross-site identifier. The one thing kept for our own use is a short label saying which site sent you here, stored in your browser and copied to your account only if you make one.
Do the calculators store what I type?
No. Each calculator posts its inputs to a stateless endpoint that computes an answer and returns it; nothing about the request is written to the database. The only values kept are ones you deliberately keep, and without an Extra Credit subscription the Report Card keeps nothing at all: you grade one bet at a time and it is gone on reload, stored neither on the server nor in your browser. With a subscription the Report Card archive is saved to your account, and can be exported or deleted in one click.
Do I need an account?
No. Every calculator, the full Learn course and the formula sheet work with no account, no email and no card. An account exists only for the paid tier and for keeping a subscription attached to an address.
What cookies does the site set?
Two, both first-party and functional: tb_session for a signed-in session, stored server-side only as a hash, and tb_auth_nonce, a 15-minute value that binds a sign-in link to the browser that asked for it. The paid entitlement token tb_pro is not a cookie: it is kept in localStorage and sent in an Authorization header. No advertising or analytics cookie.
How do I delete my data?
Clearing site data removes everything held on your device. A saved Report Card archive is deleted from the Report Card itself, one entry or all of it. Signing out of all devices deletes every session row. To delete the whole account, use Delete your account at the bottom of the account menu, on the website or in the app: it removes the account row, the Report Card archive, the saved bankroll, the Learn progress, the attendance rows, the alert registrations, any Discord link and every session, and it cannot be undone. Cancel a live subscription first. If you cannot sign in, or you left a pre-launch-list address and never made an account with it, email support@escapementtech.com from the address in question. Full details are at delete your account.
Does Teacher’s Bet sell data?
No. Nothing is sold, rented or shared for marketing. The only third parties are infrastructure: Cloudflare for hosting and the database, Stripe for payments, and Resend to deliver the sign-in email.