Skip to content
Slack --> callin.io...
 
Notifications
Clear all

Slack --> callin.io --> Airtable

12 Posts
3 Users
0 Reactions
3 Views
Jessica_Sutton
(@jessica_sutton)
Posts: 7
Active Member
Topic starter
 

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.


:wrench: 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)

:white_check_mark: 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.

:hammer_and_wrench: Steps You’ve Taken

  1. 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.
  2. Created new Airtable fields (message, debug, test)

    • Confirmed the correct field names and types (long text and text).
    • Also noted the field IDs, such as fldrfrCSSVeaFpiyzC, and attempted to use these directly.
  3. 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.
  4. Deactivated and reactivated the workflow

    • This was done to enable test execution, as the Slack Trigger prevents simultaneous test and production listening.
  5. Rebuilt the Airtable node from scratch

    • Switched to the “Create Record” option with “Map Each Column Manually”.
    • Verified column visibility and ensured correct selection.

:police_car_light: 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...

:backhand_index_pointing_right:

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.


:red_question_mark: 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__"
}
}

 
Posted : 17/06/2025 3:15 am
jabbson
(@jabbson)
Posts: 40
Eminent Member
 

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.

 
Posted : 17/06/2025 3:18 am
Jessica_Sutton
(@jessica_sutton)
Posts: 7
Active Member
Topic starter
 

I'm not sure how to share my workflow.

:confused:

I'm completely new to this.

 
Posted : 17/06/2025 3:21 am
jabbson
(@jabbson)
Posts: 40
Eminent Member
 

You can achieve this as follows (thanks for the visuals):

 
Posted : 17/06/2025 3:34 am
Jessica_Sutton
(@jessica_sutton)
Posts: 7
Active Member
Topic starter
 

You are so incredible. I can’t believe someone is helping

:sleepy_face:

I added the workflow to my original post.

 
Posted : 17/06/2025 3:37 am
jabbson
(@jabbson)
Posts: 40
Eminent Member
 

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.

 
Posted : 17/06/2025 3:58 am
darrell_tw
(@darrell_tw)
Posts: 18
Active Member
 

If this is your current workflow

You might need to change to like this one

When you use merge, you need to provide the path and data for what to merge.

You can separate it at the front.

 
Posted : 17/06/2025 4:22 am
Jessica_Sutton
(@jessica_sutton)
Posts: 7
Active Member
Topic starter
 

This is what my callin.io workflow looks like. I'm quite new to this, so I suppose I should attempt what you've suggested? I'm a bit hesitant to break it further, though it seems to be already malfunctioning.

 
Posted : 17/06/2025 12:11 pm
Jessica_Sutton
(@jessica_sutton)
Posts: 7
Active Member
Topic starter
 

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..

 
Posted : 17/06/2025 5:55 pm
Jessica_Sutton
(@jessica_sutton)
Posts: 7
Active Member
Topic starter
 

Can I hire you? I’m in a pinch.

 
Posted : 26/06/2025 2:56 pm
darrell_tw
(@darrell_tw)
Posts: 18
Active Member
 

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.

 
Posted : 26/06/2025 3:03 pm
Jessica_Sutton
(@jessica_sutton)
Posts: 7
Active Member
Topic starter
 

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?

 
Posted : 26/06/2025 3:05 pm
Share: