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

How to Build Daily Standup Reports from Basecamp to Slack with n8n

Generate automated daily project status reports from Basecamp tasks and post formatted summaries to Slack channels.

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

Best for

Remote teams running daily standups who want automated project status without manual Basecamp checking

Not ideal for

Teams needing real-time task updates or complex cross-project reporting across multiple tools

Sync type

scheduled

Use case type

reporting

Real-World Example

šŸ’”

A 12-person marketing agency runs this at 9 AM daily to post client project status to #standup. Before automation, the project manager spent 15 minutes each morning manually checking Basecamp and typing status updates. Now the team sees completed tasks, today's deadlines, and overdue items automatically formatted in Slack.

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 admin access to create personal access tokens
Slack workspace admin rights to create and configure bot applications
n8n instance running version 0.190.0 or later with Basecamp 3 nodes available
Bot token with chat:write and channels:read scopes for target Slack channels
Active Basecamp projects with to-do items containing due dates and assignees

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Task Title
Project Name
Task Status
Project Status
4 optional fieldsā–ø show
Due Date
Completed At
Assignee Name
Task Notes

Step-by-Step Setup

1

Workflows > + Create Workflow

Create new workflow in n8n

Log into your n8n instance and create a new workflow. Click the + icon in the top left to start fresh. Name it 'Basecamp Daily Standup' so you can find it later. The canvas opens with a trigger node already placed.

  1. 1Click the + icon in the top navigation bar
  2. 2Select 'Blank Workflow' from the template options
  3. 3Click the workflow name at the top and rename to 'Basecamp Daily Standup'
  4. 4Save the workflow with Ctrl+S or the Save button
āœ“ What you should see: You should see an empty canvas with one gray 'Start' node and the workflow name updated in the header.
2

Canvas > Start Node > Replace with Schedule Trigger

Configure schedule trigger

Click on the Start node and replace it with a Schedule trigger. Set it to run Monday through Friday at 9:00 AM in your team's timezone. This fires the workflow automatically each weekday morning to generate fresh reports.

  1. 1Click the Start node to select it
  2. 2Press Delete to remove it
  3. 3Click the + button and search for 'Schedule Trigger'
  4. 4Set Trigger Interval to 'Days'
  5. 5Set Hour to 9 and Minutes to 0
  6. 6Under 'Weekdays Only', toggle to enabled
āœ“ What you should see: The Schedule Trigger node shows 'Days' interval with 9:00 AM time and weekdays only enabled.
⚠
Common mistake — The schedule runs in UTC by default. Check your n8n server timezone settings or adjust the hour accordingly.
n8n
+
click +
search apps
Slack
SL
Slack
Configure schedule trigger
Slack
SL
module added
3

Canvas > + > Basecamp 3

Add Basecamp credentials

Add a new Basecamp node and configure your API credentials. You'll need your Basecamp account ID and a personal access token from your Basecamp account settings. n8n stores these securely for reuse across workflows.

  1. 1Click the + after the Schedule Trigger
  2. 2Search for 'Basecamp 3' and select it
  3. 3Click 'Create New Credential' next to the Credential field
  4. 4Enter your Basecamp Account ID (found in your Basecamp URL)
  5. 5Paste your Personal Access Token from Basecamp Settings
  6. 6Click 'Save' to store the credential
āœ“ What you should see: The Basecamp node shows 'Connected' status and your account ID appears in the credential dropdown.
⚠
Common mistake — Personal access tokens expire after 1 year. Set a calendar reminder to refresh before expiration.
4

Basecamp Node > Operation Settings

Fetch projects from Basecamp

Configure the Basecamp node to retrieve all active projects. Set the Operation to 'Get All' and Resource to 'Project'. This pulls the complete project list so you can filter for specific ones in the next step.

  1. 1Set Resource dropdown to 'Project'
  2. 2Set Operation dropdown to 'Get All'
  3. 3Leave all other fields at default values
  4. 4Click 'Execute Node' to test the connection
āœ“ What you should see: You should see JSON output with your Basecamp projects including names, IDs, and status information.
5

Canvas > + > Function

Filter for active projects

Add a Function node to filter out archived projects and focus on active ones. This reduces API calls and keeps reports relevant. The code checks each project's status field and only passes through active projects to the next step.

  1. 1Add a Function node after the Basecamp node
  2. 2Name it 'Filter Active Projects'
  3. 3Paste the filtering code in the JavaScript Code field
  4. 4Click 'Execute Node' to test the filtering
āœ“ What you should see: The output should show only active projects, with archived ones removed from the data set.
⚠
Common mistake — If you have no active projects, the node returns an empty array and stops the workflow execution.
Slack
SL
trigger
filter
Condition
≠ "Closed"
yes — passes through
no — skipped
Basecamp
BA
notified
6

Canvas > + > Basecamp 3

Get tasks for each project

Add another Basecamp node to fetch to-dos for each active project. Set it to loop through projects using the 'Execute Once for Each Item' setting. This creates separate API calls per project to gather all task data.

  1. 1Add a new Basecamp 3 node
  2. 2Use the existing credential from the dropdown
  3. 3Set Resource to 'To-do'
  4. 4Set Operation to 'Get All'
  5. 5Set Project ID to use expression: {{$json.id}}
  6. 6Enable 'Execute Once for Each Item' in node settings
āœ“ What you should see: Multiple output items appear, one for each project, containing arrays of to-do items with due dates and completion status.
⚠
Common mistake — Large projects with 500+ tasks may hit Basecamp's API rate limits. The workflow will slow down but continue processing.
7

Canvas > + > Function

Process task data

Add a Function node to categorize tasks into completed yesterday, due today, and overdue buckets. This node also formats the data for clean Slack presentation and counts items in each category for the summary.

  1. 1Add a Function node after the to-do fetching
  2. 2Name it 'Categorize Tasks'
  3. 3Paste the task processing JavaScript code
  4. 4Set the node to process all items together (not per item)
  5. 5Test with 'Execute Node' button
āœ“ What you should see: Output shows three arrays: completedYesterday, dueToday, and overdue, each with task objects containing title, project, and assignee.
8

Canvas > + > Function

Format Slack message

Create another Function node that builds the formatted Slack message with task summaries. It creates sections for each category, uses Slack markdown formatting, and handles empty categories gracefully with appropriate fallback text.

  1. 1Add a Function node named 'Format Slack Message'
  2. 2Input the message formatting JavaScript code
  3. 3Use Slack markdown syntax for bold headers and bullet points
  4. 4Include task counts in the header line
  5. 5Test the formatting with sample data
āœ“ What you should see: A single output item containing a formatted Slack message with headers, bullet points, and task counts ready for posting.
⚠
Common mistake — Slack messages over 4000 characters get truncated. The code includes length checks and trimming for long task lists.
9

Canvas > + > Slack

Connect Slack credentials

Add a Slack node and configure it with a bot token that has chat:write permissions to your target channel. Create the bot in your Slack workspace and invite it to the standup channel before testing the workflow.

  1. 1Add a Slack node to the canvas
  2. 2Create new credential with your bot token
  3. 3Set Resource to 'Message'
  4. 4Set Operation to 'Post'
  5. 5Select or enter your target channel name
  6. 6Set Text field to use the formatted message expression
āœ“ What you should see: The Slack node shows connected status and your channel appears in the dropdown or validates when entered manually.
⚠
Common mistake — The bot must be invited to private channels manually. Public channels allow posting immediately after bot creation.
10

Workflow Controls > Execute Workflow

Test complete workflow

Run the entire workflow from start to finish using the 'Execute Workflow' button. Check each node's output to verify data flows correctly and the final Slack message appears in your channel with proper formatting and current task data.

  1. 1Click 'Execute Workflow' button in the top toolbar
  2. 2Watch each node execute in sequence
  3. 3Check your Slack channel for the posted message
  4. 4Verify task counts and formatting look correct
  5. 5Save the workflow after successful test
āœ“ What you should see: A formatted standup report appears in your Slack channel with yesterday's completed tasks, today's due items, and any overdue tasks organized by project.
n8n
ā–¶ Run once
executed
āœ“
Slack
āœ“
Basecamp
Basecamp
šŸ”” notification
received
11

Workflow Header > Active Toggle

Activate automation

Enable the workflow to run automatically by toggling the Active switch. The schedule trigger will now fire every weekday morning at 9 AM. Monitor the execution history for the first week to ensure consistent operation and adjust timing if needed.

  1. 1Click the inactive toggle switch in the workflow header
  2. 2Confirm activation in the dialog that appears
  3. 3Check the 'Executions' tab to monitor automatic runs
  4. 4Set up error notifications if desired
  5. 5Document the workflow for your team
āœ“ What you should see: The toggle shows 'Active' status and the workflow appears in your active workflows list with next scheduled execution time.
⚠
Common mistake — Inactive workflows don't run on schedule. Double-check the toggle is green and shows 'Active' after setup.

Add this JavaScript to the 'Categorize Tasks' Function node to handle timezone-aware date comparisons and group tasks by project priority. Paste it in the 'JavaScript Code' field replacing the default function.

JavaScript — Code Nodeconst today = new Date().toISOString().split('T')[0];
ā–ø Show code
const today = new Date().toISOString().split('T')[0];
const yesterday = new Date(Date.now() - 86400000).toISOString().split('T')[0];
const completedYesterday = [];

... expand to see full code

const today = new Date().toISOString().split('T')[0];
const yesterday = new Date(Date.now() - 86400000).toISOString().split('T')[0];

const completedYesterday = [];
const dueToday = [];
const overdue = [];

// Process all items from all projects
for (const projectData of $input.all()) {
  const projectName = projectData.json.name;
  const todos = projectData.json.todos || [];
  
  for (const task of todos) {
    const taskObj = {
      title: task.content || task.title || 'Untitled Task',
      project: projectName,
      assignee: task.assignee?.name || 'Unassigned',
      url: task.app_url
    };
    
    // Check completion status with timezone handling
    if (task.completed) {
      const completedDate = task.completed_at?.split('T')[0];
      if (completedDate === yesterday) {
        completedYesterday.push(taskObj);
      }
    } else if (task.due_on) {
      // Handle overdue and due today
      if (task.due_on === today) {
        dueToday.push(taskObj);
      } else if (task.due_on < today) {
        taskObj.dueDate = task.due_on;
        overdue.push(taskObj);
      }
    }
  }
}

// Sort overdue by date (oldest first)
overdue.sort((a, b) => a.dueDate?.localeCompare(b.dueDate));

return [{
  json: {
    completedYesterday,
    dueToday, 
    overdue,
    reportDate: today
  }
}];

Scaling Beyond 10+ active projects or 500+ tasks per day+ Records

If your volume exceeds 10+ active projects or 500+ tasks per day records, apply these adjustments.

1

Batch API calls by project priority

Fetch high-priority projects first and add delays between calls to avoid rate limits. Use Basecamp's pagination for projects with 100+ tasks.

2

Cache project data between runs

Store project metadata in n8n's built-in storage to reduce API calls. Only fetch task updates rather than complete project data each morning.

3

Split reports by team or department

Create separate workflows for different project groups to parallel process and reduce individual execution time from minutes to seconds.

4

Implement smart truncation

Limit each report section to top 20 items and add summary counts. Link to Basecamp filtered views for complete task lists in busy periods.

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 want full control over the report formatting and data processing logic. The Function nodes let you build complex task categorization that Zapier can't match, and you can customize the Slack message format exactly how your team wants it. Pick Make instead if you need visual debugging - dragging data through Make's modules is clearer when the workflow breaks.

Cost

n8n costs roughly $0.02 per execution at 22 node operations per run. At daily reports (22 executions/month), that's $0.44/month on n8n Cloud's starter plan. Make charges per operation at 22 ops/day = 660/month, hitting the $10.59 tier. Zapier's 2-step version costs more at 60 tasks/month on the $29.99 plan since each project requires separate API calls.

Tradeoffs

Make handles Basecamp's date formatting better with built-in parseDate functions, while n8n requires manual JavaScript date parsing. Zapier offers cleaner Slack formatting templates that don't need custom code. Power Automate connects better if you're already using Microsoft project tools. But n8n wins on the task categorization logic - the Function nodes process complex due date comparisons and overdue calculations that other platforms struggle with in their no-code builders.

You'll hit issues with Basecamp's API rate limiting after about 15 active projects since each needs separate to-do list calls. The personal access tokens expire annually with no renewal warning, breaking the workflow silently. Slack's 4000 character message limit cuts off reports during busy periods unless you add truncation logic to the formatting code.

Ideas for what to build next

  • →
    Add weekend digest version — Create a Friday afternoon workflow that summarizes the full week's completed tasks and upcoming Monday priorities.
  • →
    Include project health metrics — Extend the report to show project completion percentages and tasks added/completed ratios for better project tracking.
  • →
    Add Slack thread replies — Configure the workflow to post follow-up messages in threads when projects have blocking issues or high overdue counts.

Related guides

Was this guide helpful?
← Slack + Basecamp overviewn8n profile →