Skip to content

fix(#773): the checkout said "you agree to our terms" and there were no terms - #777

Merged
TortoiseWolfe merged 1 commit into
mainfrom
fix/773-terms-of-service
Aug 16, 2026
Merged

fix(#773): the checkout said "you agree to our terms" and there were no terms#777
TortoiseWolfe merged 1 commit into
mainfrom
fix/773-terms-of-service

Conversation

@TortoiseWolfe

Copy link
Copy Markdown
Owner

Closes #773
Refs #629, #769

Worse than missing: checkout already claimed you'd agreed

PaymentConsentModal.tsx:193 told every buyer:

"By accepting, you agree to our payment processing terms."

…and linked only to the Privacy Policy. There were no payment processing terms. The
product asserted agreement to a document that did not exist — a representation to the
customer that could not be produced if a dispute asked for it. /terms/,
/terms-of-service/ and /legal/ all 404'd, and no terms-shaped route existed under any
name.

Meanwhile the storefront sells one-time work up to $3,500 and monthly plans up to
$249 with no refund policy, no scope definition, no cancellation or auto-renewal terms,
and no limitation of liability. Stripe's dispute representment has a field for the terms the
customer accepted; ours would have been empty.

Correcting the ticket rather than quietly doing something else

The issue said "link it from the footer next to Privacy." There is no such link.
src/config/footer-links.ts holds three external sites (CRUDgames, geoLARP, the template
repo), and GlobalNav carries no legal links either — /privacy, /cookies,
/comment-policy and /accessibility are reachable only from in-page links.

So the terms link goes where privacy already is, and where it actually matters: the consent
modal a buyer sees before paying.
The issue body was updated to say so.

The page

Follows src/app/privacy/'s structure and tone so it does not read as bolted on. Covers
services offered · payment · refunds · subscription renewal and cancellation · scope changes
and client input · IP ownership of delivered work · acceptable use · warranties and
limitation of liability · third-party services · governing law (Tennessee, matching the
business address on the Stripe account).

No prices are restated. The products table is the only authority on price; putting
figures in a legal page creates a second authority that drifts. It points at /pricing.

Carries its own canonical (#668) and joins the contrast sweep automatically, since that
enumerates src/app/**/page.tsx rather than a hand-written list (#411).

Guard

A render test asserting the modal links to /terms — pinned on the link, not the wording,
so the copy can be reworded but a modal claiming agreement must point at what is being agreed
to.

mutation result
restore the old "you agree to our payment processing terms" copy 1 failed
restored green

pnpm test 4669/4669 · type-check clean · lint clean

What this does not claim to be

Not legal advice, and the page says so in a comment. It is written to be accurate about
what this business actually does rather than to be comprehensive. Someone selling at these
amounts should have it reviewed properly. What it closes today is that there was nothing at
all — and that checkout was telling buyers otherwise.

🤖 Generated with Claude Code

…no terms

The storefront sells one-time work up to $3,500 and monthly plans up to $249
with nothing published: no refund policy, no scope definition, no cancellation
or auto-renewal terms, no limitation of liability. /terms/, /terms-of-service/
and /legal/ all 404'd and no terms-shaped route existed under any name.

WORSE THAN MISSING. PaymentConsentModal told every buyer:

  "By accepting, you agree to our payment processing terms."

...and linked only to the Privacy Policy. The product asserted agreement to a
document that did not exist — a representation to the customer that could not be
produced if a dispute asked for it. That sentence is now true: it links to the
thing being agreed to, and Privacy stays alongside it because they answer
different questions.

The ticket said "link it from the footer next to Privacy". THERE IS NO SUCH
LINK — src/config/footer-links.ts holds three EXTERNAL sites and GlobalNav
carries no legal links, so /privacy, /cookies, /comment-policy and
/accessibility are reachable only from in-page links. The terms link therefore
goes where privacy already is and where it actually matters: the consent modal a
buyer sees before paying. Corrected on the issue rather than silently doing
something different.

Covers services offered, payment, refunds, subscription renewal and
cancellation, scope changes, IP ownership of delivered work, acceptable use,
limitation of liability, third-party services, and governing law (Tennessee,
matching the business address).

NO PRICES ARE RESTATED. The `products` table is the only authority on price;
writing figures into a legal page creates a second one that drifts. It points at
/pricing instead.

THIS IS A STARTING POINT AND THE PAGE SAYS SO IN A COMMENT. It is written to be
accurate about what this business does rather than comprehensive. Someone
selling at these amounts should have it reviewed. The gap worth closing first is
that there was nothing at all.

Guard: a render test asserting the modal links to /terms — pinned on the LINK,
not the wording, so the sentence can be reworded but a modal claiming agreement
must point at what is being agreed to. Mutation-tested by restoring the old copy:
1 failed, then green again.

Follows src/app/privacy/'s structure and tone, carries its own canonical (#668),
and joins the contrast sweep automatically since that enumerates
src/app/**/page.tsx.

pnpm test 4669/4669 · type-check clean · lint clean

Closes #773
Refs #629, #769

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@TortoiseWolfe
TortoiseWolfe merged commit 7090ef8 into main Aug 16, 2026
38 of 39 checks passed
@TortoiseWolfe
TortoiseWolfe deleted the fix/773-terms-of-service branch August 16, 2026 21:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

No terms of service page exists — the storefront sells up to $3,500 with no published refund, scope, or cancellation terms

2 participants