Skip to content

Add public Terms of Service and Privacy Policy pages (#794) - #795

Merged
developer-ainative merged 1 commit into
mainfrom
feature/issue-794-terms-privacy-pages
Sep 17, 2026
Merged

developer-ainative merged 1 commit into
mainfrom
feature/issue-794-terms-privacy-pages

Conversation

@developer-ainative

Copy link
Copy Markdown
Contributor

Summary

  • builder.ainative.studio had no /terms or /privacy pages of its own — both paths 307'd to /login (fell through the auth-gated catch-all).
  • Root cause of [BUG] No Terms of Service / Privacy Policy pages on builder.ainative.studio — blocking Twilio A2P 10DLC campaign approval (#781) #794, which itself is the real blocker behind [BUG] Real SMS replies from Cody are undelivered — Twilio error 30034 (A2P 10DLC filtering), affects every founder-facing ZeroVoice number #781 / ZeroVoice#626: Twilio's A2P 10DLC campaign (sid QE2c6890da8086d771620e9b13fadeba0b) was rejected with error 30882 (unverifiable TERMS_AND_CONDITIONS_URL) and 30908 (unverifiable PRIVACY_POLICY_URL) — carriers couldn't resolve a public legal page for the product actually sending Cody's SMS messages.
  • New app/terms/page.tsx and app/privacy/page.tsx, SSR, matching the existing Modernist design (PublicNav/PublicFooter, same tokens as /about and /help).
  • middleware.ts: added /terms and /privacy to the public allowlist so they render for anonymous visitors (and automated carrier review).
  • PublicFooter: Terms/Privacy links now point at Builder's own pages instead of ainative.studio's.
  • Privacy policy explicitly states mobile/SMS data is never shared with third parties for marketing purposes (Twilio's standard carrier-review requirement).
  • Terms includes SMS-specific terms (message frequency, opt-out keywords, HELP/STOP handling) matching what's already registered on the live Twilio campaign (message_flow, opt_out_keywords, opt_out_message).

Next step (not code — account/compliance work)

Once this is live on builder.ainative.studio, the Twilio A2P campaign needs to be resubmitted with:

  • TERMS_AND_CONDITIONS_URL = https://builder.ainative.studio/terms
  • PRIVACY_POLICY_URL = https://builder.ainative.studio/privacy

Test plan

  • npx tsc --noEmit — clean
  • npx vitest run — 5631 passed, 50 skipped (0 new failures)
  • npx vitest run middleware — 37/37 passed
  • Live-verified locally: GET /terms → 200, GET /privacy → 200 (previously 307 → /login)
  • Confirmed rendered content includes SMS-specific disclosures
  • Confirmed footer now links to /terms and /privacy (not ainative.studio)

builder.ainative.studio had no legal pages of its own — /terms and /privacy
fell through to the auth-gated catch-all and 307'd to /login. This is the
real blocker behind Twilio's A2P 10DLC campaign rejection (#781,
ZeroVoice#626): the campaign (sid QE2c6890da8086d771620e9b13fadeba0b) was
rejected with error 30882 (unverifiable TERMS_AND_CONDITIONS_URL) and 30908
(unverifiable PRIVACY_POLICY_URL) because carriers could not resolve a
public, unauthenticated legal page for the product actually sending Cody's
SMS messages.

- New app/terms and app/privacy pages, SSR, matching the existing Modernist
  chrome (PublicNav/PublicFooter, same tokens as /about and /help).
- Privacy policy explicitly states mobile/SMS data is never shared with
  third parties for marketing, per Twilio's carrier-review requirements.
- Terms includes SMS-specific terms (message frequency, opt-out keywords,
  HELP/STOP handling) matching what's already registered on the Twilio
  campaign (message_flow, opt_out_keywords, opt_out_message).
- middleware.ts: added /terms and /privacy to the public allowlist so they
  render for anonymous visitors and automated carrier/compliance review.
- PublicFooter: Terms/Privacy links now point at Builder's own pages instead
  of ainative.studio's.

Once live, the Twilio campaign still needs to be resubmitted with these
URLs — that part is account/compliance work, not a code change.
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.

1 participant