send.webforms.toRead the docs →

how-toairtable

A lightweight CRM in Airtable, fed by your contact form

Before you buy a CRM, try a base with three views and a form feeding it.

WebForms5 min read

Most small teams do not need a CRM product; they need one table with typed columns, a Kanban view, and new enquiries appearing in it without anyone typing. Airtable does the first two out of the box. This post is the third part: form submissions becoming records automatically.

Base setup, and the typing gotchas

Create a table with fields matching your form, but pay attention to Airtable's field types - this is where these pipelines actually break. An Email field rejects strings that are not addresses. A Single select rejects values that are not existing options unless typecast is enabled. Date fields want ISO strings. The safest starting shape: Name as single line text, Email as email, Message as long text, plus a Status single select you fill by hand.

The relay function

api/airtable-relay.js
export default async function handler(req, res) {
  const body = req.body;

  await fetch(
    `https://api.airtable.com/v0/${process.env.AIRTABLE_BASE_ID}/Leads`,
    {
      method: "POST",
      headers: {
        Authorization: `Bearer ${process.env.AIRTABLE_TOKEN}`,
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        records: [
          {
            fields: {
              Name: body.data.name,
              Email: body.data.email,
              Message: body.data.message,
            },
          },
        ],
        typecast: true,
      }),
    },
  );

  res.status(200).json({ ok: true });
}

typecast: true is doing quiet heavy lifting: it lets Airtable coerce incoming values into select options and dates instead of rejecting the whole record. Without it, the first submission containing an unexpected value fails, and it fails invisibly unless you are watching the delivery log.

Create a personal access token scoped to just this base with data.records:write - not a broadly scoped token, because the relay only ever needs to append. Add the function URL as a webhook destination, submit once, and check the record. Then build the views: a grid sorted by created time, a Kanban by Status, and a calendar if your enquiries have dates. That is genuinely most of what small teams use a CRM for.

Get your endpoint

Free for 300 submissions a month. No card required.

Start free