Skip to content

Trystpilot - Risk, Liability & Compliance

Trystpilot — Risk, Liability & Compliance

Version: 0.5.0 · Last updated: 2026-02-28 See also: design/governance/ for moderation diagrams


⚠️ Critical Pre-Launch Gates

None of the below should be skipped before accepting real users.

GateWhyOwner
Legal counsel review of ToSPartial real names + city creates defamation/privacy exposureFounder
CDA §230 positioning confirmedPlatform must not be a “content developer” — review ToS carefullyLawyer
Stripe pre-approvalStripe requires platform review for businesses handling reviews of private individualsFounder
ADMIN_SECRET enforced (not optional)Dashboard currently fails open — immediate security riskEngineering
Rate limiting live (Upstash)Without it, a single attacker can flood any profileEngineering
CAPTCHA wired (hCaptcha)Prevents automated review submission at scaleEngineering
Removal request pipeline completeFast path required before any public launchEngineering

1. Data Protection

Data Collected

Data TypeStoredPublicNotes
Alias (first name + last initial)Reviewer-provided; never verified
City / regionDerived from zip
Zip codeInternal deduplication only; never in API responses
Review text✅ (if approved)Filtered before storage
Reviewer fingerprint hashOne-way hash of IP + UA + timestamp bucket
IP addressesNot stored; used only for hash generation
Email addressesRejected by text filter

Data Retention

DataRetention
Approved reviewsIndefinite (until removal request approved)
Rejected / quarantined reviews90 days, then purged
Abuse reports12 months
Removal requests24 months (audit trail)
Fingerprint hashes12 months (rate-limit window)

2. PII Handling Strategy

Core principle: Collect the minimum required to operate. Never store what can be derived.

  • Zip codes are converted to city, STATE on ingest. The zip is stored in profiles.zip_code (internal) but never returned by any public API endpoint.
  • IP addresses are hashed (SHA-256 with daily rotating salt) to produce anonymous_hash_id. The raw IP is discarded immediately.
  • Reviewer identity is never stored. The hash is a fingerprint for rate-limiting and deduplication only — it cannot be reversed to identify the reviewer.
  • Review text passes through textFilter.ts which strips or rejects any detected PII before the text is written to the database.

3. CCPA / GDPR Considerations

Trystpilot serves users in California (CCPA) and potentially the EU (GDPR). Key implications:

RequirementTrystpilot PositionGap
Right to know what data is storedPrivacy policy must disclose zip→city conversionPolicy not yet published
Right to delete / opt-outRemoval request flow must be fast and always freeRemoval pipeline incomplete
Data minimisationIP not stored; zip internal only✅ Compliant by design
Consent for trackingVercel/CF analytics are cookieless by default✅ Generally compliant
Data breach notificationNo breach notification process defined❌ Define in Phase 1

Required Pages (all under app/legal/)

PageStatus
Terms of Service✅ Scaffold
Community Guidelines✅ Scaffold
Content Policy✅ Scaffold
Removal Request Form✅ Form — pipeline not wired
DMCA Portal✅ Scaffold
Law Enforcement Contact✅ Scaffold
Privacy Policy❌ Missing — add Phase 1

Required Disclaimers (on every public page)

This site is a user-generated anonymous review index. We do not verify identities, facilitate contact, or endorse any content. Profiles use user-chosen aliases only — never real names.


5. Payment Compliance

If/when Trystpilot introduces paid tiers:

  • Stripe requires platform review for businesses that host reviews of private individuals. Submit for approval before enabling any payments.
  • PCI DSS: Never handle raw card data. Stripe Elements / Stripe Checkout only — card data never touches Trystpilot servers.
  • Refund policy: Define before first paid transaction. Platform services (not review content) are the billable item.

6. Operational Liability Risks

RiskSeverityMitigation
Defamation claim (false review published)HighLegal review of ToS; rapid removal pipeline; CDA §230 positioning
Doxxing via review textCriticalText filter (PII regex); quarantine pipeline; 24h SLA
Targeted harassment campaign (review flood)HighRate limiting + CAPTCHA + fingerprint dedup
Stalking facilitationHighCity-level only; no contact info; no social handles
Underage subject identifiedCriticalUnderage indicators blocked by text filter; report hotline
GDPR deletion request not fulfilledMediumFast removal pipeline; 30-day SLA maximum
Data breach (DB credentials leaked)HighRotate credentials immediately; breach notification within 72h

7. Incident Response Template

For any security incident:

  1. Detect — Sentry alert, user report, or automated scan flags issue.
  2. Contain — Disable affected endpoint or quarantine affected content within 1 hour.
  3. Assess — Determine scope: what data, how many profiles/reviews affected.
  4. Notify — If PII breach: notify affected parties within 72 hours (GDPR); notify Vercel/Railway if infrastructure involved.
  5. Remediate — Patch, deploy, verify fix in production.
  6. Post-mortem — Document in docs/CHANGELOG.md under the release that fixes it.

8. Audit Logging Requirements

Not implemented in MVP. Phase 2 target:

EventLog fields
Review submittedtimestamp, profile_id, hash_id, flagged_score, status
Moderation decisiontimestamp, review_id, admin_hash, decision, reason
Removal requesttimestamp, profile_id, requester_hash, decision
Profile created/suspendedtimestamp, profile_id, admin_hash, action
Failed admin authtimestamp, IP hash, endpoint

Audit logs must be append-only and stored for a minimum of 24 months.