I’m working with Zapier to create automated email reports from Airtable data. My setup involves a digest workflow that collects records and a scheduled trigger that sends the compiled information through Gmail.
The challenge I’m facing is getting the data to display as a properly formatted HTML table in the email. Here are the approaches I’ve tested:
Method 1: Added complete HTML table structure (including headers) directly in the digest step. The issue was that table headers appeared for every single record instead of just once at the top.
Method 2: Split the HTML between digest and scheduler - digest handles data rows while scheduler adds headers and styling. The problem here was misaligned columns despite setting fixed widths.
Method 3: Only format individual rows in the digest, then wrap everything with table tags in the scheduler. This resulted in all data appearing in one continuous row instead of separate rows.
Here’s my current row formatting in the digest:
<tr>
<td width="120">{{record_title}}</td>
<td width="120">{{category_type}}</td>
<td width="120">{{current_status}}</td>
<td width="120">Pending</td>
<td width="120">{{item_url}}</td>
<td width="120">{{deal_url}}</td>
</tr>
And the email template in scheduler:
<!DOCTYPE html>
<html>
<head>
<style>
table {
font-family: helvetica, sans-serif;
border-collapse: collapse;
width: 100%;
}
th, td {
border: 1px solid #ccc;
text-align: left;
padding: 10px;
}
th {
background-color: #f2f2f2;
}
</style>
</head>
<body>
<h2>Weekly Status Report</h2>
<table>
<tr>
<th>Title</th>
<th>Type</th>
<th>Status</th>
<th>Due Date</th>
<th>Link</th>
<th>Reference</th>
</tr>
[DIGEST_CONTENT]
</table>
</body>
</html>
What’s the correct way to structure this so each record appears as its own table row?
You’re probably hitting a formatting issue with how Zapier handles digest content. I’ve dealt with this before when building automated reports - the digest step can mess up HTML structure when you’re pulling multiple records. Here’s what worked for me: switch your digest to “Line Item to Text” mode instead of trying to concatenate raw HTML. Set the digest output to plain text first, then use a separate formatter step to add your HTML row formatting before the scheduler kicks in. Also check if there are hidden characters or weird encoding in your Airtable fields that’s breaking your table structure. Some Airtable field types throw in unexpected formatting that kills HTML tables. I’d test with static text first to figure out which fields are causing trouble. And double-check that your scheduler is grabbing the digest output with the right Zapier variable syntax - sometimes it’s not the HTML that’s broken, just how the content gets dropped into your email template.
This happens because Zapier mangles HTML when it processes digest steps - tables get stripped or corrupted during aggregation. I hit the same wall building weekly reports.
Skip HTML in the digest completely. Use comma-separated values instead: {{record_title}},{{category_type}},{{current_status}},Pending,{{item_url}},{{deal_url}}.
Then add a Webhooks step between your digest and scheduler. Set it to POST the digest content to a cloud function or basic PHP script that converts CSV rows into HTML table rows. The webhook spits back clean HTML that your scheduler drops straight into the email.
This bypasses Zapier’s HTML issues entirely and gives you way better formatting control. Bonus: you can handle data validation in the webhook if you need it.
The problem is Zapier’s digest step breaks HTML formatting when it combines multiple records. Instead of formatting rows in the digest, use raw data with pipe separators: {{record_title}}|{{category_type}}|{{current_status}}|Pending|{{item_url}}|{{deal_url}}. Then add a Formatter action after your scheduler - set it to Text > Replace. Use this find pattern: (.+?)\|(.+?)\|(.+?)\|(.+?)\|(.+?)\|(.+?) and replace with: <tr><td width="120">$1</td><td width="120">$2</td><td width="120">$3</td><td width="120">$4</td><td width="120">$5</td><td width="120">$6</td></tr>. This keeps your digest clean and builds proper HTML structure without Zapier mangling it. Way more reliable than trying to force HTML through the digest.
I’ve hit this exact problem tons of times with digest reports. Zapier treats each record as a separate chunk instead of proper HTML rows - that’s your issue.
Here’s what actually works: Keep your digest formatting super minimal. Just use plain text with ||| as a delimiter:
{{record_title}}|||{{category_type}}|||{{current_status}}|||Pending|||{{item_url}}|||{{deal_url}}
Then add a Code by Zapier step before your email. Use JavaScript to split the content and build proper table rows:
let digestData = inputData.digest_content.split('\n');
let tableRows = '';
digestData.forEach(row => {
if (row.trim()) {
let fields = row.split('|||');
tableRows += `<tr><td width="120">${fields[0]}</td><td width="120">${fields[1]}</td><td width="120">${fields[2]}</td><td width="120">${fields[3]}</td><td width="120">${fields[4]}</td><td width="120">${fields[5]}</td></tr>`;
}
});
output = [{table_rows: tableRows}];
This gives you clean HTML that renders as separate rows. I’ve used this for dozens of reports - works every time.
Not comfortable with code? This walkthrough covers the whole digest-to-email process:
check your digest settings - zapier sometimes adds extra line breaks that mess up table rows. try using “append as plain text” instead of HTML formatting in the digest step, then do all HTML wrapping in the scheduler. also make sure there’s no trailing spaces in your airtable fields because that breaks table alignment badly.