- How do I store webhook events without standing up my own Postgres?
- Point your webhook receiver at nlqdb: it provisions a Postgres for you, and each verified payload is written via the `@nlqdb/sdk` client or `POST /v1/run`. There's no connection string to manage or migration to run before the first event lands. The trade-off is honest — nlqdb owns the database it provisions, so it isn't a connector over a warehouse you already run.
- Can I query the stored webhook events in plain English?
- Yes. Ask 'how many checkout events this week, grouped by day' and nlqdb compiles the SQL, runs it, and shows the query alongside the rows so you can audit the grain. The raw payload is kept as JSONB, so you can also filter on nested fields you never promoted to columns.
- Does nlqdb receive the webhook and verify the signature for me?
- No — you keep a small receiver (a serverless function or Worker) that accepts the provider's POST and verifies its signature, then writes the payload to nlqdb. nlqdb is the queryable store and natural-language reporting layer, not the HTTP listener. Mutating writes accept an `Idempotency-Key` so a retried delivery isn't double-processed.
- How is this different from storing form submissions without a backend?
- Form capture is browser-side — the page's own `fetch` writes a submission behind a key. Webhooks are server-to-server: a provider like Stripe or GitHub POSTs to your endpoint, you verify, then write. Both end at the same place — a Postgres you ask 'how many' over in English — but the write path differs. See /solve/store-form-submissions-without-backend for the form case.