This guide walks you through building a fully automated weekly email performance report using Make (formerly Integromat) and Loops, the modern email platform built for SaaS and growth teams. You will have a working automation live in under two hours, pulling real metrics from your email campaigns and delivering a formatted digest to your inbox every Monday morning.

What You'll Build

  • A Make scenario that runs on a weekly schedule without any manual triggers
  • An automated data pull from the Loops API that fetches campaign open rates, click rates, and unsubscribe counts
  • A formatted HTML email digest sent directly to one or more recipients each week
  • An error-handling branch that alerts you in Slack if the scenario fails mid-run

Prerequisites

  • A Make account (the free tier supports up to 1,000 operations per month)
  • A Loops account with at least one campaign sent (Loops is free up to 2,500 contacts as of August 2026)
  • A Slack workspace if you want the error alert step (optional but recommended)
  • Basic familiarity with Make's visual canvas, such as knowing what a module and a route are

Step 1: Generate Your Loops API Key

Every automated pull from Loops starts with authentication. Without a valid API key, Make cannot fetch your campaign data.

Log into your Loops dashboard and navigate to Settings > API. Click Generate API key and copy the key immediately. Loops only shows the full key once.

Paste the key into a password manager or your team's secrets vault before doing anything else. Do not paste it directly into Make as plain text yet. You will store it as a Make Data Store value in Step 3.

Common pitfall: If your Loops account is on a free plan, the API returns data for the last 30 days only. Plan accordingly when setting your report date range.

Step 2: Create a New Scenario in Make

Open Make and click Create a new scenario. Give it a clear name such as Weekly Loops Email Report. You want to find this quickly six months from now.

Add your first module by clicking the large plus icon. Search for Schedule and select Schedule > Scheduled trigger. Set the interval to 1 week and pick Monday at 07:00 in your local timezone. This fires the scenario every Monday before your team starts their day.

Why set the trigger time to 07:00 specifically?

Make runs scenarios on UTC by default. If your team is in Sydney (AEST, UTC+10 in winter), a 07:00 local trigger means you set the UTC time to 21:00 Sunday. Double-check your timezone offset when configuring the trigger, or the report arrives in the middle of the night.

Step 3: Store Your API Key Safely in Make

Go to Data Stores in the left sidebar and create a new store called Secrets. Add a single text field named loops_api_key. Save your Loops API key as a record in this store.

Back in your scenario, add a Data Store > Get a record module as the second module. Point it to the Secrets store and retrieve the loops_api_key field. Map this output into every subsequent HTTP module that needs authentication.

Pro tip: Storing secrets in a Data Store instead of hardcoding them into modules means you can rotate the key in one place. All modules that reference it update automatically.

Step 4: Fetch Campaign Data from the Loops API

Add an HTTP > Make a request module after the Data Store module. Configure it as follows.

URL:    https://app.loops.so/api/v1/campaigns
Method: GET
Headers:
  Authorization: Bearer {{3.loops_api_key}}
  Content-Type:  application/json

The {{3.loops_api_key}} reference maps the key from the Data Store module (module 3 in this example). Adjust the module number to match your canvas.

Run the scenario once manually using the Run once button at the bottom. Inspect the output bundle. You will see an array of campaign objects, each containing fields like id, name, sentAt, openRate, clickRate, and unsubscribes.

What if the API returns a 401 error?

A 401 means the API key is invalid or expired. Return to Loops, generate a fresh key, and update the record in your Make Data Store. Do not regenerate the key if other automations already use it without updating those too.

Step 5: Filter for the Last 7 Days

The Loops campaigns endpoint returns all campaigns, not just recent ones. Add an Array aggregator module, then a Filter condition between the HTTP module and the aggregator.

Set the filter condition to:

{{4.sentAt}} >= {{formatDate(addDays(now; -7); "YYYY-MM-DD")}}

This keeps only campaigns sent in the past seven days. Campaigns from prior weeks are discarded.

Common pitfall: Make's addDays function uses a semicolon as the separator, not a comma. Using a comma causes a parse error that is easy to miss in the formula editor.

Step 6: Build the HTML Email Body

Add a Tools > Set variable module. Name the variable email_body. In the value field, write an HTML string that loops over your filtered campaigns.

<h2>Weekly Email Performance Report</h2>
<p>Period: {{formatDate(addDays(now; -7); "DD MMM")}} – {{formatDate(now; "DD MMM YYYY")}}</p>
<table style="width:100%;border-collapse:collapse;">
  <thead>
    <tr>
      <th style="text-align:left;padding:8px;border-bottom:1px solid #ddd;">Campaign</th>
      <th style="text-align:right;padding:8px;border-bottom:1px solid #ddd;">Open Rate</th>
      <th style="text-align:right;padding:8px;border-bottom:1px solid #ddd;">Click Rate</th>
      <th style="text-align:right;padding:8px;border-bottom:1px solid #ddd;">Unsubs</th>
    </tr>
  </thead>
  <tbody>
    {{campaigns_table_rows}}
  </tbody>
</table>

Use a second Text aggregator module before this step to compile individual table row strings, one per campaign, and map the result to campaigns_table_rows.

Each row follows this structure:

<tr>
  <td style="padding:8px;">{{campaign.name}}</td>
  <td style="text-align:right;padding:8px;">{{round(campaign.openRate * 100; 1)}}%</td>
  <td style="text-align:right;padding:8px;">{{round(campaign.clickRate * 100; 1)}}%</td>
  <td style="text-align:right;padding:8px;">{{campaign.unsubscribes}}</td>
</tr>

Keeping the HTML simple and inline-styled ensures it renders correctly across Gmail, Outlook, and Apple Mail without any additional CSS processing.

Step 7: Send the Report via Email

Add an Email > Send an email module. If you connected a Gmail or Google Workspace account to Make, use the Gmail > Send an email module instead. Both work identically for this purpose.

Fill in the fields as follows:

  • To: your team distribution email or individual addresses separated by commas
  • Subject: Weekly Email Report – {{formatDate(now; "DD MMM YYYY")}}
  • Content type: HTML
  • Content: map the email_body variable from Step 6

Run the scenario once manually and check your inbox. The report should arrive within 30 seconds. If your team reviews email performance alongside other marketing metrics, this sits nicely next to the kind of structured reporting workflow that the team at Lenka Studio uses when managing campaign health across multiple clients.

Step 8: Add an Error Handler for Failed Runs

Right-click any module on the canvas and select Add error handler. Choose the Resume route type and add a Slack > Create a message module on the error branch.

Set the Slack message to:

:warning: The Weekly Loops Email Report failed.
Scenario: Weekly Loops Email Report
Error: {{error.message}}
Time: {{formatDate(now; "DD MMM YYYY HH:mm")}}

Posting to a #alerts or #marketing-ops channel means someone on your team sees the failure before the Monday standup, not three weeks later when someone notices the reports stopped arriving.

Step 9: Activate and Monitor the Scenario

Toggle the scenario from Off to On using the switch at the bottom left of the canvas. Make now runs it automatically every Monday at your configured time.

Go to History in the left sidebar after the first scheduled run. You can inspect every bundle processed, every module output, and any errors. Make retains run history for 30 days on the free plan and up to one year on paid plans.

Pro tip: If you manage multiple brands or product lines, duplicate this scenario and point each copy at a different Loops API key and a different recipient list. Each copy costs the same number of Make operations regardless of how many campaigns it processes.

Pairing this kind of automated reporting with a structured content planning process speeds up your weekly marketing review considerably. If you are also planning your social calendar, the free Lenka Studio social media toolkit includes a content calendar template that works alongside this reporting workflow.

Frequently Asked Questions

Does this work if I use another email platform instead of Loops?

Yes. Replace the Loops HTTP module with an equivalent API call to your platform. Mailchimp, Klaviyo, and Brevo all offer campaign stats endpoints with similar response shapes. The Make canvas structure stays the same; only the URL and field names change.

How many Make operations does this scenario use per run?

Each module execution counts as one operation. A typical run with ten campaigns filtered from thirty total uses roughly 50 to 70 operations. On Make's free plan of 1,000 operations per month, this scenario runs comfortably without hitting the limit.

What if no campaigns were sent in the last seven days?

The filter in Step 5 returns an empty array. The text aggregator produces an empty string, and the email sends with a blank table body. Add a Router module after the filter with one branch checking {{length(filteredCampaigns)}} > 0 to skip the send entirely when there is no data.

Can I send the report as a PDF attachment instead of HTML in the email body?

Make does not natively generate PDFs, but you can route the HTML through a service like Bannerbear or Gotenberg (a self-hosted HTML-to-PDF tool) before the email module. Add an HTTP module that posts the HTML body to your chosen service and receives a PDF file in return, then attach it to the email module.

Is the Loops API rate-limited?

As of August 2026, Loops imposes a rate limit of 10 requests per second on API keys. A weekly batch pull of campaign data sits well below that threshold. If you scale to pulling data hourly or across dozens of accounts simultaneously, add a Sleep module between requests to stay within limits.

Next Steps

Once your weekly report is running reliably, consider extending it. You could add a second HTTP module that pulls contact growth numbers from the Loops contacts endpoint and appends a subscriber trend row to the same table. You could also push the raw data into a Google Sheet each week so you build a historical dataset over time, then visualise trends in Looker Studio.

If you want to expand beyond email reporting into a fuller marketing analytics setup, measuring brand-level performance alongside campaign metrics gives you a more complete picture. The Lenka Studio brand health score is a free assessment that helps you identify where your marketing is strong and where it needs attention.

If your team is spending time on reporting that could be automated, or if you want to build more complex workflows across your marketing stack, the team at Lenka Studio works with SMBs across Australia, Singapore, Canada, and the US to design and build exactly this kind of automation. Get in touch to talk through what you want to automate and we can help scope the right approach for your business.