# How SourceLoop defines a session

When SourceLoop starts a new session, when it ends one, and how that affects every per-visit metric on every dashboard. Plus the differences from Google Analytics 4.

Source: https://sourceloop.ai/help/session-definition/
Updated: 2026-05-29

---

A **session** in SourceLoop is one continuous visit, a single bounded period during which a visitor interacts with your site. Every metric on the Traffic dashboard expressed "per session" (session count, pages per session, session duration, bounce rate) depends on this definition. Per-channel and per-campaign attribution at the session level is what powers the marketing-source story.

This article covers exactly when SourceLoop starts a new session, when it ends one, and how those decisions feed into your dashboards.

## What starts a new session

Four triggers can start a new session for an existing visitor:

| Trigger | Example |
|---|---|
| **First page view ever** | A new visitor lands on your site for the first time. |
| **30+ minutes of inactivity** | The visitor was browsing, walked away from their computer, came back 45 minutes later. New session. |
| **Attribution change** | The visitor arrives with a new `utm_source` / `utm_medium` / `utm_campaign`, a new paid click ID, or a referring domain that maps to a different channel. New session. |
| **Midnight (workspace timezone)** | A visitor browsing at 11:50 PM keeps browsing until 12:10 AM. Two sessions, one ending at midnight, one starting. |

These triggers are checked on every page view and every custom event.

## What does NOT start a new session

| Non-trigger | Why it doesn't fire a new session |
|---|---|
| **Tab switch** | The 30-minute timer tracks tracker activity (page views, custom events, scroll pings), not tab visibility. A visitor with your tab open in the background isn't "active" but isn't "inactive" either; the timer doesn't tick unless they switch back and resume. |
| **Browser refresh** | Same anonymous ID, same session, same attribution. The refresh just emits another page-view event in the same session. |
| **Internal navigation** | Clicking from `/pricing` to `/docs` to `/contact` is one session, regardless of how many page views. |
| **Cross-subdomain navigation** | `yoursite.com` → `app.yoursite.com` is the same session (cookies are shared on the same eTLD+1). |
| **Cross-domain navigation with the linker** | `yoursite.com` → `yoursite-checkout.com` with the cross-domain linker configured is the same session (the anonymous ID is passed via URL). |

## How attribution attaches to a session

Each session has exactly one set of attribution fields:

| Field | Set from |
|---|---|
| Channel | The classification rules (see [Channel definitions](/help/channel-definitions/)) |
| Source | `utm_source` parameter, or platform inferred from click ID, or referring domain |
| Medium | `utm_medium` parameter, or `cpc/cpm/organic` inferred from click ID, or `organic`/`referral` inferred from referrer |
| Campaign | `utm_campaign` parameter |
| Content | `utm_content` parameter |
| Term | `utm_term` parameter |
| Landing page | The URL of the first page view in this session |
| Referrer | `document.referrer` at session start |
| Click IDs | `gclid`, `fbclid`, `msclkid`, etc., from the URL on session start |

Once a session starts, these values stay frozen for its duration. The visitor navigating internally on your site doesn't change them. This is why the attribution-change trigger above is so important, it ensures each session has exactly one truthful set of attribution.

## Sessions roll up into the visitor and the contact

```
1 contact (1 real person)
  → N anonymous IDs (1 per device/browser they've used)
    → N sessions per anonymous ID (1 per visit)
      → N page views per session (1 per page they viewed)
      → N events per session (custom events, scroll pings, conversion events)
```

The Traffic dashboard's "Sessions" metric counts the sessions inside the date range. The "Visitors" metric counts unique anonymous IDs. The "Contacts" metric counts identified contacts (with an email or phone).

A single high-engagement contact who browsed your site five separate times across two weeks contributes:
- 1 contact
- 1 anonymous ID (assuming same browser each time)
- 5 sessions
- 25-or-so page views (assuming 5 pages per session)

## Session-level vs visitor-level metrics

Most dashboards offer both:

| Metric | Session-level | Visitor-level |
|---|---|---|
| **Count** | Number of sessions | Number of unique anonymous IDs |
| **Conversion rate** | Conversions ÷ sessions | Conversions ÷ visitors |
| **Bounce rate** | Sessions with 1 page view ÷ all sessions | Visitors who only bounced ÷ all visitors |
| **Pages per session** | Total page views ÷ session count | Total page views ÷ visitor count |
| **Duration** | Time from first to last event in a session | Sum of all sessions per visitor |

For attribution work, session-level metrics are usually more meaningful. Visitor-level metrics make sense for "how engaged is my audience over time?" but session-level metrics answer "did this specific campaign produce engaged visits?".

## How session resets affect attribution

The attribution-change trigger is the one with the biggest implication. Consider:

1. **9:00 AM** — Jane arrives via a Google Ads click. Session 1 begins with first-touch channel = Paid Search.
2. **10:00 AM** — Jane leaves your site without converting.
3. **10:25 AM** — Jane sees a LinkedIn ad in her feed and clicks it. She returns to your site. **30 minutes haven't elapsed, but the click ID and referrer have changed, so SourceLoop starts a new session.** Session 2 begins with channel = Paid Social.
4. **10:45 AM** — Jane submits the demo form during Session 2.

The conversion is attributed:
- **First-touch** = Paid Search (Session 1's channel — the earliest session in Jane's identity graph)
- **Last-touch** = Paid Social (Session 2's channel — the converting session)

Both touches are visible on the lead, and you can group revenue / leads by either model on the [Attribution dashboard](/help/types-of-attribution-models/).

If SourceLoop hadn't reset the session on the attribution change, Session 1 would still be active when the form fired, and the conversion would attribute entirely to Paid Search, hiding the role LinkedIn played in closing the deal.

## What's next

- **Understand how channels are picked on each session:** [How SourceLoop classifies marketing channels](/help/channel-definitions/).
- **See sessions per visitor on the Contacts Hub:** [How to use the SourceLoop Contacts (Leads) table](/help/contacts-leads-table/).
- **See session-level metrics on the dashboards:** [Traffic dashboard](/help/traffic-dashboard/).
- **Pick the attribution model that scopes how sessions roll up:** [7 Types of Attribution Models](/help/types-of-attribution-models/).

## Frequently Asked Questions

### When does SourceLoop start a new session?

Four triggers. (1) The visitor's first page view, ever. (2) The visitor returns after more than 30 minutes of inactivity. (3) The visitor arrives with a different attribution signal than their last session, a fresh utm_source / utm_medium / click ID, or a new referring domain that resolves to a different channel. (4) Midnight in the workspace's timezone (sessions don't span calendar days for cleaner daily reporting).

### Why don't sessions span midnight?

Daily reports get muddled when one session straddles two days. By starting a new session at midnight, the visitor's sessions-per-day count stays accurate and the Traffic dashboard's day-over-day comparisons are clean. The trade-off is a visitor browsing from 11:50 PM to 12:10 AM appears as two sessions, but the impact is small (most visitors don't browse over midnight).

### How is this different from Google Analytics 4?

GA4 also uses a 30-minute idle timeout but doesn't reset on attribution change or midnight by default. So a GA4 session can span a UTM change and span midnight, which makes campaign-level attribution and day-over-day reports harder to read. SourceLoop's stricter session boundaries mean per-session metrics are more meaningful for attribution work.

### Does a session reset if the visitor clicks a different ad?

Yes. If a visitor arrives via Paid Search, leaves, comes back via Paid Social later that hour, SourceLoop starts a new session for the Paid Social arrival. This is so each session has exactly one channel / source / campaign attribution, which makes the Traffic dashboard's per-session counts directly meaningful.

### How long is the typical session?

Most B2B sites see median session durations of 1 to 3 minutes and median pageviews per session of 2 to 4. Highly engaged visitors (research-mode prospects browsing pricing + docs + case studies) routinely produce sessions of 10 to 20 minutes. The Traffic dashboard's session-duration metric tracks the median across all sessions in the date range.

### Does a tab switch end a session?

No. The 30-minute idle timer is based on tracker activity (pageviews, custom events, scroll-depth pings), not tab visibility. A visitor with your site open in a tab who switches to email and comes back 20 minutes later is still in the same session. The timer only resets to zero when the tracker sees activity.
