Paid Advertising and PPC Management
Data Analysis and Reporting in Marketing

Pulling HubSpot Data into Google Sheets: A 2026 Guide for Marketing & RevOps

Adela
May 7, 2026
HubSpot to Google Sheets: 3 Methods Compared (2026)

If you run marketing or RevOps for a B2B company, HubSpot holds the data that drives most of your reporting decisions: which campaigns produce qualified leads, how the pipeline is moving through lifecycle stages, which deals are about to close, and what the email engagement looks like across audiences. The challenge is that HubSpot's native reporting works well for in-app dashboards but breaks down the moment you want to combine CRM data with paid media, send weekly summaries to stakeholders, or build a single source of truth across multiple data sources.


Google Sheets is the most common destination for this combination because it is free, scriptable, connects to Looker Studio (now Data Studio post-rebrand), BigQuery and Power BI, and lets the team build custom views without engineering. This guide walks through three methods to connect HubSpot to Google Sheets in 2026, when each one fits, and the limitations to plan around. We covered the same workflow for paid platforms in our LinkedIn Ads to Google Sheets guide and Meta Ads to Google Sheets guide; this one extends the series to CRM data.

What HubSpot data is available

Before picking a method, it helps to know what data lives in HubSpot and what you can pull. HubSpot exposes data across seven main object types, each with rich properties:

  • Contacts. Personal details, lifecycle stage (subscriber, lead, MQL, SQL, opportunity, customer, evangelist), source attribution, lead score, engagement history, and dates entered/exited each lifecycle stage.
  • Companies. Annual revenue, employee count, industry, lifecycle stage, total revenue from associated deals, web analytics aggregates.
  • Deals. Pipeline stage, deal amount, ARR, MRR, close date, days to close, likelihood to close, latest traffic source, deal owner.
  • Tickets. First agent response date, last response, ticket pipeline stage, priority, source.
  • Line items. Product catalog data, ARR, MRR, billing terms, unit cost, recurring revenue.
  • Email campaigns. Emails sent, delivered, opened, clicked, unsubscribed, with click events on identified links.
  • Lead objects. Lead-specific page views, web activity, source data.


Each object has a long history of dates: contact created, became a lead, became an MQL, became an SQL, became a customer, last sales activity, last engagement, and so on. For a typical B2B SaaS, this is enough granularity to model the entire funnel from anonymous website visitor to paying customer.


The HubSpot CRM API exposes the same data programmatically via REST endpoints. The HubSpot CRM API v3 contacts reference documents every endpoint, parameter, and response shape. The API uses property-based filtering, lets you fetch records in pages of up to 100 results, and supports incremental sync via lastModifiedDate filters.

Method 1: Manual CSV export from the HubSpot UI

Best for: quick one-off exports, audits, executive presentations, properties and segmented lists you only need once.


Setup time:
under five minutes.


Cost:
free.


In HubSpot, every object list (Contacts, Deals, Companies, Tickets) has an Export button at the top of the list view. Filter the records you want, click Actions → Export, choose the properties to include, and HubSpot emails you a CSV link when the export is ready. You can then drop the CSV into Google Sheets via File → Import.


This works for ad-hoc analysis but has three limitations that make it a poor fit for ongoing reporting. First, the export is point-in-time; if you want a fresh view next week you have to re-export. Second, large lists can take HubSpot a few minutes to compile and email. Third, you cannot easily join contact data with deal data with line item data in the same export; each object type exports separately, so cross-object analysis requires manual VLOOKUPs in Sheets afterward.


For weekly or monthly reporting that always needs the freshest snapshot, move to Method 2 or Method 3.

Method 2: Apps Script with the HubSpot CRM API

Best for: developers comfortable with JavaScript, single-portal reporting, full control over which properties to pull, no recurring software cost.


Setup time:
30-60 minutes for the first integration; 5-10 minutes per additional object type.


Cost:
free (within Apps Script and HubSpot API rate limits).


Apps Script is the path most internal RevOps teams take when they want to automate exports without paying for a connector. The setup involves creating a private app inside HubSpot to generate an access token, writing a script that calls the API, and triggering the script on a schedule.


Step 1: Create a HubSpot Private App and generate the access token.
In HubSpot, go to Settings → Integrations → Private Apps → Create a private app. Name it something like "Sheets Sync", grant the scopes you need (CRM read scopes for contacts, deals, companies as a minimum), and click Create app. HubSpot generates a long-lived access token. Copy and store it securely; you will paste it into your Apps Script.


Step 2: Open Apps Script bound to your target Sheet.
In your Google Sheet, open Extensions → Apps Script. The new project is already bound to the Sheet, so the SpreadsheetApp.getActiveSpreadsheet() call has access without further configuration.


Step 3: Write the export script.
Below is a working example that pulls the most recent contacts (with selected properties) from HubSpot into the active sheet.

function exportHubSpotContacts() {
  const HUBSPOT_TOKEN = 'YOUR_PRIVATE_APP_TOKEN'; // paste the token from step 1
  const properties = 'email,firstname,lastname,lifecyclestage,createdate,hs_lead_status';
  const url = 'https://api.hubapi.com/crm/v3/objects/contacts?limit=100&properties=' + properties;

  const options = {
    method: 'GET',
    headers: {
      'Authorization': 'Bearer ' + HUBSPOT_TOKEN,
      'Content-Type': 'application/json'
    },
    muteHttpExceptions: true
  };

  const response = UrlFetchApp.fetch(url, options);
  const data = JSON.parse(response.getContentText());

  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.clear();
  sheet.appendRow(['Email', 'First Name', 'Last Name', 'Lifecycle Stage', 'Create Date', 'Lead Status']);

  if (response.getResponseCode() === 200 && data.results && data.results.length > 0) {
    data.results.forEach(row => {
      const props = row.properties || {};
      sheet.appendRow([
        props.email || '',
        props.firstname || '',
        props.lastname || '',
        props.lifecyclestage || '',
        props.createdate || '',
        props.hs_lead_status || ''
      ]);
    });
  } else if (response.getResponseCode() !== 200) {
    Logger.log('Error: ' + response.getContentText());
  }
}


Step 4: Run the script for the first time and authorize.
Click Run inside the script editor. Apps Script will prompt you to grant permission for the script to make external HTTP requests and modify the active Sheet. Approve.


Step 5: Schedule with a trigger.
In Apps Script, open Triggers (clock icon, left sidebar), create a new trigger, and set it to run exportHubSpotContacts daily, weekly, or whatever cadence you need.


Limitations of Apps Script:

  • HubSpot API rate limits apply: free Marketing Hub accounts get 100 requests per 10 seconds and 250,000 per day; paid Hubs scale with the tier. If you query thousands of contacts every minute, you can hit limits.
  • Apps Script execution caps at 6 minutes for free Workspace, 30 minutes on paid. Pulling tens of thousands of records in one call requires pagination logic and may not finish in 6 minutes.
  • Each HubSpot object (contacts, deals, companies, tickets) requires its own script or parameterization. A multi-object reporting setup becomes maintenance overhead.
  • Properties have to be enumerated explicitly in the URL. HubSpot has thousands of properties per object; pulling everything is not practical, and choosing what to include is its own design exercise.


For a single portal with stable reporting needs, Method 2 is solid. For multi-portal agencies or teams that do not write code, Method 3 is faster.

Skip the Apps Script setup

Dataslayer connects HubSpot to Google Sheets, Looker Studio (now Data Studio), BigQuery and Power BI on a schedule. Multi-portal support, pre-built field mappings for contacts, deals, companies, tickets, email campaigns, and line items.

Try Dataslayer Free

Method 3: Scheduled connector (no-code)

Best for: RevOps teams managing multiple HubSpot portals, agencies running client reporting, anyone who wants to skip code maintenance and access derived dimensions the bare API does not expose.


Setup time:
under 10 minutes.


Cost:
subscription (Dataslayer starts at $35/month annual; free trial available).


Scheduled connectors handle the API authentication, pagination, scheduling, and error recovery. You configure the portal, object types, properties, and refresh frequency once; the connector keeps your Sheet up to date.


The setup with Dataslayer is straightforward.


Step 1: Install the Dataslayer add-on.
From your Google Sheet, open Extensions → Add-ons → Get add-ons. Search for "Dataslayer" and install. The add-on requests the standard Google Sheets permissions.


Step 2: Connect your HubSpot account.
Open Extensions → Dataslayer → Lauch Sidebar. Choose HubSpot as the data source and click Connect. Authorize via the HubSpot OAuth flow with the Google account that has access to the portal.


Step 3: Pick the portal.
Dataslayer lists every HubSpot portal your account has access to (useful for agencies managing multiple client portals). Choose the one to report on. Multiple portals can be queried in the same sheet using separate ranges.


Step 4: Choose dimensions and metrics.
Beyond the bare API, Dataslayer exposes the full HubSpot field catalog (the Dataslayer schema covers 934 dimensions and 249 metrics across all HubSpot objects). Pre-organized into categories so you can find them: time (lifecycle stage dates, deal close dates, email send dates), marketing (campaigns, traffic sources, attribution), geo (contact city, country, region codes), device, content (pages viewed, content engagement), and more.


The most-used field categories in practice:

  • Contact lifecycle dates: contact create date, became lead date, became MQL/SQL date, became customer date.
  • Deal pipeline data: deal amount, ARR, MRR, days to close, likelihood, deal stage, latest traffic source.
  • Email engagement: campaign emails sent, delivered, opened, unique clicks.
  • Attribution fields: first touch converting campaign, last touch converting campaign, original source.
  • Company fields: annual revenue, total revenue, page views, sessions.


Step 5: Set the date range.
Last 7 days, last 30 days, last quarter, year-to-date, or custom. For pipeline reporting, "deals modified in the last 30 days" is a common query.


Step 6: Output the data.
The connector writes the result to the cell range you select. From there, build pivot tables, charts, or feed Looker Studio off the same Sheet.


Step 7: Configure refresh.
Daily, weekly or on-demand. Daily refresh is the most common for pipeline dashboards.


Limitations to know:

  • The connector inherits HubSpot's API rate limits. For agencies querying 20+ portals on the same schedule, stagger refresh times to avoid hitting limits on shared HubSpot accounts.
  • Custom HubSpot properties (the ones your team created, not the standard fields) are exposed but have to be selected explicitly. Dataslayer does not pull them by default to keep response sizes manageable.
  • Some advanced HubSpot reports (attribution multi-touch reports specifically) compute server-side in HubSpot using internal logic that the public API does not fully replicate. For those, the HubSpot in-app report remains the source of truth; the connector is best for object-level data extraction.

Comparing the three methods

Aspect Manual CSV Apps Script Scheduled connector
Setup time 5 min 30-60 min Under 10 min
Cost Free Free From $35/mo
Records per export All filtered records 100/page (paginated) All (auto-paginated)
Scheduled refresh No Yes (Apps Script triggers) Yes (built in)
Multi-portal Manual per portal Custom per portal Native
Object types in one query One at a time One per script All in same sheet
Code maintenance None Owner Vendor


The decision typically comes down to portal count and time. One portal and CRM is a small part of your job: Apps Script. Multiple portals or CRM is your primary responsibility: scheduled connector. Single export needed for an executive deck this Friday: manual CSV.

Use cases worth setting up

Beyond the standard "list of contacts" report, four use cases benefit specifically from automating HubSpot into Sheets:


Pipeline-by-stage reporting.
Pull deals with their pipeline stage, deal amount, days in current stage, and probability. Build a pivot showing total deal value by stage, weekly. The dashboard tells the team where the pipeline is stuck and informs decisions about which stages need more sales activity. Combine with our marketing attribution framework to triangulate which channels are producing the deals stuck in stage.


Lifecycle conversion tracking.
Pull contacts with their lifecycle stage dates (created → lead → MQL → SQL → opportunity → customer). Calculate the time and conversion rate at each transition. The dashboard shows where the funnel leaks and which campaigns produce the fastest movers.


Email engagement audit.
Pull email campaign performance (sent, delivered, opens, unique clicks) joined to contact lifecycle stage. Identify which campaigns produce engagement from MQL+ contacts versus subscribers. The dashboard separates campaigns that move the funnel from campaigns that just drive vanity opens.


Cross-source attribution.
Pull HubSpot attribution fields (first touch converting campaign, last touch converting campaign, original source) joined to actual deal closure. Compare HubSpot's claim against what your other attribution sources say. We covered the broader cross-source approach in our marketing attribution framework; HubSpot data is one of the inputs to that triangulation.


For dashboard layout best practices once you have the data flowing, see our dashboard design best practices guide. For agencies running this across multiple client portals, the multi-channel attribution dashboard guide covers patterns that scale across platforms.

Common errors and how to read them

A few errors come up enough that recognizing them saves time.


401 unauthorized
:
the access token is invalid or has been revoked. Regenerate the private app token in HubSpot Settings → Integrations → Private Apps and update your script or connector configuration.


403 forbidden
with scope error:
the private app does not have the scope needed to read the requested object. Edit the private app, add the missing CRM scope, save, and retry. The HubSpot Private Apps documentation lists every scope and what it grants.


429 too many requests
:
you hit the HubSpot API rate limit. Wait and retry; or stagger your refresh schedule across multiple times of day if running multiple portal queries.


Empty results array with no error:
the filter you applied excluded all records. Common cause: filtering by a property name that does not exist or by a date field with an unexpected format (HubSpot dates are milliseconds since epoch; quoting them as strings does not match).

FAQ

How often does HubSpot data update via the API?
HubSpot data is real-time on writes. When a contact lifecycle stage changes in the HubSpot UI, the API reflects it immediately. The lag is on your refresh schedule, not on HubSpot's side. Daily refresh of your Google Sheet is the most common cadence and is more than fresh enough for most reporting needs.


Can I pull custom HubSpot properties (the ones we created)?
Yes. Custom properties are exposed via the API the same way as standard properties. In Apps Script, add them to the properties query parameter. In Dataslayer, custom properties appear in the field selector once you connect the portal. Both methods work; Dataslayer surfaces them in a UI rather than requiring you to know the property internal name.


Do I need a HubSpot Marketing Hub paid tier to use the API?
No. The HubSpot CRM API is available on free and paid tiers, including Marketing Hub Free. Rate limits are tighter on free tiers (100 requests per 10 seconds, 250,000 per day for free Marketing Hub) but more than sufficient for a Sheet-based reporting setup.


What about HubSpot Operations Hub data sync, is that the same as a connector?
HubSpot's Operations Hub Data Sync is a sync feature for keeping HubSpot in sync with other CRMs (Salesforce, Pipedrive, etc.), not a Google Sheets connector. For Sheets specifically, the three methods in this post (manual CSV, Apps Script, scheduled connector) are the practical paths. Operations Hub does not include a direct HubSpot to Google Sheets sync.


Should I use a private app or OAuth for my Apps Script integration?
Private apps are simpler for internal use (single team, single portal) and the HubSpot-recommended path for new integrations. OAuth is required if you are building an app that other HubSpot accounts will install. For "I want to pull my own portal's data into my own Sheet," use a private app.


How does the Looker Studio rebrand to Data Studio affect HubSpot reporting?
It does not. The rebrand was a naming change, not a product change. Existing HubSpot connections to Looker Studio (now Data Studio) keep working. We covered the rebrand specifics in our Looker Studio to Data Studio rebrand post.


Can I send Sheets data back into HubSpot?
This post covers HubSpot to Sheets (read direction). The reverse direction (Sheets to HubSpot, for example to bulk-update contacts) is also possible via the HubSpot CRM API but requires write scopes on the private app and a different code pattern. Most reporting setups stay one-way: HubSpot → Sheets.

Conclusion

The three methods to connect HubSpot to Google Sheets cover the full spectrum: manual CSV for one-off exports, Apps Script for free automation with code, and a scheduled connector for hands-off multi-portal reporting. The right choice depends on how many portals you manage, whether you want to maintain code, and how often the data needs to refresh.


The HubSpot CRM API exposes a deep schema (contacts, companies, deals, tickets, line items, email campaigns, lead objects), and 2026's reporting setups benefit from pulling that data into Sheets where it can be combined with paid media data, attributed across channels, and shared with stakeholders without custom dashboards. If you maintain HubSpot reporting and want to skip the API code maintenance, start a free Dataslayer trial. The connector handles authentication, pagination, scheduling, and the field catalog so your team stays in the dashboard, not in the API documentation.

CONTACT FORM

RELATED POST

Pulling HubSpot Data into Google Sheets: A 2026 Guide for Marketing & RevOps

What KPIs Belong in a Marketing Dashboard? The 2026 Decision Playbook

The 2026 Attribution Framework: Why Last-Click Is Dead and What Replaces It

Our Partners