Skip to content

The moment it happens

Add form sign-ups to a Notion database

Every sign-up, booking or idea sent to your link becomes a row in Notion, without duplicates.

Runs
The moment it happens
Apps
Notion
AI
Not needed
Access
read+write (database shared with the connection)

Send this to your assistant

Create a ClickRuntime automation: give me a link my sign-up form can send entries to. Add each person to my Notion Contacts database with their name, email and source, unless they're already in it.

Paste it into your assistant. It tells you what it will send or change before it runs live.

First time? Adding ClickRuntime to your assistant takes about two minutes.

Why use it

Why teams use this automation

Sign-ups, bookings, ideas and time entries come from many places: a website form, a booking widget, a Typeform, a script on your phone. Each tool has its own export, so data ends up in separate spreadsheets or email threads. Someone copies rows into Notion on Fridays, entries are missed, and a person who signs up twice is entered twice. The database you rely on is always a few days behind and slightly wrong.

When a tool sends data to the link ClickRuntime provides, it receives the payload, looks in your Notion database for an existing entry with the same key, such as an email address, and then either creates a new page or updates the existing one. Each field in the payload is mapped to the matching Notion property.

It works for makers, small studios and community organisers who want one Notion table behind several tools.

What you get out of it

  • Notion is current within seconds

    Entries appear as they happen. When you open the database on Monday morning, it already contains the weekend's sign-ups, with nothing to import. Opening the database on Monday morning shows the weekend's sign-ups already there, with nothing to import first.

  • Repeat submissions update instead of duplicating

    Matching on a key means a person who fills the form twice gets one row, kept up to date. Mailing lists and attendee counts stay accurate. Mailing lists, attendee counts and invoices stay accurate because one person is one row.

  • Several tools can feed one database

    A booking widget, a form and a phone shortcut can all post to the same link. You track everything in one table without reconciling exports. You track everything in one table without reconciling several different exports at the end of the week.

  • Property mapping keeps data tidy

    Each value lands in the right column, such as Email, Date or Plan, in the right type. Sorting and filtering work because the data is structured from the start. Sorting and filtering work properly because the data is structured from the start, not tidied later.

  • No copy-paste routine

    The Friday job of moving rows by hand disappears. That time goes to following up with the people who signed up, which is what the data is for. That time goes to following up with the people who signed up, which is what the data is for.

How it works

What happens, step by step

  1. When someone submits your form, ClickRuntime receives their details straight away.

  2. It checks your Notion database for an existing entry with the same email address.

  3. If there is one, it updates that entry. If not, it creates a new page with the name, email and source.

Before it runs live

  • Connect Notion and share the database you want it to use
  • Paste your automation's link into the other app's webhook settings

What you get

RunsThe moment it happens
Add form sign-ups to a Notion databasejust nowSucceeded
Notion · ContactsJamie Ortiz | jamie@northwind.example | Source: Website form

Build your own

Need it to work differently?

This template is a starting point. Copy the prompt and change it, or describe a different automation from scratch, with your own conditions, more apps or an AI step. Your assistant writes it, tests it and runs it on ClickRuntime.
  • Your own rules

    Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.

  • Any number of apps

    One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.

  • AI where it helps

    Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.

  • On a schedule or on each event

    Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.

Changes you can ask for

  • Act only on the items that match your own rules, and skip the rest
  • Add an AI step, for example to summarize, sort or draft a reply
  • Add another app, for example also send it to Slack
  • Combine it with other Notion steps into one automation

Under the hood

The code that runs this automation

This is the Python script that runs each time the automation starts. Your AI assistant writes it for you when you send the prompt, and you allow each step in your assistant. To change how the automation works, describe the change to your assistant and it updates the script for you. For every function it can use, see the script reference.
capture_webhook_or_form_data_as_notion_pages.pyexample
from clickruntime import on_event, credentials, http

NOTION = "https://api.notion.com/v1"

def headers():
    return {"Authorization": f"Bearer {credentials.secret('NOTION_TOKEN')}", "Notion-Version": "2022-06-28"}

def query(db, body=None):
    resp = http.post(f"{NOTION}/databases/{db}/query", headers=headers(), json=body or {})
    resp.raise_for_status()
    return resp.json()["results"]

def title(page, prop="Name"):
    return "".join(t["plain_text"] for t in page["properties"][prop]["title"])

CONTACTS = "contacts-database-id"

@on_event
def handle(event):
    p = event.json or {}
    if query(CONTACTS, {"filter": {"property": "Email", "email": {"equals": p["email"]}}}):
        return {"created": False, "reason": "already in Contacts"}
    http.post(f"{NOTION}/pages", headers=headers(), json={"parent": {"database_id": CONTACTS}, "properties": {
        "Name": {"title": [{"text": {"content": p.get("name", "")}}]},
        "Email": {"email": p["email"]},
        "Source": {"select": {"name": p.get("source", "Website form")}},
    }}).raise_for_status()
    return {"created": True}

FAQ

Common questions

What can send data to the link?
Anything that can make an HTTP POST with JSON, including form builders with webhook settings, booking tools, mobile shortcuts and scripts. If a tool only sends email, a different route is needed. Tools that only send email would need a different route.
How does it decide whether to update or create?
It queries your database for a page whose key property equals the incoming value. If one is found it updates that page, otherwise it creates a new one. You choose the key, such as email or an external ID.
Does it handle properties like dates and select options?
Yes. Dates, numbers, checkboxes, selects and multi-selects are converted to the right Notion type. A select value that does not exist yet is created, or you can have such rows flagged for review instead. That avoids silent data entry mistakes.
What permissions does it need?
read+write (database shared with the connection). Nothing else in your accounts is used.
Does it need AI?
No. It runs without AI, so it doesn't use your plan's AI allowance.
How many runs does it use?
One run for each event the app sends.
Can I change how it works?
Yes. Describe the change to your AI assistant, for example a different schedule, channel or filter. It updates the automation, tests it and tells you what changed.

Set up “Add form sign-ups to a Notion database” from your assistant

Copy the prompt above, or connect your assistant first. Free plan, no credit card.