Changelog
What changed in Checkbox: the product, the API and tools, and the legal catalog and law pages. Newest first.
What changed in Checkbox, newest first: the product, the API and developer tools, and the legal catalog. Detailed API changes (new endpoints, fields and error codes) are in the API changelog; legal catalog versions are also announced as law updates and the law.changed webhook. The legal catalog is drafted from primary sources and is pending attorney review.
2026-11-03
Newest Stripe session judged; Payment Link trials; counts that agree
- The newest Checkout Session is judged. For each set of prices, Checkbox judges your most recent Checkout Session by its creation time, not the order Stripe returned it in. Test runs mirror the newest session too, so an old seeded session no longer reopens the Stripe Checkout task. The plan task and
verify_taskname the session they judged (id and creation date). - Payment Links. A Payment Link's trial (
subscription_data.trial_period_days) and price now feed the per-plan offer, so the Fixes line, Notices timing and test runs include the trial. Sessions a Payment Link created, and sites whose pages only link to buy.stripe.com, are judged as Payment Links (consent from the link'sconsent_collection), not as Checkout Session parameters. - Trial-ending date. The trial-ending live check uses the subscription's real trial end instead of sign-up date plus trial days.
- Counts agree. Overview, Fixes, the lifecycle strip, Findings and each Sites-list row take their to-do counts from the compliance plan ("9 to-dos · 22 checks behind them"). The count never moves a site to a better status than the checks give it.
- Dashboard fixes. "First full check: Ready to run" no longer shows after a completed check. The "Checks only" banner no longer shows when Stripe is connected. The "We check" line shows the Terms page the scanner found instead of "TERMS not set". The charge-notice task offers turning the charge notice on in Notices, and says it is a different email from the renewal reminder.
- Request counts. Checkbox keeps a daily count of authenticated API, MCP and dashboard requests per organization, for its own usage statistics. Only the counts are stored (no paths, request bodies, IP addresses or keys), and they are deleted after 400 days.
- Checkbox Elements 1.4.2: rebuilt from the current source with no behaviour change (1.4.1 stays served as released).
Each plan gets its own fix; Stripe-hosted limits counted once; less retyping
- Each plan gets its own fix. With two or more plans, the plan's patch puts each plan's own renewal line (price, interval, trial) above that plan's button, including on Stripe-only sites with no plans declared. The trial check judges each plan card against its own plan, so a correct annual trial line next to a monthly plan without a trial passes. Engine-corrected Stripe Checkout params keep your Price id and
trial_period_days, and test runs start with the chosen plan's trial. Several recent Checkout Sessions are labelled with their plan's price and interval. - Stripe-hosted limits in one place. How Stripe places and styles your custom text is a note, not a fix, and no longer keeps the page task open. A sign-up check that fails only on Stripe Checkout counts once, under the Stripe Checkout parameters task, and still needs a fix there. The Stripe task now says that
consent_collection.terms_of_serviceneeds a Terms of Service URL in your Stripe public details. - Less retyping. Settings "Your offer" and Fixes "Write my disclosure" start from your Stripe plans (the chosen or only plan, or a plan picker that fills price, term and trial). "No free trial" is never shown while a connected plan has one.
- Fresh Stripe data before a re-check.
verify_taskand "Re-check with current rules" re-read Stripe (at most once a minute) before judging a task that depends on it, and say what was re-read. - Notices and the plan agree. The Notices "You send" tab lists every required email the plan expects, with its state, instead of "Nothing to send". The plan's one-click Notices config now includes the cancel URL and the cancel policy it knows, so applying it no longer fails; confirm the timing against your Terms first.
- Improve. No "how to cancel is only in the terms" when the email has its own cancel line; no checkbox or "Agree &" advice on Stripe Checkout, Payment Links, Checkbox Elements or pages with no consent box; the brand comes from the hosted page name, your merchant name or the Stripe business name before the site name.
- Cancel line. "Cancel anytime at example.com/account." counts as an online way to cancel. Offline-only cancellation still fails.
- Neutral wording. Checks, plan tasks, emails and API descriptions describe what was observed and what the requirement says, without legal conclusions about your business. Verdicts are unchanged.
- Checkbox Elements unchanged (1.4.1).
One status and one to-do list; Stripe Checkout read from Stripe; one offer per plan
- One status, one to-do list. The 0-100 score and the "At risk" / "Healthy" bands are gone from every screen, email, Slack message, MCP answer, the Stripe App and the free checkout scan. Every surface shows the site's status and the compliance plan's open tasks, with the same titles, order and counts. Findings stay as the evidence behind each task. The API still returns
score, now deprecated. - Consent on Stripe Checkout, without registering anything. Checkbox reads your recent subscription Checkout Sessions (consent setting, renewal text and prices) and checks consent on what Stripe showed. The plan's "Stripe Checkout parameters" task uses the same verdict, so it no longer asks you to register parameters Checkbox can already see. A session without required consent still needs a fix. Where Stripe places and styles your renewal text, Checkbox says it looks compliant with a note instead of "Needs a fix". Hidden text still fails.
- One form per plan. A pricing page with one form per plan, each with its own required renewal checkbox (the markup Checkbox suggests), passes. Another plan's button no longer counts as a way around consent.
- One offer per plan. Price, interval, trial and intro price are worked out per plan in one place. The trial check, Write my disclosure, Improve, Notices and the plan all use them. A monthly plan next to an annual plan with a 14-day trial is "no trial" everywhere.
- Trial reminders stay inside the trial. A trial-ending reminder is never scheduled before the trial started; with enough room it keeps the usual lead (5 days before for "at least 3 days" laws).
- Checkbox Elements 1.4.1 (same behaviour, rebuilt on the shared plan model).
Retention settings and legal hold
- You choose how long records are kept. Records of good practice (consent receipts, disclosures as shown, passing checks, certificates, compliant emails sent, confirmed cancellations, the evidence chain) are kept 7 years by default (1-10). Problem history (resolved findings and their detail, captures of pages while they were failing, fix history) is deleted 30 days after the fix by default (7 days to 2 years); only counts for your score history stay. Open problems are never deleted. Set it for the organization and per site in Settings, or with
updateAccount/updateSiteretention. Problem history is stored apart from the write-once evidence vault, so deleting it really deletes it; database backups roll off after 35 days. - Legal hold. Owners and admins can stop all deletion for the organization or a site until they turn it off; a banner shows while it is on, and every change is recorded. API:
legal_holdonupdateAccount/updateSite, error codelegal_hold_active. - Legal requests. The Terms and Privacy Policy now say that you own your data and that we notify you before producing it in response to a subpoena, unless legally prohibited (Terms, Privacy Policy; API details in the API changelog).
Stripe checkouts, several plans, cancel gaps and one status everywhere
- Consent on Stripe. When your pay button links to a Stripe Payment Link or Checkout (or you set "Where shoppers pay" in Site settings), consent is checked on the Stripe page, not on yours: Checkbox reads your Payment Links' consent setting, renewal text and prices. Nobody is asked for a second checkbox. If Stripe can't be read yet, consent shows Not checked yet, never compliant. Reading Payment Links needs the "Payment Links: Read" permission.
- Several plans per site. Each pay button is matched to the plan it sells (by its Payment Link or Checkout config, its name or interval, or its price) and checked against that plan only. An annual button that shows the monthly price fails; a monthly button is no longer held to an annual term. The site overview lists your plans and checkouts with one verdict each. Intro prices ("$34.50 for your first 2 weeks, then $69.00 every 2 weeks") are supported in declared plans, the disclosure check and Checkbox Elements 1.4.0; an intro price is never accepted as the recurring charge.
- Cancel gaps. The billing-portal check and the online-cancel check now read the same cancel paths, so they can no longer disagree. Scans follow your footer and nav links to FAQ, help, support and contact pages (and your Terms when none is registered): "email us to cancel" there fails with the page and the quote, or becomes a question when you also offer online cancellation. A test cancellation that says "cancelled" while Stripe still bills needs a fix; if Stripe can't be read, it is not checked yet. Every scan re-reads your Stripe settings, and Re-sync Stripe does it on demand.
- The same answer on every screen. Each task in the plan shows the status the site's counts give it, so a task counted as "to set up" no longer reads "Needs a fix".
verify_taskgives an email the same verdict as Findings ("live check pending", not "not checked"). A single finding has the same status in the API, MCP, webhooks and the dashboard. Notices previews, "Check my template" and the reminder rules quote the plans you declared before any other Stripe price on the account. A declaredtrial_period_daysis recognised as the trial. - One status, one count. The dashboard, Findings, /todo, the plan, sites list, All workspaces (and its CSV), the API, MCP, emails, the weekly digest and client reports all show the same label and the same counts, counted in tasks. An accepted risk never turns a clear violation into "Compliant". /todo answers every "Your call" with Yes / No / Not applicable. Checkbox Notices you turned on show "live check pending" with the first send date.
- Improve uses your real setup. Examples use your own plans (declared, or the ones your Payment Links sell), URLs and billing wording, with box wording for goods. "From your copy" appears only over your own text. Notices won't send an email whose amount contradicts what Stripe charges.
- All workspaces CSV: the columns are now Site status, Fixes needed, To set up, Your call and Not checked yet. Plan summaries lead with the site status ("Needs a fix · … Score N/100.").
2026-11-02
SDKs and MCP server 0.1.1
@checkbox-site/node,@checkbox-site/mcpand the Python packagecheckbox-siteare released as 0.1.1, generated from the current API description: status labels (compliance_status,compliance), protection levels, conversion suggestions (verification.compliance_status/compliance_label,held_labelon held surfaces). The MCP server reports its package version (0.1.1).- A few internal fields are no longer part of the published API description or the SDK types. The API keeps returning them unchanged, so existing integrations keep working.
- Engine: a renewal reminder that offers another billing frequency as an option ("or switch to monthly billing") no longer fails the frequency check when it also states the plan's own; a date merge tag in a sentence that mentions cancelling ("Your trial ends on {{trial_end_date}} … until you cancel") is no longer read as a cancellation link. Six new accuracy cases (each fix with a must-not-pass neighbour); still 0 false passes.
- The renewal-terms styling suggestion now recommends the product default: one semibold line in your page's own font, size and colour (as Checkbox Elements 1.3.0 renders it).
- Dashboard and docs follow your system theme, with a System / Light / Dark switch that is always visible; reports and other exports always render light.
Compliant in one sitting: status labels, protection levels and checkouts that still convert
- Four labels instead of "needs review": every check now says Needs a fix (with the one change that fixes it), Looks compliant — live check pending (everything Checkbox can see is right; it names what live event is still to come and how it completes: a date, "run a proof" or "BCC real sends"), Verified live, or Your call (one plain-language question with our recommended answer, only for real legal choices such as keeping a notice period). Grey areas and stylistic calls — Stripe's own small grey checkout text, a "Manage subscription" link — show as compliant with a short note. Clear violations still show "Needs a fix": a content failure is never shown as compliant or pending.
- Pending live checks count as compliant. A site with the legal floor in place reads "Compliant · 2 live checks pending" on the dashboard, in the API (
complianceon sites, evaluations, plans and check results), in MCP tool text and in the setup summary email; the compliance plan reachescompliantwhile live checks are pending (task statuspending_live_check). Certificates keep the strict, evidence-backed tier and say so. - Protection level per site (Site settings,
protection_level): minimum (the legal floor only), balanced (default: plus optional suggestions such as consent receipts and a cancellation confirmation email, collapsed, never counted against you) or maximum (plus extras like a checkbox per term). Every check and task is tagged required / recommended / extra; only required items can make a site not compliant. - The smallest compliant checkout is the default: Checkbox Elements 1.3.0 renders one semibold line in your page's own font, size and colours (
appearance="line";"box"keeps the bordered box), and generated fixes (HTML, Shopify, the snippet renderer) do the same — no banner, no box, no red. The conspicuousness check passes tasteful designs (readable size relative to your text, AA contrast, semibold or contrasting, next to the button) and still fails fine print; nine new accuracy cases cover both. New guide: Compliant checkouts that convert.
Never a false pass: verdicts you can trust, and proof from your real system
- Every verdict shows what it was based on: the exact text and element (with its position), the email, the billing field or the Stripe event — and for needs_review, the exact missing piece (
evidenceon every finding and check result; "Based on" in the dashboard). - When Checkbox is not sure, it says needs_review, never pass. A labelled accuracy corpus of 549 cases (801 verdicts, every wrong verdict from both pilots and a 115-case red team) runs on every change: 0 false passes on all 28 checks. What now stops passing: "cancel anytime" next to written notice, a notice period, a minimum term or "by calling";
tel:/mailto:links labelled "online"; two prices side by side; a yearly charge shown as "$8.25/mo"; several billing frequencies for one plan; terms hidden by a stylesheet,sr-only, a closed<details>or white-on-white email text; consent to terms the page does not show; a script that ticks the consent box; unrendered merge tags; a price-change notice with the prices swapped, sent to another subscriber or buried in a newsletter; New York "by continuing you agree", account credit or a California-only refund; a cancellation that ends paused, downgraded, "pending a call" or as a skipped delivery. Spanish, German, French and Portuguese text is needs_review ("language not supported"), not fail. - Stripe params are read like Stripe charges them: quantities and add-ons add up, a second billing interval, an adjustable quantity,
billing_cycle_anchorand coupons are flagged,trial_endis a trial, andui_mode: "custom"(Elements with Checkout Sessions) is never judged as if Stripe drew the page: check the page your code renders. - Run proof: a test-mode run buys through your own checkout (or Payment Link), collects the emails your code sends, ends the trial and renews in Stripe, cancels through your own flow and checks Stripe shows it. Cancellation passes only when your shopper's own subscription is set to cancel and no other plan stays active; the acknowledgment passes only when it states the terms and how to cancel. On a Stripe-connected site, online cancellation passes only with that Stripe confirmation (on-screen success alone is needs_review).
- Emails are only "proven" when Checkbox saw them sent for a real event (a proof run, a real sign-up or a BCC of a real send); a template alone is "template checked".
- Honest scope: Stripe sites get proof; other platforms get "Checks only" with what they can do instead.
- The overall verdict of
/v1/checks/*is needs_review (warninginput_needs_review) when the input has offline-cancellation or lock-in wording, even if every check passed. Preview scores are partial.
Compliant conversion suggestions (optional)
- Merchants asked how to make the checkout and emails perform better while staying compliant. Site → Improve lists optional suggestions from a curated library of 33 (checkout page, Stripe Checkout, acknowledgment, trial and renewal reminders, price-change and cancellation emails, the cancellation flow), each with a before/after written from your plan terms, why it commonly helps, the legal guardrails it respects (with catalog ids) and a copy button.
- Every after-example is run through Checkbox's own checks for your plan and states before it is shown; surfaces that fail a compliance check are held until fixed; suggestions that would be untrue for you (a "cancel anytime" line while cancellation fails, a reminder promise with reminders off) are withheld with the reason. They never block and never count toward compliance. Guide: Compliant conversion suggestions.
2026-11-01
You send the required emails; Checkbox tells you what and when
- New default for every site: you send the acknowledgment, trial-ending, renewal, yearly-terms and price-change emails from your own email provider (plus a recommended cancellation confirmation). Checkbox works out which one each subscriber is owed and when, gives you the email ready to send, and confirms each send by a BCC copy to that notice's own address or an API call. Sites that already had Checkbox send notices keep it ("Checkbox sends", still available for anyone without email setup). Existing sites without a Checkbox-sent notice switch to "You send" today, with no backlog: Checkbox only lists emails whose window is still open with at least a day to go.
- A required email whose window closes without proof is overdue: its check fails ("no proof it was sent") and the compliance plan gets a "Send overdue required emails" task. Send it late and mark it sent, or record it as not sent; overdue emails older than 90 days stop failing checks.
- Copy-ready templates for every email (HTML + text with merge fields), each passing Checkbox's email checks, and Check my template for your own version. Notices tab: mode switch (with a confirmation that says what changes), to send / upcoming / done, who each email is for and when to send it, templates. Guide: Sending required emails (Resend and Postmark code).
- Before launch, a review tightened it: a copy confirms a notice only through that notice's secret BCC address or from your authenticated sending domain (the site address is public);
notice.duearrives on the recommended send date, not at the window's first moment; sends before the window opens, and backdated sends for overdue notices, are refused; cancellation confirmations are a recommendation and never fail a check; California and Minnesota yearly reminders and California price decreases are tracked; Stripe test-mode customers never reach live webhooks or fail live checks; the Connecticut "exactly 3 days" rule keeps its exact day.
Workspaces for agencies
- Create another workspace from the workspace switcher or ⌘K (name only; you become its owner). Up to 10 a day per person (the limit message says when the next one is possible); needs a confirmed email address. Dashboard only: agents work inside the workspace whose key they have.
- The settings group and page formerly called Organization are now Workspace.
- All workspaces (for people in two or more): sites, sites needing attention, worst open finding and last check per workspace, a Switch button per row and a CSV download. Guide: For agencies.
Trust, status and assistant integrations
- Trust center, status (live, from the platform's own health signals; no uptime history is recorded yet, and the page says what it cannot see), a DPA template and a press page.
- The status page reports background jobs as degraded when no job has completed recently, and email as configured only when a real transport is set.
- Coverage counts current requirements only; superseded versions are reported separately.
- The Claude skill and plugin, Cursor, Copilot and Windsurf rules and the AGENTS.md section now do the requested work first and ask once at the end, say that Checkbox is a third-party service and what is sent to it, and never treat installed MCP tools or an
.env.exampleplaceholder as consent. - Unknown paths answer 404 with a "page not found" page;
/learn/*redirects to the guides under/docs/learn/.
Subscription law pages and open dataset
- One page per jurisdiction at
/laws/<state>— every state, DC, the federal layer and New York City — generated from the legal catalog: the laws, each requirement with its citation, notice windows, who can sue, effective dates and the last-reviewed date. Every page is also served as Markdown (.md) and listed in /llms.txt. - The catalog as an open dataset: JSON and CSV under CC BY 4.0, versioned with the catalog.
- New guides: subscription compliance checklist (2026), online cancellation flow for California and New York, free-trial notices, price increases and what plaintiffs' lawyers look for in subscription checkouts.
- This changelog.
Legal catalog 2026.11.01.1 (rules 1.4.0)
- New York City's "Click to Cancel" rule (6 RCNY §§ 5-110 to 5-110.3, effective October 1, 2026) is evaluated: eight requirements, verified against the adopted text.
- Every requirement records its litigation exposure (private right of action, remedies, cure period); compliance plans order work by how often each failure is litigated.
- A clearly labelled consent button with the renewal terms next to it is accepted in California and Vermont as equivalent to a required checkbox (the checkbox stays the recommendation).
- Severity changes: California acknowledgment and misrepresentation raised to critical; Regulation E authorization critical when debit or ACH billing is declared; Florida, South Carolina and New Mexico service-contract entries lowered to medium. Details in
docs/legal/CATALOG.md.
Product
- Redesigned dashboard flows; a public preview of a newly added website before its domain is verified; in-product feedback (
POST /v1/feedback, MCPsend_feedback).
2026-10-31
- Consent receipts: opt-in, per-checkout records of the disclosure as rendered next to the pay button and the consent given (receipts).
- Sign in with GitHub, Google or an email link.
- One-approval connection of the remote MCP server from claude.ai, Claude Desktop, Claude Code and Cursor (OAuth); see MCP.
- Domain-verified scanning in test and live mode.
- Redesigned dashboard, sign-in pages, marketing site and developer docs; an About page.
- Litigation research on what regulators and plaintiffs pursue, applied to the catalog the next day.
2026-10-30
The first public version.
- API v1, test mode for every account, live mode by domain verification; OpenAPI 3.1.
- Agent setup:
checkbox init, device-authorization login, setup sessions. - Preflight checks for disclosure text, Stripe Checkout Sessions and Payment Links, emails, checkout HTML and notice schedules — also offline in the CLI.
- Compliance plans, test runs in Stripe test mode, Checkbox Elements (
<checkbox-disclosure>), webhooks, the MCP server and Node and Python SDKs (pre-release). - Done-for-you notices, hosted cancellation pages and fixes for Stripe Payment Links.
- Free to start, with fair-use limits.
2026-10-29
- Legal catalog research: federal law (ROSCA, Regulation E), California, New York and every other state automatic-renewal law found, each verified against its source where possible.
Checkbox is compliance software, not a law firm; nothing in these docs is legal advice (details). You remain solely responsible for your subscription program, and Checkbox takes on no legal liability for it (Terms). Checkbox is a System1 company; Trust center · Status. For AI agents: every page is available as Markdown at the same URL plus .md; the index is /llms.txt.