Back to Blog
n8nautomationreportingworkflowtutorial

How to Automate Client Reporting with n8n: Build a Weekly Report in 30 Minutes

n8nautomation TeamApril 6, 2026
TL;DR: Use n8n's Schedule Trigger, Google Sheets node, and Gmail node to build a weekly client report that runs automatically every Friday. No code required for the basic version — about 30 minutes to set up from scratch.

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:

  1. Reads the week's data from a Google Sheet (or multiple sheets)
  2. Calculates key metrics and week-over-week changes
  3. Formats an HTML email with the results
  4. 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.

Ready to automate with n8n?

Get affordable managed n8n hosting with 24/7 support.