Get a daily digest of Webflow form submissions, with the spam filtered out

Weekday mornings: every Webflow form submission since the last digest, grouped by form, one line each, with obvious spam set aside.

Runs
Weekdays at 9:00
Uses
Webflow
Posts
Report card

From your apps to your board

How the skill works: your agent reads site and its forms from Webflow; webflow site from What you tell it, weekdays at 9:00, and gives you report card and the report in the chat.

Reads

  • WebflowSite and its forms
  • What you tell itWebflow site
reads
Your agentClaude Code, Codex, Cursor or GeminiWeekdays at 9:00
posts

You get

  • Report cardOn your board, updated in place every run
  • The report in the chatEvery run, with or without Briefkin

What you get

  • Counts: real submissions and spam since the last digest.
  • By form: name, company or domain, the ask in one line, and when.
  • Flagged: enquiries with a budget, a deadline or a meeting request.
  • Spam: a count and the most common reason.

The card on the right is a sample. Yours shows your own numbers and updates in place every run.

What lands on your board

example.comWebflow form submissions digest · Claude Code

8 new form submissions, 3 set aside as spam

5 real enquiries since yesterday. One demo request mentions a $40k budget and a January launch.

FormFromAsk
Demo requestPriya N., northwind.ioDemo for 25 seats, $40k budget, launch in January
Demo requestTom B., halcyon.coWants to see the Shopify integration
ContactLea M., gmail.comCan she pay yearly by invoice?
ContactSam K., bluepeak.orgNonprofit discount?
Newsletterj.ortiz@fastmail.comSigned up from the pricing page
Demo request 2Contact 2Newsletter 1Spam 3
Done
An example with made-up numbers. Your agent posts your real ones.

What it does

Webflow form notifications land in one inbox, mixed with everything else, and the spam ones look exactly like the real ones until you open them. For an agency running several client sites, or a small team whose only lead source is the contact form, real enquiries get answered a day late.

The agent reads the submissions through the Webflow Data API each weekday morning, sets aside the spam (link drops, SEO pitches, gibberish), and lists each real enquiry in one line: who, from where, and what they want. Monday covers the weekend.

How it works

  1. 1Find the site and its forms

    GET /v2/sites for the site_id, then GET /v2/sites/{site_id}/forms for each form's displayName. For an agency, repeat per client site and label each section.

  2. 2Read new submissions

    GET /v2/sites/{site_id}/form_submissions?limit=100 and page with offset up to pagination.total. The API has no date filter, so keep submissions whose dateSubmitted is after the last run (Friday 9:00 on a Monday).

  3. 3

    3Set spam aside

    Mark a submission as spam when the message is mostly links, pitches SEO, backlinks or crypto, repeats another submission word for word, or the name and message are gibberish. Keep the reason; never delete anything in Webflow.

  4. 4

    4Summarize each enquiry

    From formResponse, take the name, email domain or company, and the ask in under 15 words. Flag submissions that mention budget, a deadline or a meeting.

  5. 5

    5Post the digest

    Group by form, real enquiries first with the flagged ones on top, then a count of spam with one example reason.

  6. Post it to the board

    With BRIEFKIN_TOKEN set, the agent sends the result as one card that updates in place every run. Without it, you get the report in the chat.

Install and run it

Pick your agent, where the data comes from and how to schedule it; the commands below follow.

Agent
Data
Schedule
  1. Install the skill

    One command. It puts the SKILL.md in ~/.claude/skills and in ~/.agents/skills, which Codex, Cursor, Gemini CLI, Copilot CLI and OpenCode read too.

    shellcurl -fsSL https://briefkin.dev/skills/webflow-form-submissions-digest/install | sh
  2. Run it

    Ask Claude Code:

    promptRun the webflow-form-submissions-digest skill

    Or paste the prompt instead of installing:

    promptUsing the Webflow Data API v2, list the forms on my site and read form submissions from GET /v2/sites/{site_id}/form_submissions, paging with offset until the end. Keep only submissions whose dateSubmitted is after yesterday 9:00 (after Friday 9:00 if today is Monday). Set aside spam: mostly links, SEO or backlink pitches, crypto, duplicates of another submission, or gibberish, and give the reason. For each real submission give the form, the name, company or email domain, and the ask in under 15 words, grouped by form, with any that mention budget, a deadline or a meeting first. Do not delete or change anything.
  3. Put it on a schedule

    Weekdays at 9:00, from cron on any machine where Claude Code is signed in:

    crontab0 9 * * 1-5 claude -p "Run the webflow-form-submissions-digest skill"

    Add it with crontab -e. A laptop asleep at that time runs it when it wakes if you use launchd or Task Scheduler instead; GitHub Actions works for the API route.

  4. Send it to your board

    Connect Briefkin once with curl -fsSL https://briefkin.dev/install | sh and every run lands on your board as a report card. How setup works

View the SKILL.mdRaw file
SKILL.md---
name: webflow-form-submissions-digest
description: "Weekday mornings: every Webflow form submission since the last digest, grouped by form, one line each, with obvious spam set aside. Use when the user asks for this, or when it runs on a schedule."
---

# Webflow form submissions digest

Weekday mornings: every Webflow form submission since the last digest, grouped by form, one line each, with obvious spam set aside.

Webflow form notifications land in one inbox, mixed with everything else, and the spam ones look exactly like the real ones until you open them. For an agency running several client sites, or a small team whose only lead source is the contact form, real enquiries get answered a day late.

The agent reads the submissions through the Webflow Data API each weekday morning, sets aside the spam (link drops, SEO pitches, gibberish), and lists each real enquiry in one line: who, from where, and what they want. Monday covers the weekend.

## Two ways to get the data

Use the API or MCP route when you have an MCP server, a CLI or an API token for the app. Otherwise, if you can drive a browser the user is signed in to (Claude in Chrome, a Playwright or Chrome DevTools MCP server), use the browser route. Say which one you used.

## Route A: API or MCP server

### What you need

- A Webflow site API token with read scopes (`sites:read`, `forms:read`), in `WEBFLOW_API_TOKEN`.
- Or Webflow's MCP server (`https://mcp.webflow.com/mcp`), if the tools it lists in your client include form submissions; it can also edit sites, so keep the skill to reads.

If something is missing, say what and stop; do not invent numbers.

### Steps

1. **Find the site and its forms** (Webflow): `GET /v2/sites` for the `site_id`, then `GET /v2/sites/{site_id}/forms` for each form's `displayName`. For an agency, repeat per client site and label each section.
2. **Read new submissions** (Webflow): `GET /v2/sites/{site_id}/form_submissions?limit=100` and page with `offset` up to `pagination.total`. The API has no date filter, so keep submissions whose `dateSubmitted` is after the last run (Friday 9:00 on a Monday).
3. **Set spam aside**: Mark a submission as spam when the message is mostly links, pitches SEO, backlinks or crypto, repeats another submission word for word, or the name and message are gibberish. Keep the reason; never delete anything in Webflow.
4. **Summarize each enquiry**: From `formResponse`, take the name, email domain or company, and the ask in under 15 words. Flag submissions that mention budget, a deadline or a meeting.
5. **Post the digest**: Group by form, real enquiries first with the flagged ones on top, then a count of spam with one example reason.

## Route B: the browser

### What you need

- Signed in to Webflow with a workspace member who can open the site's settings (Site settings are hidden from guests and from Designer-only seats on some plans).

If something is missing, say what and stop; do not invent numbers.

### Steps

Start at https://webflow.com/dashboard. The user is signed in already; never type passwords or codes, and ask if a sign-in page appears.

1. **Open the site's form submissions**: In the Webflow dashboard, pick the workspace and open the site's **Site settings** (the gear on the site card), then the **Forms** tab. The **Form submissions** table lists every submission with the form name, the date and the fields. For an agency, repeat per client site.
2. **Read what arrived since the last digest**: The table is newest first. Read down until the date passes yesterday 9:00 (Friday 9:00 on a Monday). If the site gets more than a page of submissions a day, click **Download CSV** and filter the file by date instead.
3. **Set spam aside**: Mark a submission as spam when the message is mostly links, pitches SEO, backlinks or crypto, repeats another word for word, or the name and message are gibberish. Keep the reason; do not delete rows in Webflow.
4. **Summarize and post**: For each real submission: form, name, company or email domain, and the ask in under 15 words. Flag anything mentioning budget, a deadline or a meeting. Group by form, flagged ones on top, then the spam count with one example reason.

Note: The Forms tab is the better route for sites with a few submissions a day: it needs no token and shows every field. The CSV download is the only way to get more than the table shows at once. Sites on the old Webflow hosting plans show the same tab under **Project settings**.

## The report

- **Counts**: real submissions and spam since the last digest.
- **By form**: name, company or domain, the ask in one line, and when.
- **Flagged**: enquiries with a budget, a deadline or a meeting request.
- **Spam**: a count and the most common reason.

## Post it to Briefkin

When `BRIEFKIN_TOKEN` is set, or `~/.config/briefkin/env` exists (the installer from https://briefkin.dev/docs writes it), also send the result to the user's Briefkin board as one card. Keep the `item_key` the same on every run so the card updates in place, use a new `event_id` per run, and put today's real numbers in place of the example ones. If the request fails, say so once and carry on.

```bash
[ -n "${BRIEFKIN_TOKEN:-}" ] || . ~/.config/briefkin/env
curl -sS -X POST "${BRIEFKIN_URL:-https://briefkin.dev}/v1/events" \
  -H "authorization: Bearer $BRIEFKIN_TOKEN" \
  -H "content-type: application/json" \
  -d @- <<'JSON'
{
  "v": 1,
  "event_id": "webflow-form-submissions-digest/<date of this run, e.g. 2026-10-16>",
  "item_key": "webflow-form-submissions-digest",
  "project": "example.com",
  "source": "Webflow form submissions digest skill",
  "kind": "update",
  "title": "8 new form submissions, 3 set aside as spam",
  "summary": "**5 real enquiries** since yesterday. One demo request mentions a **$40k budget** and a January launch.",
  "widget": [
    {
      "type": "Table",
      "props": {
        "columns": [
          "Form",
          "From",
          "Ask"
        ],
        "rows": [
          [
            "Demo request",
            "Priya N., northwind.io",
            "Demo for 25 seats, $40k budget, launch in January"
          ],
          [
            "Demo request",
            "Tom B., halcyon.co",
            "Wants to see the Shopify integration"
          ],
          [
            "Contact",
            "Lea M., gmail.com",
            "Can she pay yearly by invoice?"
          ],
          [
            "Contact",
            "Sam K., bluepeak.org",
            "Nonprofit discount?"
          ],
          [
            "Newsletter",
            "j.ortiz@fastmail.com",
            "Signed up from the pricing page"
          ]
        ]
      }
    },
    {
      "type": "Badges",
      "props": {
        "items": [
          {
            "label": "Demo request 2",
            "tone": "accent"
          },
          {
            "label": "Contact 2"
          },
          {
            "label": "Newsletter 1"
          },
          {
            "label": "Spam 3",
            "tone": "neutral"
          }
        ]
      }
    }
  ]
}
JSON
```

Widgets come from the Briefkin catalog (https://briefkin.dev/v1/catalog). Without a token, just give the user the report.

## Run it on a schedule

Suggested: Weekdays at 9:00 (`0 9 * * 1-5`). From cron, with the agent signed in on that machine:

```bash
0 9 * * 1-5 claude -p "Run the webflow-form-submissions-digest skill"
# Codex: codex exec, Gemini CLI: gemini -p, Copilot CLI: copilot -p, OpenCode: opencode run
```

Or use the agent's own scheduler (Claude Code routines, Codex automations, Claude or ChatGPT scheduled tasks): https://briefkin.dev/skills/webflow-form-submissions-digest#schedule

Source: https://briefkin.dev/skills/webflow-form-submissions-digest

What your agent needs

  • A Webflow site API token with read scopes (sites:read, forms:read), in WEBFLOW_API_TOKEN.

  • Or Webflow's MCP server (https://mcp.webflow.com/mcp), if the tools it lists in your client include form submissions; it can also edit sites, so keep the skill to reads.

Connecting Webflow

  1. Webflow MCP server, Webflow's official remote server at https://mcp.webflow.com/mcp. In Claude Code run claude mcp add --transport http webflow https://mcp.webflow.com/mcp, then /mcp; the OAuth page lets you choose which sites to authorize and installs the MCP Bridge App, which only matters for Designer actions (docs). Webflow documents Claude (it's in the connector directory), Codex and Cursor as clients. Each authorization covers one workspace, and the agent works within your Webflow role.
  2. Data API with a site token. In the site's settings under Apps & integrations, generate an API token with read scopes only (sites:read, cms:read, pages:read, forms:read), store it in WEBFLOW_API_TOKEN with WEBFLOW_SITE_ID, and send it as Authorization: Bearer.

The MCP server can build and edit pages, styles and CMS content, so for unattended reports a site token with read scopes is the narrower credential.

Questions

Why does it read every page of submissions?

The form submissions endpoint has no date filter and does not document its sort order, so the skill pages through everything and filters by dateSubmitted itself. At 100 per call that is quick for most sites; if a form has thousands of old submissions, export and remove the old ones in Webflow from time to time.

Will it mark a real enquiry as spam?

It can, which is why spam is set aside, not deleted, and the card shows the count and reason. Read the spam pile now and then for the first couple of weeks, and add the patterns it gets wrong to the skill.

Do I need Briefkin to use the Webflow form submissions digest skill?

No. The skill runs with your own agent and gives you the report in the chat. With a Briefkin token set, each run also posts it to your board as a report card, so you can glance at it instead of asking again.

Which agents can run it?

Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot CLI, OpenCode, Windsurf and Amp all read SKILL.md files. The install command puts it in ~/.claude/skills and ~/.agents/skills, where they look. ChatGPT, the Claude app and Grok take the prompt instead. Pick your agent under "Install and run it" and the commands change to match.

Can it work without an API or MCP server, from my browser?

Yes. Switch the data source to "Your browser" and the steps change to the Webflow pages themselves: the agent opens webflow.com/dashboard in a browser you are signed in to and reads the numbers off the page. Claude Code, Codex, Cursor, Claude app and ChatGPT can drive a browser out of the box; Gemini CLI, Copilot CLI and OpenCode need a Playwright or Chrome DevTools MCP server first. It is slower than the API and needs you signed in, so it suits a report you run by hand or from a scheduler on your own computer.

Read this report on your board, not in a chat log

Skills are free to use with any agent. Briefkin is where their results land: one board for every report, number and question your agents send, with a ping when something needs you.

Free during the open beta. No card.