Built like the honesty is the product. Because it is.
The same discipline that keeps our numbers honest keeps your data safe: every control below exists in the system today, described plainly.
Tenant isolation is enforced by the database
Every tenant table carries PostgreSQL row-level security, enabled AND forced, with an org-isolation policy. The application connects under a role the policies apply to, so a missing WHERE clause in our code cannot read another org's rows. Verified object by object on every migration.
API keys are org-scoped bearer tokens
Keys are created in the dashboard, resolve server-side to exactly one org, and every read runs inside that org's row-level security context. A brand id from another org reads as not found. Programmatic access is a plan feature, gated at the endpoint.
Outbound fetches are SSRF-guarded
Every fetch of a customer-supplied host (robots checks, crawler probes, page audits) goes through one guarded client: DNS-pinned dispatch, private and link-local address ranges refused, redirects re-vetted hop by hop, response sizes bounded.
Anything public passes a human gate
The system drafts; a human approves; only then does it place. Placements are idempotent with an atomic claim, so a retry can never double-post. There is no code path that publishes without an approval.
Review text is never stored
Review analysis runs in flight: text enters the extractor and only derived numbers persist (text share, term density, recency, response rate). Google Business Profile reads persist a completeness diagnosis, field flags and gap names, never profile content.
Spend has a hard ceiling
Every metered operation writes to a per-org cost ledger, and a monthly budget kill switch halts new spend at your plan's cap. Reads stay open when spend is paused.
Rate limiting on every public surface
Authentication endpoints run a database-backed limiter that survives restarts and scales across instances. Public tools and the funnel run per-IP sliding windows. The MCP endpoint bounds body size before parsing and rate-limits before key resolution.
Secrets stay out of the codebase
Credentials live in the deployment environment, never in code or config files. Provider keys are least-privilege, and the git history has been audited for leaked material.
Sub-processors
The vendors that process data on our behalf, and what each one is for.
| Railway | API, worker and PostgreSQL hosting |
| Vercel | Web application hosting |
| Inngest | Durable job orchestration |
| Anthropic, OpenAI, Google, xAI | The AI engines measured; prompts contain your tracked questions, never your customer data |
| OpenRouter | Routes the Perplexity engine we measure |
| DataForSEO | Search, crawl and business-panel data |
| SearchAPI | Search results data (fallback provider) |
| Firecrawl | Rendered-page extraction for readability checks |
| Composio | OAuth connections to your Google Analytics, Search Console, Reddit and LinkedIn |
| Resend | Transactional email |
| Polar | Billing and payments |
Report a vulnerability or ask a security question: kailesk@houseofmvps.com. We respond fast and we credit researchers who report responsibly.
