Private administration page. Do not link to this from your public site.
Enter the admin password you set as the ADMIN_TOKEN secret in Cloudflare.
You stay signed in through a reload. Closing this tab signs you out.
Analytics are switched off in the Worker (ANALYTICS = false). Only the spending caps are being counted.
Reader questions per day in navy, development in grey above it. Hover a bar for the date and both counts. The two were shown as one figure until 23 September 2026, which overstated reader use on any day that carried testing.
Aggregate totals only — no identifiers, no devices, no question text. Daily totals expire automatically after 90 days.
Questions per day, per code, with the last date each code was used and the band it starts at. Counts are kept for 90 days and expire on their own. A day before the counts were retained shows as a dash rather than a zero, because nothing was kept then and an empty column would read as a quiet day.
Give each buyer, class, or co-op its own code. Codes are not case sensitive. Revoking one takes effect immediately — no redeploy needed.
Pick the right daily allowance and the term takes care of itself. An individual code allows 15 questions a day and runs two years. A classroom code allows 100 a day and runs ten months — a school year. Both terms start the first time the code is used, not today, so a book that sits on a shelf for a year still gives its buyer a full term. The optional date below is a hard stop on top of that, for a reviewer copy or a pilot that must end on a set day.
Teacher or parent code: the adult's name. Student code: a label only, for example Cox family, student 2 or Lincoln class, S07. Never enter a child's name. The list matching labels to children stays with you, off the service.
Every code is minted by the service in the random AP-XXXXX-XXXXX format. A code cannot be typed in.
A teacher code can switch itself into the student view from inside the app, to preview what the class sees. It never runs the other way — a student code cannot be raised to a teacher code.
Set once, when the code is issued, and never changed afterwards, so a code cannot be promoted into the signed-off cohort by a typo. A development code is the only one that does not spend the readers' daily ceiling; it has its own, smaller one.
Set this and PATCH starts at that band without asking. Leave it on “ask the student” and the code behaves as codes always have. Human Dimensions is not listed because it is a kind of question rather than a level — PATCH offers it at every band when the question calls for it.
A new code works for three months from the day it is first used. Choose no expiry for demonstrations and reviewers, or a date, which is then the only stop. Codes already issued keep the term they have.
Prepare the sheet in Excel with one row per code and these seven columns, in any order, with the names in the first row: issued to, type (student, teacher or parent), band (Foundations, High School, Advanced Enrichment, or empty to let the student choose), cohort (pilot, scaapt, dev, or empty for unassigned), history (yes or no), expiry (empty for three months from first use, none for no expiry, or a date, which is then the only stop) and daily allowance (individual or classroom). Save it as CSV and choose it below. Up to 100 new codes per upload.
A code already in the sheet always stays. An optional code column may be included. A row with a code in it is shown as kept: it is never issued again and comes back on the returned sheet exactly as it went in. A kept code that is not in your codes list, or is revoked, is marked as a fault. Only rows with the code cell empty get a new code.
Nothing is issued until you confirm. Every row is shown first, and any fault is marked: a missing issued to, an unknown type, band, cohort or allowance, a duplicate row, or a date that cannot be read. The new codes get one batch number, and the whole sheet comes back in its own order with the new codes filled in.
| Row | Code | Status | Issued to | Type | Band | Cohort | History | Expiry | Daily allowance | Fault |
|---|
If a sheet turns out to be wrong, every code it issued can be revoked together. AP-66814 is never touched.
| Code | Issued to | Type | Band | Cohort | History | Expiry | Issued | Status | |
|---|---|---|---|---|---|---|---|---|---|
| Loading… | |||||||||
Changes the record in place. It does not revoke the code and does not mint a new one, so the code keeps working throughout. Cohort is set when a code is issued and is not editable. Changing the tier changes the daily cap and leaves the term end where it is. Daily limit overrides the tier for this one code only. Leave it empty and the tier decides, which is what every code did before this field existed.