Skip to content
Open beta — everything’s free right now, and your rate is locked when it ends.

Webhooks: send record changes to any URL

When a record changes, Tabla POSTs the whole story — before, after, what changed — to a URL you name. The four triggers, the sentence you configure, and the promise behind every delivery: signed, logged, retried, replayable.

Updated August 2026

A webhook is your database telling something else what happened, the moment it happens. A record changes in Tabla; Tabla sends an HTTP POST with the full story — the record before, the record after, which fields changed — to a URL you chose. The thing at that URL, an n8n workflow, a Make scenario, or twenty lines of your own code, does whatever comes next. Nothing polls, and nothing is five minutes late.

Every database has a Webhooks tab, next to Data at the top of a laptop or tablet screen. The list answers three questions per webhook in one scan: what fires it, where it goes, and whether it's healthy.

The Webhooks tab of the Sakkara Plants database — the list showing the webhook "New orders → automation" with its one-line summary and a green Healthy chip.

Configuration is a sentence

A webhook's setup reads the way you'd say it. The list shows each one as a one-line summary — When a record is created in Orders → hook.eu2.make.com — and the webhook's own page is that same sentence as a form: When [trigger] in [table], then Send to with the URL. There is no Save button; every control commits itself as you change it, like the rest of Tabla.

The four triggers

One webhook has exactly one trigger, picked from the When menu:

  • a record is created — fires once per new record.
  • a record is updated — fires on every edit. Optionally narrow it to Watched fields, so only changes to the fields you name count.
  • a record starts matching — the stateful one. You write conditions, and the webhook fires at the moment a record goes from not matching to matching — an order's Status arriving at Out for delivery, once, rather than on every later edit while it sits there. Conditions that name a moment ("today", "now") are also checked on a clock, so a record can start matching because time passed, with nothing written.
  • a record is deleted — fires with the record's final state, so the data isn't gone from your automation's point of view.

All four take conditions in the same grammar as filters, so When a record is updated in Orders can become …and Status is Delivered with the same rows you'd build in the Filter panel.

One table, or the whole database

The in menu offers every table, plus any table — one webhook watching the entire database. Two things need a specific table: conditions and watched fields, since both name fields, and only a table has a field list. (a record starts matching always needs a table, for the same reason.)

Signed, logged, retried, replayable

The promise behind every delivery, each with its own guide:

  • Signed. Every request carries an X-Tabla-Signature header — an HMAC-SHA256 over the timestamp and the exact body, keyed with a secret only you and Tabla hold. Verify it and no one can feed your endpoint forged events.
  • Logged. Every attempt lands in the delivery ledger on the webhook's page: the exact payload sent, the response that came back, the HTTP status, the duration. Thirty days of history, always keeping at least the last 200.
  • Retried. A failed delivery is retried after 10 seconds, 1 minute, and 5 minutes — four attempts in all. After 20 straight failures the webhook pauses itself instead of hammering a dead endpoint, and says so with a chip in the list and a dot on the Webhooks tab.
  • Replayable. Any delivery in the ledger can be sent again with one click — same payload, fresh signature — so an outage on your side doesn't mean the events are gone.

What arrives

One JSON envelope per change: the event name (record.created, record.updated, record.matches, record.deleted), the database, table and record ids, changed_field_ids, and full before and after snapshots of the record. Your receiver never has to call back to ask what actually changed. The field-by-field reference, with a real captured payload per trigger, is webhook payloads.

Before anything fires, the Example payload disclosure on the webhook's page shows the exact shape your table will send — built from your real field names — and Send a test delivers a sample to your URL on the spot.

The honest details

  • Bulk writes don't fire webhooks. A change touching 50 or more records at once — a big import, a mass paste — sends nothing, on purpose. Fifty webhook calls for one paste is a flood, not a signal. Ordinary edits and single-record API writes are always under the line.
  • Public URLs only. The destination must be reachable on the public internet; local and private-network addresses are refused when you save.
  • Who can do what. Editors and owners create, edit, pause, and delete webhooks and can send tests and replays. Viewers can read the list and the ledger, but never the signing secret.
  • Paused means paused. While a webhook is off or auto-paused, events that happen are not queued up for later — resuming starts from now.
  • A button field can also send one delivery to a webhook's URL per press — a human trigger riding the same signing, ledger, and retries.

Webhooks are on every plan, like everything else. If you're deciding between webhooks and polling the API, or wiring up Make or n8n for the first time, the concept piece on database webhooks is the place to start; your first webhook is the ten-minute version with a real endpoint.

Tabla is the database we build these on.

A no-code database with real Postgres underneath: every feature on every plan, a million records per database, and your whole database back out in one file, any day.

More guides