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 participant's first touchpoint to a conversion, within the lookback window. A journey can span days, weeks, or months. A conversion with multiple participants can have multiple journeys, one per attributed participant. The dashboard's Top Journeys table shows the most common channel paths your converters take.

Conversion

A tracked business outcome:

  • A submission of your designated conversion form in HubSpot (counts as a lead).
  • A HubSpot deal moving into a configured sales-qualified stage (counts as a sales qualified lead, count-only — no revenue).
  • 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.

Converted and unconverted journeys

The Journeys page has two modes:

  • Converted shows lead, sales qualified lead, and closed-won deal conversions from HubSpot for the selected date range. Each row includes the best available buyer label: company name first, then contact name, then a stable CRM fallback. When available, the HubSpot contact email is shown under the buyer label. If a lead came from a form-source contact but no browsing history can be linked, it appears as Untracked lead — the path shows No website activity captured and no channel credit is assigned. If any other conversion has no attributed path yet, it appears as Unexplained rather than disappearing from the table. Use the filter chips at the top of the table to view one conversion type at a time.
  • Unconverted activity shows anonymous paths that have not been tied to a conversion yet.

Converted journey revenue is the participant's allocated revenue for that journey. For multi-contact deals, this means the full deal amount may be split across multiple rows.

The date picker uses the viewer's calendar days. Converted mode filters by when the conversion happened; once a conversion is included, its journey explanation can include touchpoints from before the selected range.

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, form-source contacts still appear as Untracked leads in Converted Journeys — they count as website-origin leads but carry no channel credit and no journey path. Contacts created outside a tracked form (imports, API, other integrations) are not recorded as website-origin leads at all.

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