fix(#773): the checkout said "you agree to our terms" and there were no terms - #777
Merged
Conversation
…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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #773
Refs #629, #769
Worse than missing: checkout already claimed you'd agreed
PaymentConsentModal.tsx:193told every buyer:…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 anyname.
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.tsholds three external sites (CRUDgames, geoLARP, the templaterepo), and
GlobalNavcarries no legal links either —/privacy,/cookies,/comment-policyand/accessibilityare 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. Coversservices 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
productstable is the only authority on price; puttingfigures 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.tsxrather 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.
pnpm test4669/4669 · type-check clean · lint cleanWhat 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