How to Automate Client Reporting with n8n: Build a Weekly Report in 30 Minutes
Client reporting is one of the highest-ROI automations you can build. It is repetitive, time-sensitive, and follows the same structure every week. Once the workflow is running, you get hours back every Friday and your clients get consistent, on-time reports without you lifting a finger.
Workflow Overview
The workflow we are building does this every Friday at 5pm:
- Reads the week's data from a Google Sheet (or multiple sheets)
- Calculates key metrics and week-over-week changes
- Formats an HTML email with the results
- Sends the email to the client
The data source is Google Sheets in this example — but the same pattern works with any data source n8n can read: HubSpot, Airtable, PostgreSQL, a REST API, or any combination.
Step 1: Schedule Trigger
Add a Schedule Trigger node. Configure it:
- Trigger interval: Weeks
- Day of week: Friday
- Hour: 17 (5pm)
- Timezone: Set to your client's timezone
This triggers the workflow once a week at Friday 5pm. Activate the workflow to enable the schedule.
Tip: During setup, use the Manual Trigger to test the workflow without waiting until Friday. Once you are happy with the output, switch to the Schedule Trigger and activate.
Step 2: Pull Data from Google Sheets
Add a Google Sheets node. Configure it:
- Operation: Get Many Rows
- Spreadsheet: Select your reporting sheet
- Sheet: Select the weekly data tab
- Filters: Leave empty to get all rows, or filter by date column to get this week only
Connect your Google account via OAuth2 credentials (Credentials → New → Google Sheets OAuth2). The node returns each row as a separate item in n8n's data pipeline.
If you have data in multiple sheets — for example, traffic from one sheet and leads from another — add a second Google Sheets node in parallel and use a Merge node to combine them before the next step.
Step 3: Calculate Metrics with a Code Node
Add a Code node to aggregate and calculate your metrics. This is the part that requires a small amount of JavaScript. Here is a template:
const rows = $input.all().map(item => item.json);
const totalLeads = rows.reduce((sum, r) => sum + Number(r.leads || 0), 0);
const totalRevenue = rows.reduce((sum, r) => sum + Number(r.revenue || 0), 0);
const totalSessions = rows.reduce((sum, r) => sum + Number(r.sessions || 0), 0);
return [{ json: { totalLeads, totalRevenue, totalSessions } }];
Adjust the field names (leads, revenue, sessions) to match the column headers in your Google Sheet. The Code node outputs a single item with your calculated metrics, which the next node uses to build the email.
Step 4: Format the Email
Add a Set node to build the HTML email body. Create a field called emailBody and set it to an expression like:
<h2>Weekly Report — {{ $now.toFormat('dd MMM yyyy') }}</h2>
<p>Here is your summary for the week:</p>
<ul>
<li><strong>Sessions:</strong> {{ $json.totalSessions }}</li>
<li><strong>Leads:</strong> {{ $json.totalLeads }}</li>
<li><strong>Revenue:</strong> ${{ $json.totalRevenue }}</li>
</ul>
<p>Full data in your <a href="YOUR_SHEET_URL">Google Sheet</a>.</p>
Keep the email simple. Clients read reports on mobile. A clean list of numbers with clear labels works better than a complex layout.
Step 5: Send via Gmail
Add a Gmail node. Configure it:
- Operation: Send
- To: Client email address (or a comma-separated list for multiple recipients)
- Subject:
Weekly Report — {{ $now.toFormat('dd MMM yyyy') }} - Email Type: HTML
- Message:
{{ $json.emailBody }}
Connect your Gmail account via OAuth2. Activate the workflow. Done — reports go out every Friday automatically.
Advanced: Multiple Clients, Multiple Sources
To scale this to multiple clients, store client configurations (name, email, sheet ID, metrics to include) in an Airtable base or Google Sheet. Replace the hardcoded email and sheet ID with expressions that read from the config. Use a Loop Over Items node to process each client in sequence.
For richer data, swap the Google Sheets node for direct API calls: Google Analytics 4 for traffic data, HubSpot for CRM metrics, or Stripe for revenue. The workflow structure stays the same — only the data source changes.
This pattern — schedule → fetch → calculate → format → send — applies to any recurring report: monthly invoices, daily standup summaries, weekly sales digests. Build it once and it runs forever.