HubSpot to Google Sheets without Zapier (2026)
HubSpot's built-in Sheets export is a scheduled CSV dump. It runs daily, gives you flat data, and loses the relationships between contacts and deals. Zapier's HubSpot → Sheets recipes are real-time, but they cost $20+/month and burn one Zap task per row.
The direct path: HubSpot's REST API is well-documented, supports private app tokens, and rate-limits at a generous 100 requests / 10 seconds. A spreadsheet add-on that can make authenticated HTTP calls can pull whatever you ask for, on-demand, with no middleware.
What you can pull
- Contacts (with all properties)
- Companies
- Deals (open + closed, by pipeline stage)
- Tickets
- Engagements (calls, emails, meetings)
- Tasks, owners, lifecycle stages
Each goes into rows. Use Sheets' pivot tables, formulas, and conditional formatting to slice however you want.
Setup: 5 minutes
Step 1: install GPTSheet
Extensions → Get add-ons → search "GPTSheet". Activate a Premium license ($234/yr or $39/mo) — it includes API Fetch, which calls any REST API with your own token. (GPTSheet doesn't currently sell a packaged HubSpot connector; API Fetch reaches the same endpoints.)
Step 2: create a HubSpot private app
- HubSpot → Settings (gear icon) → Integrations → Private Apps → Create private app.
- Name it
gptsheet-reader. No logo needed. - On the Scopes tab, enable read for:
crm.objects.contacts.read,crm.objects.companies.read,crm.objects.deals.read,crm.objects.tickets.read,crm.lists.read. - Create app → click Show token on the resulting page. Copy the token (starts with
pat-na1-...).
Step 3: connect
Sidebar → Menu → API Fetch → + Add fetch. Enter a HubSpot URL (e.g. https://api.hubapi.com/crm/v3/objects/contacts?limit=100), set auth to Bearer token, paste the token, and hit Preview. A single GET /crm/v3/owners call is a good first test.
Pulling the data
Save one fetch per endpoint you care about (all under https://api.hubapi.com). The useful HubSpot ones:
| Fetch | What it returns |
|---|---|
List recent contactsGET /crm/v3/objects/contacts?limit=100 | Up to 100 contacts with default properties. |
Search contactsPOST /crm/v3/objects/contacts/search | Filtered query — by lifecycle stage, owner, last activity date. |
List dealsGET /crm/v3/objects/deals?limit=100 | Deals with pipeline and stage (use POST /crm/v3/objects/deals/search to filter to one pipeline). |
List companiesGET /crm/v3/objects/companies?limit=100 | Up to 100 companies with industry, size, revenue properties. |
Get contact engagementsGET /crm/v3/objects/contacts/{id}/associations/notes | IDs of the notes associated with a contact — fetch each via GET /crm/v3/objects/notes/{noteId} (swap notes for emails / calls / meetings). |
List recent ticketsGET /crm/v3/objects/tickets?limit=100 | Open + recently-closed support tickets. |
Enable a saved fetch for the chat agent and it becomes a tool: ask "pull my HubSpot deals into this sheet" and the rows are written for you. Re-run whenever you want fresh data. API Fetch also has a cursor-pagination option for lists longer than 100.
Patterns you'll use
Weekly pipeline report
Fetch: List deals (filtered to your sales pipeline ID). Re-run it Monday morning. Result: a fresh report with every deal, its stage, and its amount. Combine with Sheets pivot tables to break down by stage / owner.
Stale-contact cleanup
Fetch: Search contacts filtered by last_activity_date < 180 days ago. Result: contacts that haven't been touched in 6 months. Pipe through =AI_CLASSIFY to bucket as "re-engage / sunset / archive". One-click cleanup workflow.
Lead enrichment
Fetch: List recent contacts. For each contact, run =AI_WEB("company size and industry of " & B2) against the company column to auto-enrich. Cheap alternative to Clearbit for small batches.
What about real-time?
If you need second-level freshness — e.g., new lead pings a Sheet within 30 seconds — HubSpot webhooks → cloud function → Sheets API is the right pipeline. But for 95% of sales ops workflows (weekly pipeline reviews, monthly cohort reports, daily new-contact lists), an on-demand refresh is plenty.
Privacy
GPTSheet is BYOK — your HubSpot token is stored in browser localStorage, never on our servers. Every API call goes from your Sheet to api.hubapi.com directly. We only see your GPTSheet license key, and only when verifying it.
What it costs
API Fetch is part of GPTSheet Premium ($234/yr or $39/mo, BYOK, unlimited usage) — there's no separate CRM add-on to buy, and the same approach works for Salesforce, Zoho, Apollo, or any other REST API with a token. On Premium the chat agent can use your API Fetch sources, so you get "ask my CRM in plain English" inside Sheets — without buying a $200/month BI tool.
Pull HubSpot into Sheets with API Fetch
API Fetch, and the chat agent using it, are in GPTSheet Premium — $234/yr or $39/mo. BYOK, unlimited usage.
Get GPTSheet Premium