Skip to main content

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

PropertyTypeKey?Description
activity_idstringyesUnique identifier for the event.
account_idstringyesAccount the event belongs to.

Default properties

PropertyTypeDescription
user_idstringUser associated with the event, if known.
timestamptimestampWhen the event occurred.

Activities

Rows feed Activity occurred timeline events for this model's name, similar to other activity-shaped models.

Configure

  1. Configuration → Data models → Add model → Non-product activity.
  2. Choose a connection and provide a query or managed source.
  3. Map to activity_id, account_id, and default properties.
  4. 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 typeevent_type valueWhat it tracks
Website page viewe_visited_pageContacts visiting your website or tracked pages
Form submissione_submitted_formForm fills on your site or landing pages
Marketing email openede_opened_emailHubSpot marketing email opens
Marketing email link clickede_clicked_emailClicks on links inside marketing emails
Meeting bookede_booked_meetingMeetings booked via HubSpot meetings
Blog subscriptione_subscribed_to_blogBlog 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.

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):

ColumnProperty
idactivity_id
account_idaccount_id
user_iduser_id
timestamptimestamp

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).

Account resolution requirement

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:

_hsq.push(['identify', { email: '[email protected]' }]);

See Identify a visitor.

Single-page applications:
Trigger page view tracking on route changes:

_hsq.push(['trackPageView']);