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

How to Send Basecamp Updates to Slack with n8n

Automatically post Basecamp project updates, milestones, and task completions to designated Slack channels using n8n webhooks.

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

Best for

Teams that live in Slack but use Basecamp for project management and need real-time updates without constant app switching

Not ideal for

Teams already using Basecamp's built-in Slack integration or those needing two-way sync functionality

Sync type

real-time

Use case type

notification

Real-World Example

💡

A 12-person marketing agency uses this to notify their #projects channel whenever Basecamp milestones are completed or new to-dos are added. Before automation, project managers manually updated Slack 4-5 times daily, causing 2-hour delays in status updates and missed deadlines.

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.

Slack bot token with chat:write and channels:read permissions
Admin access to Basecamp projects you want to monitor
n8n instance with webhook capability (cloud or self-hosted with public URL)
Slack channels created where you want notifications posted

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Event Type
Task Title
Project Name
Slack Channel
3 optional fields▸ show
Assignee Name
Due Date
Basecamp URL

Step-by-Step Setup

1

Workflows > + New Workflow

Create new n8n workflow

Log into your n8n instance and create a new workflow. Name it 'Basecamp to Slack Updates' so you can find it later. This workflow will receive webhook data from Basecamp and format it for Slack.

  1. 1Click the + New Workflow button
  2. 2Click the pencil icon next to 'My workflow'
  3. 3Type 'Basecamp to Slack Updates'
  4. 4Press Enter to save the name
What you should see: You should see an empty workflow canvas with the new name in the top left corner.
2

Node Menu > Trigger > Webhook

Add Webhook trigger node

Add a Webhook node as your trigger. This creates a unique URL that Basecamp will send updates to. Copy the webhook URL from the node settings - you'll need this for Basecamp configuration.

  1. 1Click the + button on the canvas
  2. 2Search for 'Webhook' in the node list
  3. 3Click on Webhook under Trigger nodes
  4. 4Click 'Execute Node' to generate the webhook URL
  5. 5Copy the Production URL to your clipboard
What you should see: You should see a webhook URL like https://your-n8n.com/webhook/abc123 in the node panel.
Common mistake — Don't use the Test URL for production - it expires after workflow changes.
n8n
+
click +
search apps
Slack
SL
Slack
Add Webhook trigger node
Slack
SL
module added
3

Basecamp Project > Settings > Webhooks

Configure Basecamp webhook

In Basecamp, go to your project settings and add the webhook URL. Choose which events trigger notifications: to-do completions, milestone updates, and message posts work best for team updates.

  1. 1Open your Basecamp project
  2. 2Click the gear icon in the top right
  3. 3Select 'Set up webhooks'
  4. 4Paste your n8n webhook URL
  5. 5Check 'Todo completed', 'Milestone completed', and 'Message created'
  6. 6Click 'Add webhook'
What you should see: Basecamp shows a green checkmark next to your webhook URL with selected events listed below.
Common mistake — Basecamp webhooks are project-specific - you'll need separate webhooks for each project you want to monitor.
4

Node Menu > Logic > IF

Add conditional logic for event types

Add an IF node to handle different Basecamp event types. Each event (todo completion, milestone, message) needs different formatting for Slack. This prevents irrelevant notifications from cluttering your channels.

  1. 1Click the + button after the Webhook node
  2. 2Search for 'IF' and select it
  3. 3Set Condition to 'String'
  4. 4Set Value 1 to '{{ $json.kind }}'
  5. 5Set Operation to 'Equal'
  6. 6Set Value 2 to 'Todo'
What you should see: The IF node should show 'true' and 'false' output paths for routing different event types.
Common mistake — Basecamp sends different JSON structures for each event type - test with real webhook data before going live.
Slack
SL
trigger
filter
Type
matches criteria?
yes — passes through
no — skipped
Basecamp
BA
notified
5

Node Menu > Data Transformation > Function

Format todo completion messages

Add a Function node on the 'true' path to format todo completions. Extract the task name, assignee, and project from Basecamp's webhook data. Create a Slack-friendly message with proper formatting.

  1. 1Connect a Function node to the IF node's 'true' output
  2. 2Name it 'Format Todo Message'
  3. 3Add the code from the Pro Tip section
  4. 4Set the Language to JavaScript
  5. 5Click 'Execute Node' to test
What you should see: The Function node output should show formatted JSON with 'channel', 'text', and 'username' fields ready for Slack.
Common mistake — Map fields using the variable picker — don't type field names manually. Hand-typed variable names often have invisible spacing errors that produce blank output.
6

Node Menu > Communication > Slack

Add Slack node for todos

Connect a Slack node to send the formatted todo messages. Configure it to use the channel and text from your Function node output. Set up authentication with a Slack bot token that has chat:write permissions.

  1. 1Add a Slack node after the Function node
  2. 2Choose 'Send Message' as the operation
  3. 3Click 'Create New' for credentials
  4. 4Paste your Slack Bot Token
  5. 5Set Channel to '{{ $json.channel }}'
  6. 6Set Text to '{{ $json.text }}'
What you should see: The Slack node should show green 'Connected' status and display your bot username in the credentials section.
Common mistake — Your Slack bot needs to be added to each channel you want to post to - test in a private channel first.
7

Node Menu > Logic > IF

Handle milestone events

Add another IF node on the 'false' path to check for milestone events. Milestones need different formatting since they include due dates and completion percentages rather than just task names.

  1. 1Connect an IF node to the first IF node's 'false' output
  2. 2Set Condition to 'String'
  3. 3Set Value 1 to '{{ $json.kind }}'
  4. 4Set Operation to 'Equal'
  5. 5Set Value 2 to 'Schedule Entry'
What you should see: You should see a second branching point that will catch Basecamp milestone events specifically.
Common mistake — Basecamp calls milestones 'Schedule Entry' in webhook data - don't use 'Milestone' in your condition.
8

Node Menu > Data Transformation > Function

Format milestone messages

Add a Function node to format milestone notifications with project name, milestone title, and due date. Include relevant team members using @mentions if they're assigned to the milestone.

  1. 1Connect a Function node to the milestone IF node's 'true' output
  2. 2Name it 'Format Milestone Message'
  3. 3Set up milestone-specific formatting code
  4. 4Include due date and assignee extraction
  5. 5Test with sample milestone data
What you should see: The Function output should include milestone title, due date, and formatted Slack message with @mentions.
Common mistake — Map fields using the variable picker — don't type field names manually. Hand-typed variable names often have invisible spacing errors that produce blank output.
9

Node Menu > Communication > Slack

Add second Slack node for milestones

Connect another Slack node for milestone messages. Use the same bot credentials but consider posting to a different channel if your team separates task updates from milestone announcements.

  1. 1Add a Slack node after the milestone Function node
  2. 2Select your existing Slack credentials
  3. 3Choose 'Send Message' operation
  4. 4Set Channel to your milestones channel
  5. 5Set Text to the formatted milestone message
What you should see: The workflow should now have two parallel Slack posting paths for different event types.
10

Basecamp > Any Project > Todo List

Test with real Basecamp data

Complete a test todo in Basecamp and check that your Slack channel receives the notification. The message should include task name, who completed it, and which project it belongs to.

  1. 1Go to any Basecamp project with webhook enabled
  2. 2Mark a todo as complete
  3. 3Check your Slack channel for the notification
  4. 4Verify the message format and channel
  5. 5Check n8n execution log for any errors
What you should see: Your Slack channel should receive a formatted message within 30 seconds of completing the Basecamp todo.
Common mistake — If no message appears, check n8n's execution log - webhook delivery failures show up there immediately.
n8n
▶ Run once
executed
Slack
Basecamp
Basecamp
🔔 notification
received
11

Workflow > Save & Activate

Activate workflow for production

Save and activate your workflow in n8n. The webhook will now receive all configured Basecamp events and route them to appropriate Slack channels. Monitor the first few executions to catch any formatting issues.

  1. 1Click the 'Save' button in the top right
  2. 2Toggle the workflow to 'Active' status
  3. 3Check that the webhook URL is still valid
  4. 4Test with one more Basecamp action
  5. 5Monitor executions for the first hour
What you should see: The workflow status should show 'Active' with a green indicator, and webhook executions should appear in the executions list.
Common mistake — n8n webhook URLs change when you modify the Webhook node - update Basecamp if you make changes later.

This JavaScript code handles todo completion formatting and extracts nested data from Basecamp's webhook payload. Paste it in the 'Format Todo Message' Function node to properly format Slack messages.

JavaScript — Code Node// Extract todo completion data from Basecamp webhook
▸ Show code
// Extract todo completion data from Basecamp webhook
const webhookData = $input.first().json;
const todoTitle = webhookData.subject || 'Unknown task';

... expand to see full code

// Extract todo completion data from Basecamp webhook
const webhookData = $input.first().json;
const todoTitle = webhookData.subject || 'Unknown task';
const creatorName = webhookData.creator?.name || 'Someone';
const projectName = webhookData.bucket?.name || 'Unknown project';
const basecampUrl = webhookData.app_url || '';

// Determine Slack channel based on project name
let slackChannel = '#general';
if (projectName.toLowerCase().includes('marketing')) {
  slackChannel = '#marketing-updates';
} else if (projectName.toLowerCase().includes('dev')) {
  slackChannel = '#dev-updates';
} else if (projectName.toLowerCase().includes('client')) {
  slackChannel = '#client-projects';
}

// Format Slack message with emoji and formatting
const slackText = `✅ *${todoTitle}* completed by ${creatorName} in ${projectName}`;
const fullMessage = basecampUrl ? `${slackText}\n<${basecampUrl}|View in Basecamp>` : slackText;

// Return formatted data for Slack node
return {
  json: {
    channel: slackChannel,
    text: fullMessage,
    username: 'Basecamp Bot',
    icon_emoji: ':white_check_mark:'
  }
};

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 you need custom message formatting or complex routing logic between Basecamp projects and Slack channels. The Function nodes let you extract nested data from Basecamp webhooks and create rich Slack messages with links and emojis. n8n handles webhook authentication better than Zapier's simplified approach. Skip n8n if you just want basic notifications - Basecamp's native Slack integration covers simple project updates.

Cost

Webhook executions cost 1 execution per Basecamp event. A 10-person team completing 50 tasks and 5 milestones weekly burns through 220 executions monthly. That's free on n8n Cloud's starter plan. Zapier charges $20/month for the same volume since webhooks count as premium triggers.

Tradeoffs

Zapier offers pre-built Basecamp to Slack templates that work in 3 clicks, while n8n requires custom webhook setup. Make has cleaner conditional logic for handling different event types. Power Automate integrates better with Microsoft Teams if that's your chat platform. But n8n wins on webhook reliability - it doesn't timeout on slow Basecamp API responses like Zapier does.

You'll hit Basecamp's webhook retry logic if your n8n instance goes down - missed notifications don't replay automatically. Basecamp sends different JSON structures for todos versus milestones, so test each event type separately. Slack's API returns cryptic errors when your bot lacks channel permissions, and n8n doesn't surface the real issue clearly.

Ideas for what to build next

  • Add digest notificationsCreate a scheduled workflow that sends daily or weekly summaries of project progress instead of individual task updates.
  • Include file attachmentsExtend the workflow to notify when documents or images are uploaded to Basecamp projects, with direct links to files.
  • Filter by priorityAdd logic to only notify about high-priority tasks or milestones, reducing notification noise for routine updates.

Related guides

Was this guide helpful?
Slack + Basecamp overviewn8n profile →