Concepts
How Simmer models journeys, channels, and multi-touch attribution.
If you've used Google Analytics or any last-click attribution tool, the data model here is similar but not identical. This page explains the building blocks so the dashboard makes sense.
The data model
event ──► session ──► touchpoint ──► journey ──► conversionEvent
An individual user action: a page view, a form submit, a scroll milestone, a product view. Each event carries its UTM parameters, page context, and engagement (scroll depth, time on page).
Session
A continuous activity window. Simmer uses GA4-style session semantics: a session ends after 30 minutes of inactivity. Importantly, a new UTM does not start a new session — clicking a Google Ad and then a LinkedIn Ad five minutes later is one session.
Touchpoint
A session, grouped by channel. The touchpoint is the unit of attribution credit. A single session can contain multiple touchpoints if the user arrived through multiple channels:
Events: direct → google_paid → direct → linkedin_paid → direct
│ │ │ │ │
Touchpoints: [direct] [google_paid ───] [linkedin_paid ───]
(direct folded in) (direct folded in)Direct traffic in the middle of a session is treated as continued browsing — it folds into the current touchpoint instead of creating a new one.
Journey
The full path from a user's first touchpoint to a conversion, within the lookback window. A journey can span days, weeks, or months. The dashboard's Top Journeys table shows the most common channel paths your converters take.
Conversion
A revenue-generating event:
- A submission of your designated conversion form in HubSpot (counts as a lead).
- A HubSpot deal moving to closed-won (counts as deal revenue).
- A paid Shopify order (counts as order revenue).
Each conversion triggers attribution: Simmer walks the journey backwards within the lookback window and distributes credit across the touchpoints.
Identity stitching
A "journey" is only useful if Simmer can connect today's anonymous visitor to last month's signup. That's stitching.
- The pixel stores a persistent
simmer_idcookie (1 year, browser-scoped). - When a visitor submits a HubSpot form with the hidden
simmer_idfield, the cookie value is written onto the contact. - When that contact later closes a deal, Simmer pulls every event ever sent with that
simmer_idand reconstructs the journey.
Without simmer_id, conversions still appear but aren't credited to channels.
Channels
Simmer assigns every event to a channel based on its UTM parameters and referrer. About 45 channels are recognized out of the box, grouped roughly as:
- Paid —
google_paid,meta_paid,linkedin_paid,tiktok_paid,bing_paid,youtube_paid,reddit_paid,twitter_paid, etc. - Organic —
google_organic,linkedin_organic,youtube_organic,reddit_organic,github_organic,stackoverflow_organic,producthunt_organic, etc. - AI search —
ai_chatgpt,ai_perplexity,ai_claude,ai_gemini,ai_copilot,ai_other. - Owned —
email,direct,referral,partner_referral,webinar,events.
Channel detection is deterministic: an event with utm_source=google&utm_medium=cpc always becomes google_paid. Direct traffic and traffic from unknown sources fall through to direct or referral.
The attribution model
Simmer is multi-touch and position-based with an engagement modifier. Last-click is not used.
Position weights
For a journey with 2+ attributable touchpoints, conversion revenue is split:
- First touch — 40%
- Last touch — 40%
- Middle touches — 20% (split across all middle touchpoints)
For journeys with a single attributable touchpoint, that touchpoint gets 100% of the credit.
Engagement modifier
Middle-touch credit is then adjusted by how engaged the user was on each touchpoint. Each event contributes a base score; engagement bonuses add on top:
| Signal | Score |
|---|---|
page_view | 1 |
scroll_50 / scroll_100 | 1 / 2 |
| Time on page ≥ 60s | +2 |
| Pricing page view | +3 |
| Demo / case study view | +3 to +5 |
| Form view / submit | +3 / +7 |
| Add to cart / checkout start / complete | +4 / +6 / +8 |
A touchpoint scoring well above the journey's average gets uplifted (up to +200%); one scoring well below gets reduced (down to -90%). The result: pricing and demo pages quietly outweigh shallow blog visits in the middle of a journey, even when both happened.
Lookback window
Default is 180 days. Touchpoints older than the window aren't included. This is configurable per project.
Why position-based and not time-decay
Time-decay over-credits the channels closest to the close, which is essentially last-click in disguise. For B2B journeys that span weeks, the channel that introduced the buyer matters as much as the channel that closed them — which is what 40/40 captures. The engagement modifier handles the in-between.
Privacy
- Emails are hashed server-side using HMAC-SHA256 with a per-project secret. Plaintext emails never reach Simmer's analytics store.
- The pixel stores no personally identifiable information in the browser — only an opaque random ID.
- Tracking is consent-gated. The pixel respects CookieYes, OneTrust, Cookiebot, and Finsweet by default, and stays idle if no consent signal is found.
- Revoking consent immediately deletes the
simmer_idcookie and stops event sending.