Want HubSpot email performance data in Google Sheets? Understand why Workflows can't push email data, which API endpoints you actually need, and the connectors that surface open rates and click rates automatically.
If you have spent time trying to set up a HubSpot Workflow to push email open rates and click rates to Google Sheets and come up empty, you have hit a fundamental limitation in how HubSpot structures its data.
Marketing email data in HubSpot is not a CRM object. It does not live in the contact or deal or company record in a way that Workflows can access and push to Sheets. Email performance metrics (open rate, click rate, bounce rate per campaign) sit in a separate reporting layer with a different API surface. Getting this data into Sheets requires a different set of tools than the ones you use for contact or deal syncing.
This guide explains the distinction clearly, describes every workable path, and shows you the two-export VLOOKUP workaround you can do today without any tools.
Why Marketing Emails Are Not Standard CRM Objects
HubSpot's data model has a clean separation between CRM objects (contacts, companies, deals, tickets, custom objects) and marketing assets (emails, landing pages, forms, workflows). CRM objects are structured records with properties that can be read, filtered, and acted on by Workflows. Marketing assets are content and configuration items that produce activity data (engagement events) rather than structured property records.
When you send a marketing email, HubSpot generates engagement events: an open event, a click event, a delivery event, a bounce event. These events are associated with the contact who triggered them, but they are not stored as contact properties in the same way that "First Name" or "Deal Stage" are. They are event-stream data: time-stamped records of something that happened, queryable through the Email Events API but not surfaceable through standard Workflow tokens.
This architecture is intentional. Email engagement volume is massive. A single send to a 50,000-contact list produces up to 50,000 delivery events, potentially 10,000 open events, thousands of click events. Storing all of that as contact property data would bloat every contact record enormously. Instead, HubSpot maintains a separate event log and exposes it through dedicated API endpoints.
The practical consequence: you cannot build a HubSpot Workflow that says "when an email is sent, write the open rate to column D of my sheet." That data does not exist as a triggerable property.
The Two Types of Email Data in HubSpot
Understanding the distinction between these two data types determines which method you need.
Type 1: Per-email aggregate metrics
These are the headline performance numbers for a single campaign send: total sent, delivered, opened, clicked, bounced, unsubscribed, and the derived rates (open rate = opened / delivered, etc.).
This data lives in the Marketing Emails section of HubSpot and is accessible via the Marketing Email Stats API. It answers the question: "How did this email campaign perform overall?"
Type 2: Per-contact email engagement events
These are individual events tied to a specific contact: "Contact X opened Email Y at time Z," "Contact X clicked link W in Email Y at time T."
This data is accessible via the Email Events API and is what powers HubSpot's smart lists (contacts who opened a specific email, contacts who clicked a link in the last 30 days, etc.). It answers the question: "What did a specific person do with this email?"
Most people wanting "email performance in Sheets" are asking for Type 1 data. Some teams (typically those doing deliverability analysis or contact-level re-engagement tracking) need Type 2. The methods for each are different.
What You Can and Cannot Do With Workflows
What you can do:
HubSpot stores a small number of email engagement properties at the contact level that Workflows can access. These include:
| Property Label | Internal Name | What It Stores |
|---|---|---|
| Last Marketing Email Open Date | hs_email_last_open_date | Timestamp of most recent email open |
| Last Marketing Email Click Date | hs_email_last_click_date | Timestamp of most recent email click |
| Last Marketing Email Send Date | hs_email_last_send_date | Timestamp of most recent email sent |
| Marketing Email Confirmations Sent | hs_email_sends_since_last_engagement | Count of sends since last engagement |
| Email opt-out / unsubscribed status | Various | Subscription status per type |
If you only need to know when a contact last engaged with email, these properties are accessible via Workflow and can be pushed to Sheets using the standard method.
What you cannot do:
You cannot use a Workflow to push any of the following to Sheets:
- The open rate or click rate for a specific email campaign
- The number of times a specific contact opened a specific email
- Which links a contact clicked in a specific email
- Aggregate delivery, bounce, or unsubscribe counts for a campaign
- Email performance data broken out by send variant (A/B test results)
All of this requires either a manual export or API access.
The Two-Export VLOOKUP Workaround
This is the fastest method that requires no API access and no third-party tools. It takes about 10 minutes and works for any HubSpot account tier.
What you get: A sheet that combines per-contact engagement data with per-email campaign metrics, joinable by email ID.
Step 1: Export per-email aggregate data
In HubSpot, go to Marketing > Email. Select the emails you want to analyze. Use the export button to download performance data as a CSV. This gives you one row per email with columns for campaign name, send date, sent count, delivered, opened, clicked, and derived rates.
Step 2: Export per-contact email event data
In HubSpot, go to Contacts > Lists (or use a saved view). Filter by the email engagement property you want (e.g., "Last Marketing Email Open Date is known"). Export the contact list with the email engagement properties included.
Alternatively, go to a specific email's performance page, click on the "Opened" count, and export the contact list of openers. Do the same for clickers. This gives you per-email per-contact event data.
Step 3: Import both exports to Google Sheets
Paste each export into a separate tab. Name them clearly (e.g., "Email Stats" and "Contact Events").
Step 4: Join with VLOOKUP
If your contact export includes the email ID or email name, you can use VLOOKUP to pull campaign-level metrics into contact rows:
=VLOOKUP(B2, 'Email Stats'!$A:$Z, 5, FALSE)
Where column B contains the email name or ID in your contact sheet, and column 5 in the Email Stats tab contains the metric you want (e.g., overall open rate for that campaign).
Limitation: This is a manual, point-in-time snapshot. To get fresh data, you re-export and paste. For weekly or monthly reporting cadences, this is acceptable. For live dashboards, you need an API-based approach.
Method: HubSpot Email Events API
Requirements: HubSpot API key or private app token; Google Apps Script or server-side script
The Email Events API returns individual engagement events per contact per email. This is Type 2 data: contact-level events.
Key endpoint:
GET https://api.hubapi.com/email/public/v1/events
Parameters include:
campaignId: Filter to events for a specific email campaigneventType: Filter to OPEN, CLICK, DELIVERED, BOUNCE, etc.startTimestamp/endTimestamp: Date range filtersoffset/limit: Pagination
What a response looks like:
Each event includes the contact's email address, the event type, the timestamp, the campaign ID, and for click events, the URL that was clicked.
In Apps Script:
function fetchEmailEvents(campaignId) {
const token = PropertiesService.getScriptProperties().getProperty('HUBSPOT_TOKEN');
const url = `https://api.hubapi.com/email/public/v1/events?campaignId=${campaignId}&limit=1000`;
const response = UrlFetchApp.fetch(url, {
headers: { Authorization: `Bearer ${token}` }
});
const data = JSON.parse(response.getContentText());
return data.events;
}Paginate using the offset value returned in the response until hasMore is false.
Rate limit note: The Email Events API has its own rate limits separate from the CRM API. HubSpot recommends no more than 4 concurrent requests per 10 seconds for email event endpoints.
Method: HubSpot Marketing Email Stats API
Requirements: HubSpot API key or private app token; Marketing Hub account
The Marketing Email Stats API returns aggregate performance data per email campaign. This is Type 1 data. The open rate, click rate, and delivery numbers for each send.
Key endpoint:
GET https://api.hubapi.com/marketing/v3/emails/{emailId}/statistics/histogramOr for a summary:
GET https://api.hubapi.com/marketing/v3/emails/{emailId}/statistics/summaryTo list all marketing emails and their IDs:
GET https://api.hubapi.com/marketing/v3/emails
This returns a paged list of all marketing emails with their IDs, names, send dates, and status.
In Apps Script, a basic sync:
- Fetch the list of all emails
- For each email, fetch the statistics summary
- Write one row per email to the sheet with: email name, send date, sent, delivered, opened, clicked, open rate (calculated), click rate (calculated)
Recalculate open rate from raw counts rather than relying on HubSpot's derived rate, as HubSpot's methodology for rate calculation has changed over time (some versions include or exclude automated opens from Apple Mail Privacy Protection).
Method: Third-Party Connectors
For teams without developer capacity, these connectors expose HubSpot email metrics in Google Sheets without custom scripting.
Coefficient
Coefficient is a Sheets add-on that includes HubSpot Marketing Email performance as a data source. You can schedule automatic syncs of email campaign metrics including open rate, click rate, and bounce rate. Strong documentation and active maintenance.
Supermetrics
Supermetrics supports HubSpot marketing data including email campaign performance as a source. It is particularly useful if you are combining HubSpot email metrics with data from ad platforms in the same sheet. Pricing is higher than other options but the data breadth justifies it for full marketing stacks.
Dataslayer
Dataslayer supports HubSpot email performance data via scheduled reports. The interface is more analytics-focused, and it handles the Apple Mail Privacy Protection open-rate inflation issue by offering both gross and estimated true open rates.
Brooked.io
Brooked.io includes HubSpot email performance metrics as part of its sync suite, handling authentication, scheduling, and incremental updates automatically for both aggregate email stats and contact-level engagement data.
Connector Comparison Table
| Method | Aggregate Metrics (Type 1) | Contact Events (Type 2) | Setup Required | Cost |
|---|---|---|---|---|
| HubSpot Workflow | No | No (only last-open date) | No | Included with Ops Hub |
| Manual export + VLOOKUP | Yes (manual) | Yes (manual) | Minimal | Free |
| Email Events API (Apps Script) | No | Yes | Developer | Free |
| Marketing Email Stats API (Apps Script) | Yes | No | Developer | Free |
| Coefficient | Yes | Partial | Add-on install | Paid |
| Supermetrics | Yes | Partial | Setup | Paid |
| Dataslayer | Yes | Partial | Setup | Paid |
| Brooked.io | Yes | Yes | Setup | Paid |
Troubleshooting
My Workflow shows email-related properties but the data is always blank
The contact-level email properties (last open date, last click date) are only populated if the contact has received and engaged with marketing emails sent from that HubSpot portal. New contacts or contacts who have never been emailed will show blank values for these properties.
The API returns open events but my open rate in Sheets is higher than in HubSpot
Apple Mail Privacy Protection (MPP) causes automatic open-tracking pings for Apple Mail users regardless of whether they actually opened the email. HubSpot's dashboard attempts to filter MPP opens from reported open rates. If you are counting raw OPEN events from the API, you are counting MPP opens. Filter events where the browser field contains Apple indicators, or use HubSpot's derived rate from the Stats API rather than counting raw events.
Export data is missing some emails
HubSpot's marketing email export defaults to the last 90 days. Increase the date range filter before exporting, or use the API to retrieve all emails regardless of send date.
The Stats API returns zero for a draft or scheduled email
The statistics endpoints return data only for emails that have been sent. Draft, scheduled, and archived emails return empty or zero statistics. Filter your email list by currentState: SENT before fetching stats.
Click event data is present but URL columns are empty
The click URL is in the url field of each click event object. If you are parsing responses and the URL column is blank, check that your field mapping references event.url not a nested path. Some click events for tracked links use a HubSpot redirect URL. The url field contains the original destination after redirect resolution.
Bottom Line
Marketing email performance data in HubSpot cannot be pushed to Google Sheets via Workflows. This is a structural limitation, not a configuration problem. For quick one-time analysis, the two-export VLOOKUP workaround delivers what you need in under 10 minutes with no tools required. For ongoing reporting, either the Marketing Email Stats API (with Apps Script) or a dedicated connector like Coefficient, Supermetrics, Dataslayer, or Brooked.io gives you scheduled, up-to-date email metrics in Sheets. Choose based on whether you need a developer solution, a no-code tool, or integration with a broader marketing analytics stack.
Get HubSpot Email Metrics Into Sheets Without the Manual Work
The two-export approach works but does not scale to weekly reporting across multiple campaigns. Brooked.io syncs HubSpot marketing email performance metrics to Google Sheets automatically, handling the API complexity and incremental updates so your email performance data is always current.
Related articles:
- HubSpot to Google Sheets: Why Your Data All Goes to One Cell (and How to Fix It)
- Send HubSpot Form Submissions to Google Sheets Automatically (Step-by-Step)
- Multiple HubSpot Portals in One Google Sheet: Agency Consolidation Guide
Troubleshooting quick reference
Frequently asked questions
Why can't HubSpot Workflows access email open rate as a trigger or property?
Email open rate is a campaign-level aggregate metric, not a property of an individual contact record. Workflow triggers and actions operate at the object (contact/deal/company) level. An open rate is not a contact property. It is a calculation across all contacts who received a specific email. HubSpot would need to create a new object type (something like "Email Performance") with its own Workflow support to expose this data in Workflows.
Can I set up a live dashboard for email performance in Google Sheets?
Not natively. Any live dashboard requires either a scheduled API pull (via connector or custom script that refreshes every hour or on a fixed cadence) or a manual re-export. True real-time email performance is best viewed in HubSpot's own email dashboard. Sheets is better suited for historical analysis and trend tracking across multiple campaigns.
Does the Email Events API return data for all historical emails?
HubSpot retains email event data for 12 months for most account tiers. Older event data may not be available through the API even if it was tracked at the time. Aggregate statistics (from the Stats API) are retained longer.
Can I track which specific links were clicked in an email?
Yes, via the Email Events API. Each CLICK event includes the URL that was clicked. If you want to know the click distribution across links within a single email, group the click events by URL for that campaign ID.
How does Apple Mail Privacy Protection affect my data?
Apple MPP causes iCloud-hosted opens to be pre-fetched, registering as opens even if the recipient never actually viewed the email. HubSpot attempts to estimate and filter MPP opens from its reported metrics. When using the raw Email Events API, you will see these events as standard OPEN type events. For the most accurate open rate analysis, use HubSpot's derived open rate from the Stats API rather than counting raw events.
Is there a way to get email A/B test results into Sheets?
Yes, via the Marketing Email Stats API. HubSpot's A/B test emails have separate email IDs for each variant. Fetch statistics for each variant ID and write them as separate rows. The parent email record returned by the list endpoint includes references to the variant IDs.
Ready to connect your data to Google Sheets?
Brooked's free tier covers 100 imports per month with AI Analyst included, no credit card required.
Install Brooked free →

