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

How to Build Daily Standup Reports with Pipedream

Generate automated daily project reports from Basecamp data and post them 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

Teams that need daily project visibility without manual Basecamp checking

Not ideal for

Teams wanting real-time updates instead of scheduled digests

Sync type

scheduled

Use case type

reporting

Real-World Example

πŸ’‘

A 12-person marketing agency uses this to post daily project summaries to #standup every morning at 9 AM. The report shows completed tasks, approaching deadlines, and overdue items from 8 active Basecamp projects. Before automation, the project manager spent 20 minutes each morning pulling this data manually.

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 Pipedream

Copy the pre-built Pipedream blueprint and paste it straight into Pipedream. 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 3 account with admin access to all projects you want to report on
Slack workspace with permission to post messages in your target channel
Pipedream account (free tier supports this workflow volume)

Optional

Basic understanding of Slack markdown formatting for message structure

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Project Name
Task Title
Task Status
4 optional fieldsβ–Έ show
Due Date
Completed Date
Assignee Name
Task Notes

Step-by-Step Setup

1

Workflows > New > Workflow

Create New Workflow

Log into pipedream.com and click the blue 'New' button in the top-right corner. Select 'Workflow' from the dropdown menu. You'll land on the workflow builder with an empty trigger step. Name your workflow 'Daily Standup Reports' in the title field at the top.

  1. 1Click 'New' button in top-right
  2. 2Select 'Workflow' from dropdown
  3. 3Type 'Daily Standup Reports' in workflow name field
  4. 4Click outside the field to save the name
βœ“ What you should see: You should see a blank workflow canvas with 'Daily Standup Reports' as the title and one empty trigger step.
2

Trigger > Schedule > Cron scheduler

Add Schedule Trigger

Click on the trigger step and select 'Schedule' from the app list. Choose 'Cron scheduler' as your trigger type. Set the cron expression to '0 9 * * 1-5' to run every weekday at 9 AM. This gives your team consistent morning updates without weekend noise.

  1. 1Click the empty trigger step
  2. 2Search for 'Schedule' and select it
  3. 3Choose 'Cron scheduler' option
  4. 4Enter '0 9 * * 1-5' in the cron expression field
  5. 5Click 'Save' to confirm the schedule
βœ“ What you should see: The trigger step should show 'Schedule - Cron scheduler' with 'Next run: [tomorrow at 9:00 AM]' below it.
⚠
Common mistake β€” Cron expressions are in UTC by default. If your team is in EST, use '14' instead of '9' for the hour value.
Pipedream
+
click +
search apps
Slack
SL
Slack
Add Schedule Trigger
Slack
SL
module added
3

Add Step > Basecamp 3 > Get Projects

Connect Basecamp Account

Click the '+' button below your trigger to add a new step. Search for 'Basecamp 3' and select it from the app list. Choose 'Get Projects' as your action to start pulling project data. Click 'Connect Basecamp' and authorize Pipedream to access your account. You'll need admin permissions to see all projects.

  1. 1Click the '+' button below the trigger
  2. 2Search 'Basecamp 3' and select it
  3. 3Choose 'Get Projects' action
  4. 4Click 'Connect Basecamp' button
  5. 5Authorize Pipedream in the popup window
βœ“ What you should see: You should see 'Connected to Basecamp 3' with your account name and a list of your projects in the test output.
⚠
Common mistake β€” If you don't see all projects, check that your Basecamp user has access permissions to those specific projects.
Pipedream settings
Connection
Choose a connection…Add
click Add
Slack
Log in to authorize
Authorize Pipedream
popup window
βœ“
Connected
green checkmark
4

Add Step > Basecamp 3 > Get Todosets

Get Tasks for Each Project

Add another Basecamp step by clicking the '+' button. Select 'Get Todosets' to fetch task lists. You'll need to configure this step to loop through each project from step 3. In the Project ID field, reference the previous step using the expression picker. This pulls tasks from all active projects.

  1. 1Click '+' button to add new step
  2. 2Search 'Basecamp 3' again and select it
  3. 3Choose 'Get Todosets' action
  4. 4Click in Project ID field and select from step 3 data
  5. 5Test the step to see task lists returned
βœ“ What you should see: The test output shows task lists (todosets) for your first project, including list names and IDs.
5

Add Step > Code > Run Node.js code

Add Node.js Code Step

Click '+' and select 'Code' then 'Run Node.js code'. This step processes all your Basecamp data and formats it for Slack. You'll write code to loop through projects, categorize tasks by status, and identify overdue items. The code step gives you full control over data transformation that Basecamp's API actions can't handle alone.

  1. 1Click '+' to add another step
  2. 2Select 'Code' from the app list
  3. 3Choose 'Run Node.js code' option
  4. 4Delete the default code in the editor
  5. 5Paste your data processing code
βœ“ What you should see: You should see the Node.js code editor with a blank function ready for your processing logic.
⚠
Common mistake β€” Make sure to handle cases where projects have no tasks or todosets are empty to avoid runtime errors.

This Node.js code processes Basecamp data to create organized standup reports. Paste it into your code step and modify the date ranges or project filters as needed.

JavaScript β€” Code Stepexport default defineComponent({
β–Έ Show code
export default defineComponent({
  async run({ steps, $ }) {
    const projects = steps.basecamp_get_projects.$return_value;

... expand to see full code

export default defineComponent({
  async run({ steps, $ }) {
    const projects = steps.basecamp_get_projects.$return_value;
    const today = new Date();
    const yesterday = new Date(today.getTime() - 24 * 60 * 60 * 1000);
    const threeDaysOut = new Date(today.getTime() + 3 * 24 * 60 * 60 * 1000);
    
    let completed = [];
    let upcoming = [];
    let overdue = [];
    
    for (const project of projects) {
      try {
        const todosets = await $.send.http({
          method: 'GET',
          url: `https://3.basecampapi.com/${project.account.id}/buckets/${project.id}/todosets.json`,
          headers: {
            'Authorization': `Bearer ${auths.basecamp_3.oauth_access_token}`,
            'User-Agent': 'Pipedream Standup Bot'
          }
        });
        
        for (const todoset of todosets.data) {
          for (const todo of todoset.todos || []) {
            const dueDate = todo.due_on ? new Date(todo.due_on + 'T23:59:59Z') : null;
            const completedDate = todo.completed_at ? new Date(todo.completed_at) : null;
            
            if (completedDate && completedDate >= yesterday) {
              completed.push(`β€’ ${project.name}: ${todo.title} (${todo.assignees[0]?.name || 'Unassigned'})`);
            } else if (dueDate && dueDate < today && !todo.completed) {
              const daysOverdue = Math.floor((today - dueDate) / (1000 * 60 * 60 * 24));
              overdue.push(`β€’ ${project.name}: ${todo.title} (${todo.assignees[0]?.name || 'Unassigned'}) - ${daysOverdue} days overdue`);
            } else if (dueDate && dueDate <= threeDaysOut && dueDate >= today && !todo.completed) {
              const dueDateStr = dueDate.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });
              upcoming.push(`β€’ ${project.name}: ${todo.title} (${todo.assignees[0]?.name || 'Unassigned'}) - Due ${dueDateStr}`);
            }
          }
        }
      } catch (error) {
        console.log(`Error processing project ${project.name}:`, error.message);
      }
    }
    
    const reportDate = today.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });
    let report = `*Daily Standup Report - ${reportDate}*\n\n`;
    
    report += `*Completed Yesterday:*\n`;
    report += completed.length > 0 ? completed.slice(0, 10).join('\n') : 'β€’ No tasks completed';
    report += '\n\n';
    
    report += `*Due This Week:*\n`;
    report += upcoming.length > 0 ? upcoming.slice(0, 10).join('\n') : 'β€’ No upcoming deadlines';
    report += '\n\n';
    
    if (overdue.length > 0) {
      report += `*Overdue Items:*\n`;
      report += overdue.slice(0, 5).join('\n');
    }
    
    return { formatted_report: report, task_counts: { completed: completed.length, upcoming: upcoming.length, overdue: overdue.length } };
  }
});
6

Add Step > Slack > Send Message to Channel

Connect Slack Account

Add a Slack step by clicking '+' and searching for Slack. Choose 'Send Message to Channel' as your action. Click 'Connect Slack' and authorize the integration. You'll need to select which workspace to connect and grant permissions for posting messages. Pick the channel where you want daily reports delivered.

  1. 1Click '+' button for new step
  2. 2Search 'Slack' and select it
  3. 3Choose 'Send Message to Channel' action
  4. 4Click 'Connect Slack' and authorize
  5. 5Select your target channel from the dropdown
βœ“ What you should see: You should see 'Connected to Slack' with your workspace name and channel dropdown populated with available channels.
⚠
Common mistake β€” The Slack app needs permission to post in the target channel. If it's a private channel, invite the Pipedream bot first.
7

Slack Step > Message Configuration

Format Slack Message

In the message field, reference your Node.js step output to create a formatted report. Use Slack markdown for headers and bullet points. Include project names, completed tasks from yesterday, upcoming deadlines within 3 days, and any overdue items. Structure it like a standup: what's done, what's coming, what's blocked.

  1. 1Click in the 'Text' message field
  2. 2Use the expression picker to reference your code step
  3. 3Format with Slack markdown (* for bullets, ** for bold)
  4. 4Add header text like '*Daily Standup Report*'
  5. 5Include sections for completed, upcoming, and overdue
βœ“ What you should see: The message preview shows a properly formatted report with project data from your code step.
⚠
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.
8

Workflow > Test Button

Test Full Workflow

Click 'Test' in the top-right corner to run your complete workflow. Check each step's output to verify data flows correctly from Basecamp through your code processing to the final Slack message. The test runs immediately regardless of your cron schedule. Fix any errors before deploying.

  1. 1Click 'Test' button in top-right corner
  2. 2Watch each step execute in sequence
  3. 3Check the Slack message was posted correctly
  4. 4Review the message formatting in your target channel
  5. 5Make adjustments if needed and test again
βœ“ What you should see: All steps show green checkmarks and your formatted standup report appears in the designated Slack channel.
⚠
Common mistake β€” Testing posts real messages to Slack. Consider using a test channel first to avoid spamming your team.
Pipedream
β–Ά Deploy & test
executed
βœ“
Slack
βœ“
Basecamp
Basecamp
πŸ”” notification
received
9

Workflow > Deploy Button

Deploy Workflow

Once testing succeeds, click 'Deploy' to activate the scheduled workflow. The deploy button turns your workflow live so it runs automatically at 9 AM weekdays. You can monitor execution history and modify the schedule anytime. Deployed workflows show a green 'Active' status badge.

  1. 1Click 'Deploy' button next to Test
  2. 2Confirm deployment in the popup dialog
  3. 3Verify the status changes to 'Active'
  4. 4Check the next scheduled run time
  5. 5Bookmark the workflow for easy access
βœ“ What you should see: The workflow header shows 'Active' status with the next run scheduled for tomorrow at 9 AM (or next weekday).

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

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

1

Implement Project Batching

Process projects in groups of 10 to avoid the 30-second timeout limit. Use multiple workflow runs or async processing patterns.

2

Cache Project Data

Store project lists in Pipedream's built-in data store and only refresh weekly to reduce API calls during daily runs.

3

Filter by Recent Activity

Use Basecamp's updated_since parameter to only fetch projects with activity in the last 7 days, drastically reducing processing time.

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 Pipedream for this if you need custom data processing that basic Zapier or Make filters can't handle. The Node.js code step gives you full control over how tasks get categorized and formatted, plus built-in error handling for API failures. You can process complex date logic and task relationships that would require multiple steps in other platforms. Skip Pipedream if you want a simple notification setup β€” Zapier's Slack integration is faster to configure for basic alerts.

Cost

This workflow costs roughly $0 on Pipedream's free tier unless you're processing 20+ projects daily. Each run uses about 15 credits (1 for trigger, 2 for Basecamp calls, 10 for Node.js processing, 2 for Slack). At 22 workdays per month, that's 330 credits total β€” well under the 10,000 free monthly limit. Make would cost $9/month minimum since you need the Pro plan for scheduling, making Pipedream 9x cheaper for this use case.

Tradeoffs

Make handles the Basecamp API more elegantly with built-in pagination modules and better error handling for large project lists. Zapier offers more Slack formatting options including rich message blocks and interactive buttons. n8n provides superior debugging with visual data flow inspection between nodes. Power Automate integrates better if you're using Microsoft Project alongside Basecamp. But Pipedream wins for complex task categorization logic that would require 15+ steps in Make or convoluted Zapier formatters.

You'll hit Basecamp's API rate limits quickly if you have 30+ active projects β€” the workflow processes about 200 requests per run when fetching task details. Slack markdown formatting breaks easily; double-check line breaks and special characters that come from Basecamp task titles. The cron scheduler can drift during daylight saving time changes, posting reports an hour early or late until you manually update the UTC offset.

Ideas for what to build next

  • β†’
    Add Weekend Summary β€” Create a separate Monday morning workflow that summarizes the entire previous week's activity for better context after weekends.
  • β†’
    Project-Specific Reports β€” Duplicate this workflow to send targeted reports to different Slack channels based on project teams or departments.
  • β†’
    Slack Thread Responses β€” Enhance the workflow to post follow-up messages as thread replies when overdue tasks remain unresolved for multiple days.

Related guides

Was this guide helpful?
← Slack + Basecamp overviewPipedream profile β†’