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

Button fields: a press, an action

A button field puts one action on every row: open a URL built from the record's own values, or send a webhook. What a press does, where it shows up, and how to press over the API.

Updated August 2026

A button field holds no data. Every row gets the same pill, and pressing it does one configured thing for that record: open a URL assembled from the record's own values, or send one webhook delivery carrying the record. The demo shop's Orders table has a Send invoice button wired to its invoicing webhook.

A press never edits the record it fires from.

The Orders grid with the Send invoice button column: one colored pill per row, ready to press.

Make one

  1. Add a field and choose Button.
  2. Label — what the pill says, up to 40 characters.
  3. Color — a pigment, or none for the neutral slate.
  4. On clickOpen a link or Send a webhook.

For a link button, write the URL with {Field name} tokens: https://wa.me/{Phone} opens a WhatsApp chat with the row's own number. Tokens fill from the record, URL-encoded; an empty cell fills as nothing. The URL must start with http:// or https://.

For a webhook button, pick one of the database's webhooks — the button borrows its endpoint, secret and pause state. No webhooks yet means nothing to pick; make one first.

Only enabled when takes a condition, the same grammar as filters. On records that don't match, the button is grayed out — never hidden, so the column doesn't shift. The condition is enforced on the server too, not only painted on the screen.

Everything about a button is editable later; there's no locked wiring.

Pressing it

One click presses — no select-first, because a button is the action. A link button opens its resolved URL in a new tab. A webhook button flashes "Sent." and enqueues one delivery. Editors and owners can press; viewers see the pill but can't fire it.

Where the press shows up

A webhook press becomes an ordinary delivery: signed, retried on failure, and recorded in the webhook's deliveries ledger like any other. The payload's event is button.pressed, and it carries the record's fields, which button was pressed, and who pressed it:

{
  "event": "button.pressed",
  "record_id": "rec_ff374pj8sbhe",
  "button": { "field_id": "fld_7c7rctin9qxm", "label": "Send invoice" },
  "pressed_by": "laila@sakkaraplants.com"
}

If the chosen webhook is switched off or paused, the press refuses with a plain message instead of pretending.

Over the API

A press is one call — POST /api/tables/:id/records/:rid/press with the button's field id:

{ "field_id": "fld_8nzesrn8kanv" }

A link button answers with the resolved URL for your code to open; a webhook button confirms the delivery:

{ "action": "link", "url": "https://duckduckgo.com/?q=S-2" }

In record JSON the button field itself always reads null — there is no value — and writing to it is refused by name. Details in /docs/api.

When you actually want a different field

A button is for actions that need a human finger on a specific row. If the action should happen whenever data changes, skip the finger: a webhook with a condition fires by itself. And if you only need the link visible, a URL field shows it without the ceremony.

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