Jotform to Attio CRM, Slack alerts for every lead
Leads come in, and somehow they still get missed. Someone forgets to create the deal. Someone else replies in Slack but never logs it. Two days later you’re staring at the same Jotform submission… again.
This Jotform Attio automation hits sales leads and marketing ops first, but founders feel it too when revenue is tied to response time. The outcome is simple: every submission becomes a tracked deal in Attio, and your team gets a Slack ping right away.
Below you’ll see exactly how the workflow routes new vs. existing leads, keeps your CRM structure clean, and makes sure follow-ups don’t quietly die in someone’s inbox.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Jotform to Attio CRM, Slack alerts for every lead
flowchart LR
subgraph sg0["Flow 1"]
direction LR
n0@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Switch", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields", pos: "b", h: 48 }
n2@{ icon: "mdi:cog", form: "rounded", label: "If pending status does not e..", pos: "b", h: 48 }
n3@{ icon: "mdi:cog", form: "rounded", label: "If urgent status does not ex..", pos: "b", h: 48 }
n4@{ icon: "mdi:cog", form: "rounded", label: "If message column does not e..", pos: "b", h: 48 }
n5@{ icon: "mdi:cog", form: "rounded", label: "If deals id does not exist", pos: "b", h: 48 }
n6@{ icon: "mdi:cog", form: "rounded", label: "Get the deals id", pos: "b", h: 48 }
n7@{ icon: "mdi:cog", form: "rounded", label: "Get the deals id1", pos: "b", h: 48 }
n8@{ icon: "mdi:cog", form: "rounded", label: "If people id does not exist", pos: "b", h: 48 }
n9@{ icon: "mdi:cog", form: "rounded", label: "Get the people id", pos: "b", h: 48 }
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Get the deals id (CRM)"]
n11@{ icon: "mdi:cog", form: "rounded", label: "Add deals id to DB", pos: "b", h: 48 }
n12["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Add pending status to CRM"]
n13@{ icon: "mdi:cog", form: "rounded", label: "Add pending status to DB", pos: "b", h: 48 }
n14["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Add urgent status to CRM"]
n15@{ icon: "mdi:cog", form: "rounded", label: "Add urgent status to DB", pos: "b", h: 48 }
n16["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Get the people id (CRM)"]
n17@{ icon: "mdi:cog", form: "rounded", label: "Add people id to DB", pos: "b", h: 48 }
n18["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Add message column to CRM"]
n19@{ icon: "mdi:cog", form: "rounded", label: "Add message column to DB", pos: "b", h: 48 }
n20["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Get customer by email"]
n21["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Prepare customer data"]
n22@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check if the customer is in ..", pos: "b", h: 48 }
n23["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Update the deal"]
n24["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Create a new deal"]
n25["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Send slack message"]
n26["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Add the customer to the CRM"]
n27["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Receive form submissions"]
n0 --> n23
n0 --> n24
n1 --> n2
n1 --> n3
n1 --> n4
n1 --> n5
n1 --> n8
n1 --> n20
n23 --> n25
n6 --> n12
n24 --> n25
n7 --> n14
n9 --> n18
n20 --> n21
n21 --> n22
n10 --> n11
n16 --> n17
n14 --> n15
n27 --> n1
n18 --> n19
n12 --> n13
n5 --> n10
n26 --> n24
n8 --> n16
n3 --> n7
n4 --> n9
n2 --> n6
n22 --> n0
n22 --> n26
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0,n22 decision
class n10,n12,n14,n16,n18,n20,n23,n24,n25,n26,n27 api
class n21 code
classDef customIcon fill:none,stroke:none
class n10,n12,n14,n16,n18,n20,n21,n23,n24,n25,n26,n27 customIcon
The Problem: Jotform Leads Fall Through the Cracks
If you collect inquiries in Jotform and handle sales in Attio, the messy part is the in-between. A form submission lands, then you (or someone on the team) has to copy the name, email, and message into the CRM, create a deal, pick the right stage, and notify someone to respond. Do that a few times per day and you’re spending real time on clerical work. Worse, the manual steps invite subtle mistakes: duplicate contacts, deals created in the wrong stage, or a “quick Slack heads up” that never becomes a tracked follow-up.
None of these alone is the problem. Together, they are.
- Someone has to decide if the lead already exists, which is where duplicates are born.
- Deals don’t get created consistently, so your pipeline looks cleaner than reality.
- Stages drift over time because people improvise instead of following one structure.
- Slack notifications happen informally, which means the “owner” is unclear and response time slows down.
The Solution: Clean Attio Deals + Instant Slack Alerts
This n8n workflow turns every Jotform submission into a controlled, repeatable CRM process. It starts the moment someone submits your form, then maps the incoming fields (name, email, message) into a consistent format. Next, it checks your Attio setup before it touches your data: if your “Pending” and “Urgent” deal stages don’t exist, the workflow creates them; if your “Message” attribute is missing, it adds that too. From there, it looks up the person by email and decides what to do based on deal status. New lead? Create the contact, create a new deal in “Pending,” then notify Slack. Existing lead with no deal? Create the deal and ping Slack. Existing lead with a deal already in play? Move that deal to “Urgent” and alert the team so it doesn’t sit.
The workflow begins with an incoming Jotform webhook, then it verifies your Attio structure (stages and message field) so your pipeline stays consistent. Finally, it routes the lead down the correct path and posts a Slack message after the CRM action is complete, which means the notification matches reality.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you get 15 Jotform leads per week. Manually, it’s usually about 10 minutes each to search Attio, create or update the contact, open a deal, choose a stage, paste the message, and then tell the team in Slack, so that’s roughly 2.5 hours every week. With this workflow, submitting the form is the only “work” the lead needs. n8n processes in the background and posts a Slack alert within a minute or two, which means you get those hours back and the pipeline stays current.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Jotform to capture lead submissions.
- Attio CRM to create contacts and manage deals.
- Slack to notify your team instantly.
- Attio API access (generate a key in Attio developer settings).
Skill level: Intermediate. You’ll connect accounts, paste API keys, and test a few sample submissions.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A Jotform submission triggers everything. The workflow starts with an incoming webhook that receives the form fields (typically name, email, and message) the second the user hits submit.
The lead data gets cleaned and standardized. n8n maps the input into a predictable format so your Attio records don’t end up with slightly different field names or missing values. This is also where you can extend the mapping if your form includes company, budget, or source.
Attio is checked and prepared before any updates. The workflow verifies that “Pending” and “Urgent” deal stages exist and creates them if they’re missing. It also checks for a “Message” attribute so the original inquiry text can live inside the CRM, not just in Jotform.
The right CRM action happens, then Slack gets the alert. n8n looks up the person by email, routes the lead based on whether a deal exists, creates or updates the deal stage (including moving to “Urgent” for active leads), and posts a Slack notification once that’s done.
You can easily modify the stage names and the Slack message format based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Webhook Trigger
This workflow starts when a form submission hits your webhook endpoint.
- Add the Incoming Form Webhook node and set HTTP Method to
POST. - Set the Path to
eventsso your form submits to/webhook/events. - Click Listen for test event to generate the webhook URL and confirm it receives
name,email, andmessagein the payload.
Step 2: Connect Attio and Normalize Input Data
Map incoming fields into a structured JSON object and prepare Attio status and column definitions.
- Open Map Input Fields and set Mode to
raw. - Paste the full JSON Output exactly as provided, including the expressions for
{{ $json.body.name }},{{ $json.body.email }}, and{{ $json.body.message }}. - Review the predefined keys and labels like
PENDING_STATUS,URGENT_STATUS, and themessagecolumn metadata to match your Attio schema. - Map Input Fields outputs to Check Pending Stage Missing, Check Urgent Stage Missing, Check Message Field Missing, Verify Deal ID Absent, Verify People ID Absent, and Lookup Customer by Email in parallel—confirm all branches are connected.
- Credential Required: Connect your
httpBearerAuthcredentials to all Attio HTTP nodes including Fetch Deal Object ID, Create Pending Stage, Create Urgent Stage, Fetch People Object ID, Create Message Attribute, Lookup Customer by Email, Modify Existing Deal, Generate New Deal, and Create Customer Record.
Step 3: Set Up Data Table Checks and Schema Bootstrapping
The workflow uses multiple data table checks to determine whether it needs to create Attio statuses, attributes, and object IDs.
- In Check Pending Stage Missing, set the condition key to
{{ $json.statuses.pending.key }}and ensure Operation isrowNotExists. - In Check Urgent Stage Missing, set the condition key to
{{ $json.statuses.urgent.key }}with Operation asrowNotExists. - In Check Message Field Missing, set the condition key to
{{ $json.columns.message.key }}and Operation torowNotExists. - In Verify Deal ID Absent and Verify People ID Absent, confirm the key values are
DEALS_IDandPEOPLE_ID, respectively. - Use Retrieve Deal ID Entry, Retrieve Deal ID Entry 2, and Retrieve People ID Entry with Operation set to
getand Limit to1to fetch object IDs for stage/attribute creation. - Keep Store Deal ID in Table, Store People ID in Table, Record Pending Stage, Record Urgent Stage, and Record Message Attribute mapped to
{{ $('Map Input Fields').item.json.data_tables_id }}so the lookup table stays consistent.
⚠️ Common Pitfall: Leaving data_tables_id blank in Map Input Fields will cause all data table operations to fail. Ensure this ID is set before testing.
Step 4: Configure Attio Customer and Deal Logic
This section determines whether a customer exists, then updates or creates deals and people records accordingly.
- In Lookup Customer by Email, set the URL to
https://api.attio.com/v2/objects/people/records/queryand keep the JSON Body filter as{{ $('Map Input Fields').item.json.customer.email }}. - Ensure Assemble Customer Profile uses the provided JavaScript to output
existsanddeal.existsbooleans. - Configure Validate Customer Presence to evaluate
{{ $json.exists }}and branch to Route by Deal Status or Create Customer Record. - In Route by Deal Status, confirm the two outputs “Deal exists” and “Deal doesn't exist” use the condition
{{ $json.deal.exists }}. - For Modify Existing Deal, keep the URL as
https://api.attio.com/v2/objects/deals/records/{{ $json.deal.details.target_record_id }}and the JSON Body stage value as{{ $('Map Input Fields').item.json.statuses.urgent.value }}. - For Create Customer Record and Generate New Deal, preserve the dynamic values for name, email, message, stage, and owner as shown in their JSON Body fields.
Pending and Urgent in Map Input Fields so the values sent in Create Pending Stage, Create Urgent Stage, and Modify Existing Deal match your pipeline.Step 5: Configure Notifications and Output Handling
Notify your team in Slack after a deal is created or updated.
- In Post Slack Notification, keep the JSON Body text as
<!channel> Data has been {{ $('Assemble Customer Profile').item.json.deal.exists ? "updated": "created" }} for this <{{ $json.data.web_url }}|deal>. - Ensure both Modify Existing Deal and Generate New Deal connect to Post Slack Notification.
- If your Slack endpoint requires authentication, add it directly in Post Slack Notification (this node currently has no credentials configured).
Step 6: Test and Activate Your Workflow
Verify the full lead-processing flow before turning the workflow on.
- Click Execute Workflow and send a test payload to the Incoming Form Webhook with
name,email, andmessagefields. - Confirm that Lookup Customer by Email returns data and Assemble Customer Profile outputs
existsanddeal.existsas expected. - Verify that either Modify Existing Deal or Generate New Deal runs and that Post Slack Notification posts a message with the deal URL.
- Check your data table entries are created by Record Pending Stage, Record Urgent Stage, Record Message Attribute, Store Deal ID in Table, and Store People ID in Table.
- When tests pass, toggle the workflow to Active to enable production processing.
Common Gotchas
- Attio credentials can expire or need specific permissions. If things break, check your Attio API key status and workspace access first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 45 minutes if your Attio API access is ready.
No. You will connect accounts, paste an API key, and test a few sample submissions.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Attio and Slack usage, but there’s no per-lead fee from this workflow itself.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, but keep it consistent. You’d update the stage-check and stage-create HTTP Request nodes so they look for your stage names instead of “Pending” and “Urgent,” then adjust the routing logic that moves deals between stages. Many teams also customize the Slack message to include the lead’s message, the deal stage, and a direct link to the Attio record.
Most of the time it’s an expired or wrong API key. Regenerate your Attio key, update it in n8n, and confirm it has access to the right workspace. If it still fails, check the HTTP Request node logs for a 401/403 response and make sure the endpoint you’re calling matches your Attio object IDs.
A lot. On n8n Cloud, your monthly execution limit depends on the plan you choose, and each form submission usually counts as one execution. If you self-host, there’s no execution cap from n8n, so the practical limit becomes your server size plus Attio and Slack rate limits.
Often, yes, for one reason: this workflow does more than move fields. It checks and creates CRM structure (stages and attributes), then routes logic based on “lead exists” and “deal exists,” which is where simpler automations get brittle. n8n also gives you the self-host option, so you can run high volume without paying per task. Zapier or Make can still be a fine fit if you only need “Jotform → create contact → send Slack” and nothing else. If you’re unsure, Talk to an automation expert and you’ll get a straight recommendation.
Once this is live, leads stop being a “remember to do it” task and start being a system. The workflow handles the repetitive parts, and your team can focus on replying fast and closing the deal.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.