Non-product activity
Non-product activity (NPA) models capture events that are not core in-app product usage: marketing engagement, website visits, form submissions, email opens, support-adjacent actions, or any other event stream you want on the account timeline without labeling it as product activity.
Prerequisites
Configure the Accounts model and Users model first. The user_id and account_id in activity events are resolved against those models — without them, events won't link to the right accounts.
Model keys
| Property | Type | Key? | Description |
|---|---|---|---|
activity_id | string | yes | Unique identifier for the event. |
account_id | string | yes | Account the event belongs to. |
Default properties
| Property | Type | Description |
|---|---|---|
user_id | string | User associated with the event, if known. |
timestamp | timestamp | When the event occurred. |
Activities
Rows feed Activity occurred timeline events for this model's name, similar to other activity-shaped models.
Configure
- Configuration → Data models → Add model → Non-product activity.
- Choose a connection and provide a query or managed source.
- Map to
activity_id,account_id, and default properties. - Validate, save, refresh, then check an account timeline.
Supported connections for this model type include warehouses, databases, HubSpot, Salesforce, Segment, SES-backed pipelines, and others per your workspace — see Data connections.
HubSpot behavioral events
HubSpot tracks several types of contact-level behavioral events — website visits, form submissions, email opens and clicks, meeting bookings, and blog subscriptions. FunnelStory syncs these events from HubSpot's contact events API and makes them available in the page_views virtual table.
Each event type can be configured as a separate non-product activity model, giving you individual timeline activities per engagement type (for example a distinct "Page View" activity and a separate "Form Submission" activity).
Available event types
| Event type | event_type value | What it tracks |
|---|---|---|
| Website page view | e_visited_page | Contacts visiting your website or tracked pages |
| Form submission | e_submitted_form | Form fills on your site or landing pages |
| Marketing email opened | e_opened_email | HubSpot marketing email opens |
| Marketing email link clicked | e_clicked_email | Clicks on links inside marketing emails |
| Meeting booked | e_booked_meeting | Meetings booked via HubSpot meetings |
| Blog subscription | e_subscribed_to_blog | Blog or content subscriptions |
Prerequisites
- A connected HubSpot data connection.
- The Accounts and Users models must be configured first. Account resolution for behavioral events is done by matching visitor email to known users.
- HubSpot tracking on your website so events are collected and linked to contact email addresses.
Using Claude (recommended)
Ask Claude via the MCP server to configure all behavioral event models at once:
"Configure HubSpot page view and form submission non-product activity models"
Claude reads the data model guide, previews queries, and creates each model in the correct order. See Configure HubSpot models with Claude for a full walkthrough.
Manual configuration
Add a Non-product activity model with the HubSpot connection for each event type you want to track. The page_views virtual table resolves account_id by matching the visitor's email to your users model.
Example — page views:
SELECT
id,
account_id,
user_id,
timestamp,
properties->>'hs_url' AS url,
properties->>'hs_page_title' AS page_title
FROM page_views
WHERE event_type = 'e_visited_page'
AND account_id IS NOT NULL
Example — form submissions:
SELECT
id,
account_id,
user_id,
timestamp,
properties->>'hs_url' AS url,
properties->>'hs_page_title' AS page_title
FROM page_views
WHERE event_type = 'e_submitted_form'
AND account_id IS NOT NULL
Mappings (for both):
| Column | Property |
|---|---|
id | activity_id |
account_id | account_id |
user_id | user_id |
timestamp | timestamp |
Use the same pattern with different event_type values for email opens (e_opened_email), email clicks (e_clicked_email), meeting bookings (e_booked_meeting), and blog subscriptions (e_subscribed_to_blog).
The page_views table resolves account_id by matching the visitor's email to your users model. Visitors whose emails aren't linked to a known user in FunnelStory will have a NULL account_id and be excluded by the WHERE account_id IS NOT NULL filter.
For best results, make sure your HubSpot contacts are associated with deal companies and your users model is up to date.
Enable HubSpot visitor tracking
For page views and behavioral events to be collected, HubSpot's tracking code must be installed on your site.
Install the snippet:
Use the tracking code from HubSpot Settings → Tracking & analytics → Tracking code. HubSpot's guide: Install the HubSpot tracking code.
Identify visitors after login:
Call identify with the user's email so page views are linked to a known contact:
See Identify a visitor.
Single-page applications:
Trigger page view tracking on route changes:
_hsq.push(['trackPageView']);
Related
- Product & activity models
- Data models overview
- Conversations (for chat-style channels)
- HubSpot connection