For the complete documentation index, see llms.txt. This page is also available as Markdown.

HubSpot → Data Warehouse

Connection methods and marketing analytics tables

Sortment internal reference - onboarding playbook

This document is a definitive reference for every supported method of connecting HubSpot marketing data into a data warehouse, and for every table available in each method. It is structured for merchant onboarding - specifically to determine which tables Sortment can expect to find when it is granted read access to a merchant's data warehouse schema, and how to build accurate email campaign analytics from those tables.

Merchants may be running several data warehouses, including Snowflake, Amazon Redshift, Google BigQuery, AWS Athena, or Databricks. This document covers all common pipeline methods. Where a method or SQL syntax is specific to one warehouse platform, it is explicitly noted.

Each method section includes: (a) a description of how the pipeline works and what it requires, (b) a complete table reference for marketing-relevant tables, and (c) gotchas and caveats that affect query accuracy. The final sections cover the sent → opened → clicked → converted funnel pattern and a decision matrix for matching each merchant to the right method.


1. Connection methods at a glance

HubSpot data can reach a data warehouse through six distinct paths. The method determines what schema the data lands in, how fresh it is, and critically, what tables are available for marketing analytics.

Method
Provider
HubSpot Tier Req.
Latency
Data Lands In

Native Data Share (Snowflake only)

HubSpot (built-in)

Ops Hub Professional+

15 min (Live) / Daily

Shared DB (read-only)

Fivetran ETL

Fivetran

Any HubSpot tier

Configurable (15 min+)

Merchant's own schema

Airbyte ETL

Airbyte (open-source or Cloud)

Any HubSpot tier

Configurable

Merchant's own schema

Stitch (Qlik) ETL

Qlik/Stitch

Any HubSpot tier

Configurable

Merchant's own schema

Estuary Flow

Estuary

Any HubSpot tier

Near real-time

Merchant's own schema

Windsor.ai / Supermetrics

Windsor / Supermetrics

Any HubSpot tier

Daily typical

Merchant's own schema

The most common pattern in merchant stacks encountered during Sortment onboarding is Fivetran (managed ETL) followed by HubSpot's Native Data Share (Snowflake accounts only). Airbyte and Stitch are less common but follow the same logical data model and work with any warehouse destination.


2. Method A: HubSpot Native Snowflake Data Share

How it works

HubSpot acts as the Snowflake data provider. No data is physically copied - Snowflake's Secure Data Sharing grants the merchant's Snowflake account read-only access to a shared database that HubSpot maintains. The merchant sees the data in their Snowflake instance without any ETL infrastructure.

  • Requires: Operations Hub Professional or Enterprise

  • Latency: V2_LIVE schema refreshes every 15 minutes; V2_DAILY refreshes once per day

  • Schema naming: HUB_{portalId}_DB.V2_LIVE.{TABLE_NAME} or .V2_DAILY.{TABLE_NAME}

  • Read-only: the merchant cannot write back to this database

V2_LIVE and V2_DAILY contain the same tables. V2_LIVE is preferred for near-real-time queries. V2_DAILY is preferred for large batch analytics to avoid query cost on a rapidly updating dataset. Some views (association_definitions, owners, pipelines, pipeline_stages) are only updated daily even in V2_LIVE.

2.1 Email event tables

Email event data is sharded: each event type is its own table. You query them separately and join on OBJECTID (contact ID) and PROPERTY_HS_EMAIL_CAMPAIGN_ID.

Table Name (V2_DAILY / V2_LIVE)
Event Type
Key Columns

EVENTS_SENT_EMAIL_V2

Send event per contact

OBJECTID, OCCURREDAT, PROPERTY_HS_EMAIL_CAMPAIGN_ID

EVENTS_DELIVERED_EMAIL_V2

Confirmed delivery

OBJECTID, OCCURREDAT, PROPERTY_HS_EMAIL_CAMPAIGN_ID

EVENTS_OPENED_EMAIL_V2

Email open

OBJECTID, OCCURREDAT, PROPERTY_HS_EMAIL_CAMPAIGN_ID

EVENTS_CLICKED_LINK_IN_EMAIL_V2

Link click

OBJECTID, OCCURREDAT, PROPERTY_HS_EMAIL_CAMPAIGN_ID, PROPERTY_HS_CLICK_ORIGINAL_URL

EVENTS_BOUNCED_EMAIL_V2

Hard or soft bounce

OBJECTID, OCCURREDAT, PROPERTY_HS_EMAIL_CAMPAIGN_ID, PROPERTY_HS_BOUNCE_REASON

EVENTS_UNSUBSCRIBED_FROM_EMAIL_V2

Unsubscribe

OBJECTID, OCCURREDAT, PROPERTY_HS_EMAIL_CAMPAIGN_ID

EVENTS_MARKED_EMAIL_AS_SPAM_V2

Spam report

OBJECTID, OCCURREDAT, PROPERTY_HS_EMAIL_CAMPAIGN_ID

EVENTS_FORWARDED_EMAIL_V2

Email forward

OBJECTID, OCCURREDAT, PROPERTY_HS_EMAIL_CAMPAIGN_ID

EVENTS_SCHEDULED_EMAIL_V2

Scheduled for send

OBJECTID, OCCURREDAT, PROPERTY_HS_EMAIL_CAMPAIGN_ID

EVENTS_DEFERRED_EMAIL_V2

Send deferred (temp. failure)

OBJECTID, OCCURREDAT, PROPERTY_HS_EMAIL_CAMPAIGN_ID

EVENTS_DROPPED_EMAIL_V2

Dropped before send

OBJECTID, OCCURREDAT, PROPERTY_HS_EMAIL_CAMPAIGN_ID

2.2 Object tables

Object tables hold current-state records for each HubSpot object. Properties are flattened as columns (PROPERTY_*).

Table Name
What It Contains
Key Columns

OBJECTS_CONTACTS

All CRM contacts

OBJECTID, PROPERTY_EMAIL, PROPERTY_FIRSTNAME, PROPERTY_LASTNAME, PROPERTY_HS_LEAD_STATUS

OBJECTS_CAMPAIGNS

Marketing campaign records

OBJECTID, PROPERTY_HS_NAME, PROPERTY_HS_GOAL, PROPERTY_HS_BUDGET_ITEMS_SUM_AMOUNT

OBJECTS_MARKETING_EMAILS

Email asset metadata

OBJECTID, PROPERTY_HS_NAME, PROPERTY_HS_SUBJECT, PROPERTY_HS_SEND_DATE, PROPERTY_HS_CAMPAIGN_ID

OBJECTS_DEALS

Deal pipeline records (conversion signal)

OBJECTID, PROPERTY_DEALNAME, PROPERTY_AMOUNT, PROPERTY_DEALSTAGE, PROPERTY_CLOSEDATE

OBJECTS_FORMS

Form submissions (alt. conversion signal)

OBJECTID, PROPERTY_HS_FORM_ID, PROPERTY_HS_NAME, PROPERTY_HS_CREATED_AT

OBJECTS_COMPANIES

Company / account records

OBJECTID, PROPERTY_NAME, PROPERTY_DOMAIN, PROPERTY_INDUSTRY, PROPERTY_NUMBEROFEMPLOYEES

OBJECTS_LISTS

HubSpot contact/company lists

OBJECTID, PROPERTY_HS_LIST_ID, PROPERTY_HS_NAME, PROPERTY_HS_LIST_TYPE

OBJECTS_WORKFLOWS

Automation workflows

OBJECTID, PROPERTY_HS_NAME, PROPERTY_HS_STATUS

2.3 Association tables

Association tables are the join layer between objects. You need these to connect email events (which carry a contact ID) to deals or companies.

Association Table
What It Links

ASSOCIATIONS_CONTACTS_TO_DEALS

Contact → Deal (join for conversion attribution)

ASSOCIATIONS_CONTACTS_TO_COMPANIES

Contact → Company (account-level analytics)

ASSOCIATIONS_CAMPAIGNS_TO_FORMS

Campaign → Form (form conversion attribution)

ASSOCIATIONS_CONTACTS_TO_FORMS

Contact → Form submission

ASSOCIATIONS_MARKETING_EMAILS_TO_CAMPAIGNS

Email asset → Campaign (links the email content to the campaign)


3. Method B: Fivetran ETL Connector

How it works

Fivetran is a managed ETL service that extracts data from HubSpot's APIs and loads it into the merchant's own data warehouse. This is the most feature-complete ETL connector for HubSpot marketing analytics. Fivetran handles schema changes automatically, rate limiting, incremental syncs, and retries. It supports all major warehouse destinations including Snowflake, Redshift, BigQuery, and Databricks.

  • Requires: any HubSpot tier; Fivetran subscription; data warehouse destination

  • All tables land in a schema the merchant names (typically hubspot or hubspot_fivetran)

  • Schema changes in HubSpot propagate automatically without full resyncs

  • Email event child tables must be individually enabled in the connector Schema tab

3.1 Email and campaign tables

Fivetran shards email events into separate child tables - one table per event type. Each child table must be explicitly enabled in the Fivetran connector settings, or it will be empty.

Table Name
Sync Mode
Notes

EMAIL_CAMPAIGN

Incremental

Campaign-level metadata: name, app_id, counters (sent, opens, clicks) at time of sync

EMAIL_EVENT

Incremental

Parent event table. Must have child tables selected in Schema tab or it won't populate.

EMAIL_EVENT_SENT

Incremental

One row per send. Columns: id, email_campaign_id, email_address, recipient, sent_by, created

EMAIL_EVENT_DELIVERED

Incremental

Delivery confirmation events

EMAIL_EVENT_OPEN

Incremental

Open events. Includes user_agent for device/client analysis

EMAIL_EVENT_CLICK

Incremental

Click events. Includes url (clicked URL) and user_agent

EMAIL_EVENT_BOUNCE

Incremental

Bounce events. Includes bounce_type (HARD/SOFT), status, and reason

EMAIL_EVENT_DEFERRED

Incremental

Temporary delivery deferral events

EMAIL_EVENT_DROPPED

Incremental

Dropped before send (e.g. unsubscribed list). Includes reason field

EMAIL_EVENT_UNSUBSCRIBE

Incremental

Unsubscribe events. Includes portal_id, email_campaign_id

EMAIL_EVENT_SPAM_REPORT

Incremental

Spam complaint events

EMAIL_EVENT_FORWARD

Incremental

Email forward events

EMAIL_EVENT_PRINT

Incremental

Print events (rare, browser print action)

3.2 CRM and supporting tables

Table Name
Sync Mode
Notes

CONTACT

Incremental

All contact properties. Companion: CONTACT_PROPERTY_HISTORY for historical values

COMPANY

Incremental

Company records + COMPANY_PROPERTY_HISTORY

DEAL

Incremental

Deal records. Child tables: DEAL_PROPERTY_HISTORY, DEAL_STAGE. Join to EMAIL events on contact for conversion

FORM

Full

Form definitions (not submissions - use FORM_SUBMISSION)

FORM_SUBMISSION

Incremental

Each form fill. Joinable to contacts for conversion tracking

OWNER

Full

HubSpot user/owner records

ENGAGEMENT

Incremental

Parent engagement table. Child tables per type: NOTE, EMAIL, TASK, MEETING, CALL

CONTACT_COMPANY

Full

Association: contact ↔ company

CONTACT_LIST

Full

HubSpot list definitions

CONTACT_LIST_MEMBER

Full

Which contacts are in which lists

DEAL_PIPELINE

Full

Pipeline definitions and stages for deal tracking

LINE_ITEM_DEAL

Incremental

Association between line items and deals (e-commerce)

TICKET / TICKET_PIPELINE

Incremental

Support tickets and their pipeline stages

WORKFLOW

Full

Automation workflow definitions

SUBSCRIPTION_CHANGE

Incremental

Email subscription changes per contact (opt-in/opt-out history)

3.3 Optional: Fivetran dbt package (dbt_hubspot)

If the merchant runs the Fivetran dbt_hubspot package on top of the raw tables, they will have a set of pre-built analytics models. These are significantly easier to query for funnel analysis and are the preferred layer when available.

dbt Model
What You Get

hubspot__email_campaigns

One row per campaign. Pre-aggregated sent, delivered, open, click, bounce, unsubscribe, spam counts. The go-to table for funnel reporting.

hubspot__email_sends

One row per sent email enriched with whether that specific send was opened, clicked, or bounced.

hubspot__email_events

All email events joined with campaign and contact context, ready for analysis without manual joins.

hubspot__contacts

SCD Type 2 contact model - tracks property changes over time, not just current state.

hubspot__companies

SCD Type 2 company model with engagement activity joined in.

hubspot__deals

Deal model joined to contact engagement - use this to attribute closed deals back to campaigns.

hubspot__engagements

All CRM engagement activities (calls, meetings, notes, tasks) normalized and company/contact-joined.

The dbt package is not auto-installed - a merchant must explicitly configure and run it. Ask during onboarding whether their data team runs dbt on top of Fivetran. If yes, the hubspot__email_campaigns model is the best single table for aggregate campaign funnel analytics.


4. Method C: Airbyte ETL Connector

How it works

Airbyte is an open-source (and cloud-hosted) ELT platform. Its HubSpot connector maps each API resource to a stream, which becomes a table in the destination data warehouse. Unlike Fivetran, Airbyte consolidates all email event types into a single email_events table with a type field - there are no separate child tables per event type. Airbyte supports all major warehouse destinations.

  • Requires: any HubSpot tier; Airbyte OSS or Cloud; data warehouse destination

  • Authentication: HubSpot Private App token or OAuth

  • Sync frequency: configurable, from minutes to daily

  • Email events: all types in one table (type column = SENT, OPEN, CLICK, BOUNCE, etc.)

Stream (Table in data warehouse)
What It Contains

campaigns

Campaign metadata from the HubSpot Email Campaigns API

marketing_emails

Email asset records including subject line, send date, and campaign association

email_events

All email events in a single table (type field distinguishes SENT, OPEN, CLICK, BOUNCE, etc.) - unlike Fivetran's separate child tables

contacts

Contact records with all properties

contacts_list_memberships

Which lists each contact belongs to

companies

Company records

deals

Deal pipeline records for conversion tracking

deal_pipelines

Pipeline and stage definitions

engagements_calls

Call engagement records

engagements_emails

1:1 CRM email engagements (not marketing emails)

engagements_meetings

Meeting engagements

engagements_notes

Notes attached to CRM records

engagements_tasks

Task records

forms

Form definitions

owners

HubSpot user/owner records

tickets

Support tickets

workflows

Automation workflows

email_subscriptions

Subscription type definitions and contact opt-in status

goals

HubSpot Goals objects

line_items

E-commerce line items associated with deals

products

Product catalogue records

quotes

Sales quote records

Airbyte's email_events table uses a different query pattern than Fivetran. Instead of joining multiple child tables, you filter on the type column: WHERE type = 'OPEN'. Confirm this structure before writing any SQL against an Airbyte-sourced schema.


5. Method D: Stitch (Qlik) ETL Connector

How it works

Stitch (now part of Qlik) is a managed ETL tool with a HubSpot connector. Its table structure is similar to Airbyte - a unified email_events table - but with fewer streams than Fivetran. An important limitation: replicating the email_events table requires Super Admin permissions in HubSpot. If the merchant's integration was set up with a lower-permission user, email events will be absent.

  • Requires: any HubSpot tier; Stitch subscription; data warehouse destination

  • Super Admin required in HubSpot for email_events replication

  • Smaller stream library than Fivetran - some engagement sub-types are absent

Table Name
What It Contains

campaigns

Campaign metadata. Primary key: id

email_events

All email events. Requires Super Admin permissions in HubSpot to replicate. Primary key: id

contacts

Contact records with all custom properties flattened. Primary key: canonical_vid

companies

Company records. Primary key: company_id

deals

Deal records. Primary key: deal_id

forms

Form definitions. Primary key: guid

keywords

Portal keywords (SEO tool data). Primary key: keyword_guid

owners

HubSpot owner/user records. Primary key: owner_id

subscription_changes

Email subscription opt-in/opt-out change history

workflows

Automation workflow definitions

Stitch replicates email_events as a unified table with a type field - the same pattern as Airbyte. Query pattern: filter on type rather than joining separate tables.


6. Method E and F: Estuary, Windsor, and others

Estuary Flow

Estuary is a newer real-time ELT platform with a HubSpot connector. It uses a streaming-first architecture, meaning data can land in the data warehouse with sub-minute latency. Table structure follows the same logical model as Fivetran/Airbyte but varies by configuration. Less common in merchant stacks as of mid-2026 but growing.

  • Key tables: contacts, companies, deals, email_events (unified), marketing_emails, campaigns

  • Latency: near real-time (minutes, not hours)

  • Well-suited for merchants who need very fresh campaign data

Windsor.ai / Supermetrics

These are reporting-layer tools, not full ELT pipelines. They typically sync aggregated campaign metrics rather than raw event-level data. As a result, they are useful for high-level reporting but insufficient for contact-level funnel analysis. You cannot trace an individual contact's journey from send to conversion.

  • Typical tables: hubspot_campaigns (aggregated metrics), hubspot_ads, hubspot_email_performance

  • Not suitable for contact-level attribution or funnel analysis

  • If a merchant uses only Windsor or Supermetrics, raw event tables will not be present


7. Building the Sent → Opened → Clicked → Converted funnel

Regardless of which pipeline method the merchant uses, the funnel logic follows the same pattern. What varies is the table names and how events are stored (sharded vs. unified).

Funnel Stage
Source Table(s)
Notes

Sent

EVENTS_SENT_EMAIL_V2 / EMAIL_EVENT_SENT / email_events

Count distinct OBJECTID or email_address per campaign. The denominator for all other rates.

Delivered

EVENTS_DELIVERED_EMAIL_V2 / EMAIL_EVENT_DELIVERED

Delivery rate = Delivered / Sent. Bounced = Sent - Delivered.

Opened

EVENTS_OPENED_EMAIL_V2 / EMAIL_EVENT_OPEN

Open rate = unique openers / Delivered. Count distinct contact per campaign for unique opens.

Clicked

EVENTS_CLICKED_LINK_IN_EMAIL_V2 / EMAIL_EVENT_CLICK

CTOR = unique clickers / unique openers. Also available: which URLs were clicked.

Converted

OBJECTS_DEALS + ASSOCIATIONS_CONTACTS_TO_DEALS (or FORM_SUBMISSION)

No native email-to-deal event exists. Define conversion as: deal created within N days of a click on the campaign, joined via contact ID.

SQL syntax note: The sample queries below use Snowflake / Redshift-compatible syntax (DATEADD). BigQuery uses DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY) and Databricks uses CURRENT_DATE - INTERVAL 7 DAYS. Adjust accordingly for the merchant's warehouse.

Sample SQL - Fivetran (sharded event tables)

Sample SQL - Airbyte/Stitch (unified email_events table)

Sample SQL - Native Data Share (sharded, V2_DAILY schema - Snowflake only)


8. Critical gotchas and onboarding checks

These are the most common failure points encountered when querying HubSpot data in a data warehouse across any pipeline method.

Watch Out For
Detail

Campaign ID mismatch (Native Data Share)

The OBJECTID in OBJECTS_CAMPAIGNS is different from PROPERTY_HS_EMAIL_CAMPAIGN_ID in event tables. HubSpot uses a separate internal content/asset ID. Always verify the join key before writing funnel queries.

Fivetran child tables must be enabled

EMAIL_EVENT only populates if the EMAIL_EVENT_* child tables are explicitly selected in the Fivetran connector's Schema tab. A connector set up without them will have an empty EMAIL_EVENT table and missing email data.

Fivetran 25-hour lookback

Fivetran re-fetches EMAIL_EVENT_* data 25 hours behind the current sync to catch HubSpot's delayed event processing. Expect some duplication in raw tables - use created as the dedup key.

Conversion is not a native event

HubSpot does not emit a 'converted' email event. Conversion must be self-defined: typically a deal created/updated, a form submission, or a purchase event within a time window after a click, joined on contact ID.

Native Data Share requires Ops Hub Pro+ and Snowflake

The HubSpot Native Data Share is only available to merchants on Operations Hub Professional or Enterprise and using Snowflake as their data warehouse. All other warehouse platforms require a third-party ETL connector.

Stitch requires Super Admin for email_events

Stitch specifically requires Super Admin permissions in HubSpot to replicate the email_events table. If the merchant's integration token was set up with a lesser role, email events will be missing.

Airbyte unified vs Fivetran sharded events

Airbyte consolidates all email event types into a single email_events table with a type column. Fivetran splits them into EMAIL_EVENT_SENT, EMAIL_EVENT_OPEN, etc. This changes the query pattern - know which pipeline you're on before writing SQL.

Metadata query syntax varies by warehouse

The discovery query SHOW TABLES IN SCHEMA hubspot; works in Snowflake. Use INFORMATION_SCHEMA.TABLES for BigQuery and Redshift (SELECT table_name FROM information_schema.tables WHERE table_schema = 'hubspot'). Athena uses Glue catalog; Databricks uses SHOW TABLES IN hubspot.


9. Onboarding decision matrix

At Sortment's end, this is how we determine what connection method applies and what to request access to.

If the merchant has...
Recommended path for Sortment read access

HubSpot Ops Hub Pro+ and Snowflake as their data warehouse

Request access to their Native Data Share (V2_LIVE or V2_DAILY schema). Zero ETL infrastructure required, freshest data. (Snowflake-only feature.)

Fivetran already running to their data warehouse

Confirm EMAIL_EVENT_* child tables are enabled. Ask for read access to the hubspot schema. If dbt_hubspot is running, prefer the mart models (hubspot__email_campaigns etc.).

Airbyte running to their data warehouse

Request read access to their Airbyte destination schema. Key tables: email_events (unified), campaigns, marketing_emails, contacts, deals.

Stitch running to their data warehouse

Request read access. Verify Super Admin was used for HubSpot auth (required for email_events). Key tables: email_events, campaigns, contacts, deals.

No ETL / no warehouse connection yet

Recommend Fivetran (most feature-complete for HubSpot marketing analytics) - it supports all major warehouse destinations. If they are on Snowflake with Ops Hub Pro+, the HubSpot Native Data Share is the fastest path with no ETL to manage. Fivetran dbt package gives you the cleanest analytics layer out of the box.


Appendix: References

Last updated