How to Capture Webhook Form Leads and Create Monday Items with AI Enrichment

Receive marketing-site form submissions on a verified Webhook trigger, enrich each lead with company size, industry, and intent using an Agent-mode Connector node, then land qualified leads as Monday.com items and post them to Slack.

What This Integration Does

Marketing-site lead forms usually deliver thin data: a name, an email, maybe a message. Sales teams then spend time researching the company, deciding whether the lead is worth chasing, and copying it into a CRM board by hand. This Spojit workflow closes that gap. The moment your form posts to Spojit, the workflow verifies the request is genuine, looks up firmographic data about the company, asks the agent to reason over the raw fields plus that lookup, and writes a fully enriched, qualified lead straight onto a Monday.com board with a Slack heads-up to the team.

The workflow is triggered by an external HTTP POST from your marketing site to the workflow's Webhook URL. Spojit verifies the request signature against an HMAC signing connection, parses the JSON body into {{ input }}, calls a public company-data REST API through the http connector, runs a Connector node in Agent mode with a Response Schema to force structured JSON, branches on the result with a Condition node, and for qualified leads creates a Monday item and sends a Slack message. The webhook returns 202 with an executionId immediately, so your form gets a fast response while enrichment runs in the background. Each submission is its own run, so re-posting the same form (for example a user double-clicking submit) produces a separate run unless you enable event-id dedup.

Prerequisites

  • A Webhook signing connection set up under Connections (scheme Custom for a marketing-site HMAC, or Spojit if your form posts through Spojit's own signing). See the prerequisites note in Step 1.
  • A Monday.com connection, plus the target boardId and the column IDs you want to populate (company size, industry, intent, email). Use the monday get-board tool once to read the column IDs.
  • A Slack connection with permission to post to your sales channel, and the channel name or ID.
  • A public company-data REST API you can call by email domain (for example a firmographic lookup endpoint), and its base URL plus any API key.
  • Your marketing form configured to POST JSON (name, work email, company, message) to the workflow's Webhook URL with an HMAC signature header.

Step 1: Receive the form POST on a verified Webhook trigger

Add a Trigger node and set its type to Webhook. Spojit generates the URL your form posts to. Under the trigger's signing settings, attach your Webhook signing connection so Spojit verifies the HMAC signature on every incoming request and rejects anything unsigned or tampered with. Pick the scheme that matches how your marketing site signs the body: choose Custom when your site computes its own HMAC over the raw body, or Spojit if the form is signed by Spojit's standard scheme. The trigger output is the parsed JSON body, available downstream as {{ input }}. A typical body looks like:

{
  "name": "Dana Okafor",
  "email": "dana@acme-robotics.com",
  "company": "Acme Robotics",
  "message": "Looking to automate our order routing for 200 stores."
}

If you want to protect against a form double-submit, enable opt-in dedup using an event-id header so a repeated request with the same id does not start a second run. For a deeper walkthrough of signing schemes, see the guide on setting up a Webhook trigger and the reference on setting up a webhook connection.

Step 2: Look up firmographic data via the http connector

Add a Connector node on the http connector in Direct mode and choose the http-get tool to call your public company-data REST API. Derive the company domain from the lead's email and pass it as a query parameter, and include any API key in the Authorization header. Configure the request like this:

URL: https://api.company-data.example.com/v1/lookup?domain={{ input.email }}
Headers:
  Authorization: Bearer YOUR_API_KEY
  Accept: application/json

Direct mode is the right choice here because this is a single, predictable call with no AI cost. The response (employee count, industry, region, and similar fields) is bound to a result variable such as {{ firmographics }} for the next step. If you do not have a native tile for your data source, this http-get pattern reaches any REST API honestly; see the tutorial on connecting to any REST API using HTTP Requests.

Step 3: Enrich and qualify the lead with Agent mode and a Response Schema

Add a second Connector node, this time in Agent mode, so the agent can reason over both the raw form fields and the firmographic lookup. In the prompt, hand it the full picture and tell it what to decide:

You are enriching an inbound sales lead. Using the raw form fields and the
firmographic lookup, infer the company size band, primary industry, and the
buyer intent expressed in the message. Decide whether this lead is qualified.

Raw form: {{ input }}
Firmographics: {{ firmographics }}

Turn on the Response Schema to force the agent to return structured JSON instead of prose, so the next nodes can map fields reliably. Use a schema such as:

{
  "type": "object",
  "properties": {
    "companySize": { "type": "string", "enum": ["1-50", "51-200", "201-1000", "1000+"] },
    "industry":    { "type": "string" },
    "intent":      { "type": "string", "enum": ["high", "medium", "low"] },
    "qualified":   { "type": "boolean" },
    "summary":     { "type": "string" }
  },
  "required": ["companySize", "industry", "intent", "qualified"]
}

Bind the result to {{ lead }}. Agent mode costs AI credits, but it is the right tool here because qualification is a judgment call. To compare the two modes, see the guide on using Connector nodes in Agent mode and the tutorial on using structured output for reliable AI data extraction.

Step 4: Route qualified leads with a Condition node

Add a Condition node that checks the structured result. Set the condition to compare {{ lead.qualified }} equals true (you can add a second clause such as {{ lead.intent }} is high to be stricter). The true branch continues to Monday and Slack; the false branch can simply end the run, or route low-intent leads to a lighter nurture path. Keeping unqualified leads off the board keeps your sales team focused on real opportunities. For more on branching, read the guide on using Condition nodes.

Step 5: Create the enriched lead as a Monday item

On the true branch, add a Connector node on the monday connector in Direct mode and choose the create-item tool. Set boardId to your CRM board, set name to the company or contact name, and optionally set groupId to drop the item into a specific group (such as a "New Leads" group). Map the enriched fields onto your board columns through columnValues, which takes an object keyed by your column IDs:

boardId: "1234567890"
name: "{{ input.company }} - {{ input.name }}"
groupId: "new_leads"
columnValues: {
  "email":         { "email": "{{ input.email }}", "text": "{{ input.email }}" },
  "company_size":  "{{ lead.companySize }}",
  "industry":      "{{ lead.industry }}",
  "intent":        "{{ lead.intent }}",
  "summary":       "{{ lead.summary }}"
}

Run get-board once beforehand to confirm the exact column IDs and the value shape each column expects (email, status, and similar column types have specific formats). Bind the new item result to {{ mondayItem }} so you can reference its id in the Slack message.

Step 6: Post the lead to Slack

Add a final Connector node on the slack connector in Direct mode and choose the send-message tool. Target your sales channel and compose a message from the enriched fields so the team sees the highlights at a glance:

channel: "#sales-leads"
text: "New qualified lead: {{ input.company }} ({{ lead.companySize }}, {{ lead.industry }}).
Intent: {{ lead.intent }}. {{ lead.summary }}
Added to Monday board as item {{ mondayItem.id }}."

If you prefer to look up the channel by name first, run list-channels once and store the channel ID. You now have an end-to-end path: a signed form post becomes an enriched, qualified Monday row with a Slack notification, with no manual research in between.

Tips

  • Ask Miraxa to scaffold the skeleton ("Build a workflow with a Webhook trigger, an http http-get lookup, a monday create-item step, and a slack send-message step"), then fine-tune each node in the properties panel.
  • Keep the Agent prompt focused on decisions you cannot make deterministically. Anything you can derive with plain logic (such as parsing the domain from the email) is cheaper in a Transform or http-get step.
  • Cache or rate-limit the firmographic http-get if your public API has request quotas, and add a fallback so a lookup miss still lets the agent qualify from the form fields alone.
  • Use the workflow owner's allowlisted channel for testing before pointing the form at production, so a misfire does not spam your real sales channel.

Common Pitfalls

  • Signature mismatches: if the Webhook trigger rejects requests, confirm your marketing site signs the exact raw body bytes with the same secret configured on the signing connection, and that the scheme (Custom vs Spojit) matches.
  • Free-text from Agent mode: without the Response Schema turned on, the agent can return prose, which breaks the field mapping in Step 5. Always force JSON with a schema and mark the fields you map as required.
  • Wrong Monday column shape: create-item expects columnValues keyed by column ID, and several column types (email, status, date) need a specific value object, not a bare string. Read the column IDs and types with get-board first.
  • Duplicate runs: a form double-submit posts twice and creates two items. Enable event-id dedup on the Webhook trigger, or check for an existing item before create-item.

Testing

Before turning the form loose, test on a small scope. Send a single signed POST to the Webhook URL with a known company email using a curl command or your form's test mode, then open the run in execution history and step through each node: confirm {{ input }} parsed correctly, the http-get lookup returned firmographics, the Agent node produced valid JSON matching your schema, the Condition routed as expected, and that exactly one Monday item appeared with the right columns. Point the Slack send-message at a private test channel first. Once a handful of test leads land cleanly, switch the channel and group to production and let the live form drive it.

Learn More

Did this answer your question? Thanks for the feedback There was a problem submitting your feedback. Please try again later.