Simmer Docs

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 ──► conversion

Event

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_id cookie (1 year, browser-scoped).
  • When a visitor submits a HubSpot form with the hidden simmer_id field, the cookie value is written onto the contact.
  • When that contact later closes a deal, Simmer pulls every event ever sent with that simmer_id and 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:

  • Paidgoogle_paid, meta_paid, linkedin_paid, tiktok_paid, bing_paid, youtube_paid, reddit_paid, twitter_paid, etc.
  • Organicgoogle_organic, linkedin_organic, youtube_organic, reddit_organic, github_organic, stackoverflow_organic, producthunt_organic, etc.
  • AI searchai_chatgpt, ai_perplexity, ai_claude, ai_gemini, ai_copilot, ai_other.
  • Ownedemail, 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:

SignalScore
page_view1
scroll_50 / scroll_1001 / 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_id cookie and stops event sending.

On this page