I'm attempting to set up an automation where messages sent in Slack are stored in Airtable. I've successfully configured the workflow to add new rows to my Airtable when messages are sent, but the rows themselves are empty. I've spent a lot of time troubleshooting without success.
Project Overview
You are aiming to construct an automation that transfers Slack messages from specific channels (designated as job sites) into an Airtable base named “Job Management”, specifically within the “Job Messages” table. Each Slack message should result in a new row in Airtable, containing details such as:
message
messageType
slackUserId
slackChannelId
timestamp
job address
(extracted from the channel name)hoursWorked
debug
(a JSON payload for troubleshooting)
What’s Working
- The Slack Trigger is activating as expected (
New Message Posted to Channel
) - Your custom code within the Set Message Info node is successfully parsing Slack events and assigning a
messageType
based on keywords (e.g., “started grading”, “ended grading”) - Slack channel information (like job address) is being extracted correctly in a separate node.
- You have utilized a Merge node to consolidate outputs from both preceding nodes before transmitting them to Airtable.
- Airtable credentials are confirmed to be connected, and you can select the appropriate base and table.
Steps You’ve Taken
-
Tested individual node output
- The output from the Set Message Info node appears correct and includes all anticipated fields.
- The output from the Merge node accurately combines channel and message information.
-
Created new Airtable fields (message, debug, test)
- Confirmed the correct field names and types (
long text
andtext
). - Also noted the field IDs, such as
fldrfrCSSVeaFpiyzC
, and attempted to use these directly.
- Confirmed the correct field names and types (
-
Tried expressions and fixed values
- Employed expressions like
{{ $json["message"] }}
and{{ JSON.stringify($json, null, 2) }}
. - Also experimented with hardcoded fixed values like
"Hello from callin.io"
in the same fields. - Even with valid hardcoded values, the Airtable table continued to display blank rows.
- Employed expressions like
-
Deactivated and reactivated the workflow
- This was done to enable test execution, as the Slack Trigger prevents simultaneous test and production listening.
-
Rebuilt the Airtable node from scratch
- Switched to the “Create Record” option with “Map Each Column Manually”.
- Verified column visibility and ensured correct selection.
The Problem
Despite:
- Observing successful executions within callin.io,
- The data being correctly formatted in the output,
- And no apparent mismatches in Airtable permissions or field names...
No field values are appearing in Airtable; only empty rows are being generated.
Even fixed text values are not showing up in Airtable, which suggests the issue lies with the Airtable node's interaction rather than your JSON parsing or merge logic.
What You Need
You are seeking assistance to:
- Review the Airtable node configuration.
- Potentially identify a version mismatch, an input binding issue, or an internal bug within the Airtable node.
- Help in getting at least one message to populate correctly in Airtable.
{
"name": "Slack to Airtable",
"nodes": [
{
"parameters": {
"trigger": ["message"],
"watchWorkspace": true,
"options": {}
},
"type": "n8n-nodes-base.slackTrigger",
"typeVersion": 1,
"position": [140, -60],
"name": "Slack Trigger",
"credentials": {
"slackApi": {
"id": "REDACTED",
"name": "REDACTED"
}
}
},
{
"parameters": {
"functionCode": "const data = $json;nconst message = data.text || "";nconst user = data.user || "";nconst channelId = data.channel || "";nconst timestamp = data.ts || "";nnlet messageType = "Other";nlet workDescription = message;nlet hoursWorked = "";nnif (/started grading/i.test(message)) {n messageType = "Start";n} else if (/ended grading/i.test(message)) {n messageType = "End";n}nnreturn [n {n json: {n message,n slackUserId: user,n slackChannelId: channelId,n timestamp,n messageType,n workDescription,n hoursWorkedn }
}
];"
},
"type": "n8n-nodes-base.function",
"typeVersion": 1,
"position": [160, 120],
"name": "Set Message Info"
},
{
"parameters": {
"resource": "channel",
"operation": "get",
"channelId": {
"rl": true,
"value": "REDACTED",
"mode": "id"
},
"options": {}
},
"type": "n8n-nodes-base.slack",
"typeVersion": 2.3,
"position": [160, 280],
"name": "Extract Job Address from Slack Channel",
"credentials": {
"slackApi": {
"id": "REDACTED",
"name": "REDACTED"
}
}
},
{
"parameters": {
"mode": "combine",
"combineBy": "combineByPosition",
"options": {}
},
"type": "n8n-nodes-base.merge",
"typeVersion": 3.2,
"position": [420, 100],
"name": "Merge"
},
{
"parameters": {
"operation": "create",
"base": {
"rl": true,
"value": "REDACTED",
"mode": "list"
},
"table": {
"rl": true,
"value": "REDACTED",
"mode": "list"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"message": "={{ $json["message"] }}",
"debug": "={{ JSON.stringify($json, null, 2) }}",
"test": "="Hello from callin.io""
}
}
},
"type": "n8n-nodes-base.airtable",
"typeVersion": 2.1,
"position": [700, 140],
"name": "Airtable",
"credentials": {
"airtableTokenApi": {
"id": "REDACTED",
"name": "REDACTED"
}
}
}
],
"connections": {
"Slack Trigger": {
"main": [[{"node": "Set Message Info", "type": "main", "index": 0 }]]
},
"Set Message Info": {
"main": [
[{ "node": "Extract Job Address from Slack Channel", "type": "main", "index": 0 }],
[{ "node": "Merge", "type": "main", "index": 0 }]
]
},
"Extract Job Address from Slack Channel": {
"main": [[{"node": "Merge", "type": "main", "index": 1 }]]
},
"Merge": {
"main": [[{"node": "Airtable", "type": "main", "index": 0 }]]
}
},
"pinData": {},
"meta": {
"templateCredsSetupCompleted": true,
"instanceId": "REDACTED__"
}
}
Hello, welcome to the community.
Could you please elaborate on your question? Attaching your workflow (not a screenshot, but the actual workflow by copying and pasting it within triple backticks here) would be very helpful for everyone to review.
I'm not sure how to share my workflow.
I'm completely new to this.
You can achieve this as follows (thanks for the visuals):
You are so incredible. I can’t believe someone is helping
I added the workflow to my original post.
After running the workflow, are all the expected values visible in the input pane of the final node (Airtable)? If your mapping mode is set to “Map each column manually”, you'll need to define the mapping. Otherwise, with “Map Automatically”, the fields must correspond to the names of the Columns in Airtable.
YOU ARE JOKING. I did this, it took one second, and it worked. You are my savior. I’ve spent probably 12 hours using chat gpt to troubleshoot this. I know, silly, but I’m just a mom who works after her baby is in bed trying to find a way to automate invoicing for our business. You have no idea the relief you’ve given me. I’m going to add back in the other fields I want to capture from slack/columns. Once I get that working I will see if I can figure out the QuickBooks invoicing integration so invoices are drafted in real time from slack messages sent by my team.
Wow. What an amazing community. I joined last night out of desperation but had no idea I would get an answer let alone a solution.
I have hope..
Can I hire you? I’m in a pinch.
I'm uncertain if I can share my link directly here. However, you're welcome to view my profile, where you'll find a link to connect with me. Thank you.
Alternatively, feel free to send me your related link via direct message.
Could you send me an email so we can arrange a call, perhaps via Teams, and I can send payment via PayPal or your preferred method?