feat(legal): add /policies, /contact, /promotions pages for Stripe verification #165

Merged
chihlasm merged 2 commits from feat/stripe-legal-pages into main 2026-05-12 05:23:44 +00:00
Owner

Summary

Adds the three legal/contact pages Stripe's site review will check for during live-mode activation, off the back of Phase O cutover prep (PR #164).

  • /policies — consolidated Customer Policies doc covering customer service contact, return/refund/dispute policy, cancellation policy, U.S. legal and export restrictions, and promotional terms. Sections have anchor IDs so Stripe (or a future support email) can deep-link to a specific subsection.
  • /contact — static customer service hub. Phone (470) 949-4131, support/sales/billing/security inboxes, SLAs, link to /contact-sales for the lead-gen Calendly flow.
  • /promotions — stub that satisfies Policies §6.2's cross-reference. States no promotions are currently active.
  • Landing footer: Privacy / Terms / Policies / Contact (was Privacy / Terms / mailto:hello@).
  • Privacy §5: points at security@ + /contact + /policies.
  • Terms §6: points at support@ + /contact + /policies.

The stale hello@resolutionflow.com mailto on Privacy/Terms is gone — the policies doc and the new /contact page use the correct support / sales / billing / security inboxes consistently.

What's NOT in this PR

  • Mailing address is left as an in-source TODO and rendered publicly as "available on request — email support@". Will be filled in once the P.O. Box is set up. Stripe's business profile takes the address separately on their dashboard.
  • Bot-crawlability. All three pages are SPA-rendered, matching the existing /privacy and /terms pattern. Stripe's verifier didn't enforce content scraping for us last time (the issue turned out to be DNS) — if a future review flags it, we pre-render with vite-plugin-prerender-spa.

Validation

  • npx tsc --project tsconfig.app.json --noEmit — clean
  • npx eslint on the 7 touched files — clean
  • Browser-verify /policies, /contact, /promotions render and footer links work
  • Confirm Stripe Dashboard accepts these URLs on the business profile

Test plan

  1. Run dev server, visit /policies — confirm all 8 sections render, all cross-links (/contact, /promotions, /terms, /privacy, mailto: links, tel:+14709494131) work.
  2. Visit /contact — confirm phone number, email inboxes, SLAs render. Click Manage subscription-equivalent links if any.
  3. Visit /promotions — confirm "no promotions currently active" copy with link back to /policies.
  4. Visit /landing and click each footer link.
  5. Visit /privacy and /terms, click the policies link in the closing section.

Co-Authored-By: Claude Opus 4.7

## Summary Adds the three legal/contact pages Stripe's site review will check for during live-mode activation, off the back of Phase O cutover prep (PR #164). - **`/policies`** — consolidated Customer Policies doc covering customer service contact, return/refund/dispute policy, cancellation policy, U.S. legal and export restrictions, and promotional terms. Sections have anchor IDs so Stripe (or a future support email) can deep-link to a specific subsection. - **`/contact`** — static customer service hub. Phone **(470) 949-4131**, support/sales/billing/security inboxes, SLAs, link to `/contact-sales` for the lead-gen Calendly flow. - **`/promotions`** — stub that satisfies Policies §6.2's cross-reference. States no promotions are currently active. ## Cross-link updates - Landing footer: Privacy / Terms / **Policies** / **Contact** (was Privacy / Terms / `mailto:hello@`). - Privacy §5: points at `security@` + `/contact` + `/policies`. - Terms §6: points at `support@` + `/contact` + `/policies`. The stale `hello@resolutionflow.com` mailto on Privacy/Terms is gone — the policies doc and the new `/contact` page use the correct support / sales / billing / security inboxes consistently. ## What's NOT in this PR - **Mailing address** is left as an in-source `TODO` and rendered publicly as "available on request — email support@". Will be filled in once the P.O. Box is set up. Stripe's business profile takes the address separately on their dashboard. - **Bot-crawlability**. All three pages are SPA-rendered, matching the existing `/privacy` and `/terms` pattern. Stripe's verifier didn't enforce content scraping for us last time (the issue turned out to be DNS) — if a future review flags it, we pre-render with `vite-plugin-prerender-spa`. ## Validation - [x] `npx tsc --project tsconfig.app.json --noEmit` — clean - [x] `npx eslint` on the 7 touched files — clean - [ ] Browser-verify `/policies`, `/contact`, `/promotions` render and footer links work - [ ] Confirm Stripe Dashboard accepts these URLs on the business profile ## Test plan 1. Run dev server, visit `/policies` — confirm all 8 sections render, all cross-links (`/contact`, `/promotions`, `/terms`, `/privacy`, `mailto:` links, `tel:+14709494131`) work. 2. Visit `/contact` — confirm phone number, email inboxes, SLAs render. Click `Manage subscription`-equivalent links if any. 3. Visit `/promotions` — confirm "no promotions currently active" copy with link back to `/policies`. 4. Visit `/landing` and click each footer link. 5. Visit `/privacy` and `/terms`, click the policies link in the closing section. Co-Authored-By: Claude Opus 4.7
chihlasm added 1 commit 2026-05-11 05:58:21 +00:00
feat(legal): add /policies, /contact, /promotions for Stripe verification
All checks were successful
Mirror to GitHub / mirror (push) Successful in 5s
CI / frontend (pull_request) Successful in 6m45s
CI / e2e (pull_request) Successful in 10m15s
CI / backend (pull_request) Successful in 11m10s
4bd34c009f
Adds the consolidated Customer Policies doc covering customer service contact,
return / refund / dispute policy, cancellation policy, U.S. legal and export
restrictions, and promotional terms. Companion /contact page surfaces the
business phone (470) 949-4131 alongside the support/sales/billing/security
inboxes and target response SLAs. /promotions page exists as a stub so the
cross-reference in Policies §6.2 is live; it states no promotions are
currently active and will be appended to when offers run.

Refresh Privacy and Terms footers to point at /contact + /policies and drop
the stale hello@ mailto. Landing footer now exposes Privacy / Terms /
Policies / Contact links so Stripe's site review can reach them in one hop
from the marketing surface.

Mailing address is deferred until a P.O. Box is set up — left as an
in-source TODO and displayed publicly as "available on request" so we
don't ship a placeholder address.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
chihlasm added 1 commit 2026-05-11 06:05:18 +00:00
refactor(legal): extract MarketingFooter, mount on /pricing and /contact-sales
All checks were successful
Mirror to GitHub / mirror (push) Successful in 6s
CI / frontend (pull_request) Successful in 7m3s
CI / backend (pull_request) Successful in 10m50s
CI / e2e (pull_request) Successful in 9m52s
545b2ad269
Pulls the existing /landing footer markup into
`components/common/MarketingFooter.tsx` and mounts it on PricingPage and
ContactSalesPage so the Privacy / Terms / Policies / Contact links are
reachable from every marketing surface (including the page Stripe's
reviewer spends the most time on during live-mode activation).

All three current call sites wrap in `.landing-page`, so the existing
`landing-footer` CSS — and its `--lp-*` variables — resolve without
change. Landing renders pixel-identically; Pricing and ContactSales now
match.

A JSX comment on the component documents the `.landing-page` scoping
requirement so future authors don't drop it on a non-marketing route
and see it render unstyled.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
chihlasm merged commit ba45cfeec1 into main 2026-05-12 05:23:44 +00:00
chihlasm deleted branch feat/stripe-legal-pages 2026-05-12 05:23:44 +00:00
Sign in to join this conversation.