Security

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.

RailwayAPI, worker and PostgreSQL hosting
VercelWeb application hosting
InngestDurable job orchestration
Anthropic, OpenAI, Google, xAIThe AI engines measured; prompts contain your tracked questions, never your customer data
OpenRouterRoutes the Perplexity engine we measure
DataForSEOSearch, crawl and business-panel data
SearchAPISearch results data (fallback provider)
FirecrawlRendered-page extraction for readability checks
ComposioOAuth connections to your Google Analytics, Search Console, Reddit and LinkedIn
ResendTransactional email
PolarBilling and payments

Report a vulnerability or ask a security question: kailesk@houseofmvps.com. We respond fast and we credit researchers who report responsibly.