Zero contact-PII surface

We store post URLs.
Not people.

Most outbound tools are built around a 200M-contact database. That's a huge compliance, deliverability, and brand-risk surface. The Demand Graph is built around public conversation URLs — a fundamentally narrower surface, and the reason Wavly can ship features that contact-DB tools can't without a legal review.

How we operate

Architectural commitments, not marketing.

We store URLs, not people

Wavly's source of truth is the public post URL — Reddit thread, HN comment, Stack Exchange question. We do not maintain a contact database, do not buy or scrape PII, and do not enrich identities. The compliance surface of the entire product is dramatically narrower than a contact-DB-based outbound tool.

Per-tenant Row-Level Security

Every Postgres table that holds tenant data is protected by Supabase Row-Level Security. A signed-in user can only read or write rows their JWT authorizes. RLS is enforced at the database, not in application code — so a bug in the API layer cannot leak data across tenants.

HMAC-signed conversion webhooks

Conversion ingest accepts an optional X-Wavly-Signature HMAC header. When you set a webhook signing secret on a campaign, every payload is verified in constant time before we touch the database. Idempotency keys de-duplicate replays — you can safely retry from anywhere in your stack.

Immutable audit log on every ingest

The conversion_ingest_log table records every webhook delivery attempt — successes, validation failures, signature mismatches, and rate-limit denials — with IP, user-agent, latency, and a payload excerpt. Pruned on a schedule; retained long enough to investigate incidents.

Hosted on Vercel + Supabase

App tier on Vercel's edge runtime; data tier on managed Supabase Postgres with point-in-time backups. No self-hosted secrets, no custom auth — we lean on the same platforms that power the operator console you're using.

Public-by-design replies

Every reply Scout drafts is intended for a public thread the asker chose to post in. There is no inbox, no DM blast, no spam vector. This dramatically reduces both deliverability risk and the chance you ever damage your brand by appearing in someone's spam folder.

FAQ

Direct answers, no compliance theatre.

01Do you store contacts, emails, or any prospect PII?
No. We store the public post URL, the post text, and engagement metrics — that's it. We do not buy contact lists, scrape email addresses, or enrich identities. If you receive a tracked conversion via webhook, the email address you send us is yours to manage; we treat it as opaque opaque external_user_id by default.
02What is the data residency?
Production data sits in our Supabase project (Postgres) and Vercel edge functions. Specific region disclosure is available on request — email hello@thewavly.com.
03Is the conversion webhook authenticated?
Optional but recommended. Set a webhook_signing_secret on your campaign. Every payload then includes an X-Wavly-Signature HMAC-SHA256 header which we verify against the raw body in constant time before touching the database. Replays are idempotent via event_id or Idempotency-Key header.
04Can you sign a DPA / answer a security questionnaire?
Yes. Email hello@thewavly.com with the document and we'll turn it around. We're a small team — please flag urgency in the subject line.
05How do you delete data on request?
Email hello@thewavly.com with the campaign / account in question. We'll remove campaign data and any associated audit-log rows within 30 days, faster on request. Public post URLs that we previously crawled remain public on their source platform — that's the only piece outside our control.

Have a security questionnaire?

Email hello@thewavly.com — small team, fast turnaround, plain answers.