Intermediate~20 min setupCommunication & Project ManagementVerified April 2026
Slack logo
Basecamp logo

How to Create Basecamp Tasks from Slack Messages with n8n

Convert Slack messages into Basecamp tasks with assigned users and due dates so action items don't get lost in chat.

Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.

Best for

Teams that discuss project work in Slack but track tasks in Basecamp and need a quick way to convert decisions into actionable items.

Not ideal for

Teams wanting automatic task creation from every message — this works better as an on-demand slash command workflow.

Sync type

manual

Use case type

routing

Real-World Example

💡

A 12-person marketing agency uses this when clients request changes in their dedicated Slack channels. The account manager types '/task Fix homepage banner copy @sarah due:friday' and it creates a proper Basecamp task in the client's project with Sarah assigned. Before this, 30% of client requests mentioned in Slack never made it to the project tracker.

What Will This Cost?

Drag the slider to your expected monthly volume.

/mo
505005K50K

Each platform counts differently — Zapier: 1 task per trigger. Make: 1 operation per module per record. n8n: 1 execution per run.

Prices shown for annual billing. Based on published pricing as of April 2026.

Estimated ROI

1000

min saved/mo

$583

labor value/mo

Free

no platform cost

Based on ~2 min manual effort per operation at $35/hr fully loaded labor cost.

Implementation

Skip the setup

Import this workflow directly into n8n

Copy the pre-built n8n blueprint and paste it straight into n8n. All modules, filters, and field mappings are already configured — you just need to connect your accounts.

Before You Start

Make sure you have everything ready.

Basecamp account with API access enabled and at least one project with a todo list
Slack workspace admin permissions to create slash commands
List of Slack usernames mapped to Basecamp user IDs for assignment
n8n instance accessible from the internet (for webhook)

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Task Titlecontent
Project IDproject_id
Todo List IDtodolist_id
3 optional fields▸ show
Assigneeassignee_ids
Due Datedue_on
Notesnotes

Step-by-Step Setup

1

Workflows > + Create Workflow

Create new n8n workflow

Open n8n and create a blank workflow. You'll build a manual trigger that processes Slack slash commands. The workflow will parse message content, extract task details, and create the Basecamp task with proper assignment.

  1. 1Click '+ Create Workflow' from the main dashboard
  2. 2Select 'Start from scratch' option
  3. 3Name your workflow 'Slack to Basecamp Tasks'
What you should see: You should see an empty workflow canvas with a single 'When clicking Test workflow' node.
2

Node > Webhook

Add Slack slash command webhook

Replace the manual trigger with a Webhook node to receive Slack slash commands. Configure it to accept POST requests and extract the command text, user info, and channel details that Slack sends when someone uses your custom slash command.

  1. 1Delete the manual trigger node
  2. 2Click the '+' button and search for 'Webhook'
  3. 3Set HTTP Method to 'POST'
  4. 4Set Path to 'slack-task'
What you should see: You should see a webhook URL like https://yourn8n.com/webhook/slack-task that you'll use in Slack.
Common mistake — Copy the webhook URL now — you'll need it when setting up the Slack slash command and it's harder to find later.
3

Node > Code

Parse slash command text

Add a Code node to extract task title, assignee, and due date from the Slack command text. Users will type commands like '/task Update website @john due:tomorrow' and your code needs to parse each component reliably.

  1. 1Add a Code node after the Webhook
  2. 2Set the language to JavaScript
  3. 3Name it 'Parse Task Details'
What you should see: You should have a Code node connected to the Webhook with an empty JavaScript editor open.
Common mistake — Slack sends form-encoded data, not JSON — make sure to parse $input.first().body.text, not a JSON field.
4

Node > Basecamp

Connect to Basecamp

Add a Basecamp node and configure authentication. You'll need a Basecamp account with API access and the specific project ID where tasks should be created. The node will handle the API authentication and task creation.

  1. 1Add a Basecamp node after the Code node
  2. 2Click 'Create New Credential' for Basecamp
  3. 3Enter your Basecamp account URL and API token
  4. 4Select 'Create Task' as the operation
What you should see: You should see 'Connected' status and dropdown menus for Project and Todo List selection.
Common mistake — Basecamp requires you to select a specific todo list within a project — tasks can't be created at the project level directly.
5

Basecamp Node > Parameters

Map task fields

Configure the Basecamp node to use the parsed data from your Code node. Map the task title, assignee, due date, and notes field. Set up the project ID and todo list dynamically if you want to support multiple projects.

  1. 1Set Content field to {{ $node['Parse Task Details'].json.title }}
  2. 2Set Due Date to {{ $node['Parse Task Details'].json.dueDate }}
  3. 3Set Assignee to {{ $node['Parse Task Details'].json.assigneeId }}
  4. 4Set Notes to include original Slack message context
What you should see: All field mappings should show green checkmarks and preview the data structure from your Code node.
Common mistake — Basecamp assignee field expects user IDs, not @usernames — your Code node must convert Slack users to Basecamp user IDs.
Slack fields
text
user
channel
ts
thread_ts
available as variables:
1.props.text
1.props.user
1.props.channel
1.props.ts
1.props.thread_ts
6

Node > Respond to Webhook

Add Slack response

Add a Respond to Webhook node to send confirmation back to Slack. This prevents the 'command failed' error message and lets users know the task was created successfully with a link to view it in Basecamp.

  1. 1Add 'Respond to Webhook' node after Basecamp
  2. 2Set Response Code to 200
  3. 3Set Response Body to JSON format
  4. 4Include task confirmation message
What you should see: The response node shows a sample JSON structure that will appear in Slack after running the slash command.
7

Node Settings > On Error

Handle parsing errors

Add error handling for malformed slash commands. Connect an OnError route from the Code node to send helpful usage instructions back to Slack when users don't follow the expected command format.

  1. 1Click on the Parse Task Details Code node
  2. 2Go to Settings tab
  3. 3Set 'On Error' to 'Continue With Default Value'
  4. 4Add another Respond to Webhook node for error cases
What you should see: You should see two paths from the Code node — one for successful parsing and one for errors.
Common mistake — Without error handling, malformed commands will make the slash command appear broken to users instead of showing helpful guidance.
8

Slack Admin > Slash Commands

Create Slack slash command

Go to your Slack workspace settings and create a custom slash command that points to your n8n webhook. Configure the command name, description, and usage hint that users will see when typing the command.

  1. 1Go to api.slack.com and create a new app
  2. 2Navigate to Slash Commands and click Create New Command
  3. 3Set command to '/task' and paste your webhook URL
  4. 4Set description to 'Create Basecamp task from message'
What you should see: Your slash command should appear in Slack's autocomplete when you type '/task' in any channel.
Common mistake — Install the slash command to your workspace after creation — it's not automatically available until you complete the installation step.
9

Slack Channel > /task command

Test the complete workflow

Run a test command in Slack to verify the entire flow works. Try different command formats including edge cases like missing assignees or invalid due dates to make sure your error handling works properly.

  1. 1Go to any Slack channel and type '/task Test task @username due:tomorrow'
  2. 2Check n8n execution log for the webhook trigger
  3. 3Verify the task appears in Basecamp with correct details
  4. 4Test error case with malformed command
What you should see: You should see a success message in Slack and a new task in your Basecamp project with the parsed title, assignee, and due date.

This Code node handles parsing the slash command text and converting Slack usernames to Basecamp user IDs. Paste it in the 'Parse Task Details' Code node to extract all task components reliably.

JavaScript — Code Nodeconst commandText = $input.first().body.text || '';
▸ Show code
const commandText = $input.first().body.text || '';
const channelId = $input.first().body.channel_id;
const userId = $input.first().body.user_id;

... expand to see full code

const commandText = $input.first().body.text || '';
const channelId = $input.first().body.channel_id;
const userId = $input.first().body.user_id;

// User mapping - update with your actual IDs
const slackToBasecamp = {
  'sarah': 12345,
  'john': 12346,
  'mike': 12347
};

// Channel to project mapping
const channelProjects = {
  'C1234567': { projectId: 98765, todolistId: 11111 }, // client-acme
  'C7654321': { projectId: 98766, todolistId: 11112 }  // client-beta
};

// Parse task components
const titleMatch = commandText.match(/^([^@]+?)(?:\s+@|\s+due:|$)/);
const assigneeMatch = commandText.match(/@(\w+)/);
const dueDateMatch = commandText.match(/due:(\w+)/);

if (!titleMatch) {
  throw new Error('Task title is required');
}

const title = titleMatch[1].trim();
const assigneeSlackName = assigneeMatch ? assigneeMatch[1] : null;
const dueDateText = dueDateMatch ? dueDateMatch[1] : null;

// Convert due date
let dueDate = null;
if (dueDateText) {
  const today = new Date();
  switch(dueDateText.toLowerCase()) {
    case 'today':
      dueDate = today.toISOString().split('T')[0];
      break;
    case 'tomorrow':
      today.setDate(today.getDate() + 1);
      dueDate = today.toISOString().split('T')[0];
      break;
    case 'friday':
      const friday = new Date();
      friday.setDate(friday.getDate() + (5 - friday.getDay()));
      dueDate = friday.toISOString().split('T')[0];
      break;
  }
}

// Get project info
const projectInfo = channelProjects[channelId] || channelProjects['C1234567']; // default

return {
  title: title,
  assigneeId: assigneeSlackName ? slackToBasecamp[assigneeSlackName] : null,
  dueDate: dueDate,
  projectId: projectInfo.projectId,
  todolistId: projectInfo.todolistId,
  originalCommand: commandText,
  slackUser: userId
};
n8n
▶ Run once
executed
Slack
Basecamp
Basecamp
🔔 notification
received

Going live

Production Checklist

Before you turn this on for real, confirm each item.

Troubleshooting

Common errors and how to fix them.

Frequently Asked Questions

Common questions about this workflow.

Analysis

VerdictWhy n8n for this workflow

Use n8n for this if your team regularly discusses tasks in Slack but needs them tracked in Basecamp. The Code node gives you complete control over parsing natural language commands and mapping users between systems. n8n's webhook handling is reliable for Slack's 3-second response requirement. Skip this approach if you want automatic task creation from every message — you'd be better off with a scheduled workflow that scans for keywords.

Cost

This costs almost nothing to run. Each slash command execution uses 3-4 n8n operations (webhook, code, basecamp, response). At 50 tasks created per month, you're looking at 200 operations total. That's well within n8n's self-hosted free tier or costs $2/month on n8n Cloud's starter plan.

Tradeoffs

Zapier handles Slack slash commands better with built-in parsing for common patterns like @mentions and dates. Make's text parsing functions are more robust than writing custom JavaScript. Power Automate integrates better with Microsoft teams using similar slash patterns. But n8n wins because you can implement complex user mapping logic and multi-project routing that the other platforms make difficult without premium features.

You'll discover that Slack usernames don't match Basecamp usernames, requiring manual ID mapping. Users will ignore your command format and type natural language, breaking your parsing logic regularly. Basecamp's todo list requirement means you can't just create tasks at the project level — you need to map channels to specific lists, not just projects.

Ideas for what to build next

  • Add task status syncSet up a reverse sync so when Basecamp tasks are completed, it posts a notification back to the original Slack channel.
  • Support task editingCreate additional slash commands like /edit-task and /delete-task that can modify existing Basecamp tasks from Slack.
  • Add project templatesBuild shortcuts like /task-bug or /task-feature that automatically set task templates and categories in Basecamp.

Related guides

Was this guide helpful?
Slack + Basecamp overviewn8n profile →