Account-level activity rollup
The account-level activity rollup is the same Site Activity signal that powers the per-contact engagement strip, summed across every contact on an account. An account's strip shows the combined daily activity of all of its contacts — plus any anonymous visitor events that have been stitched to those contacts — over the last 30 days. The accounts list also gets a sortable Activity (30d) column driven by the same rollup, so you can sort the page by which accounts have been active lately.
The rollup is automatic. Every account that has at least one contact with tracked Site Activity sees it; there's nothing to configure.
What rolls up
Everything that lands on a contact's engagement strip lands on the parent account's strip too. That means:
- Pageviews, custom events, and identifies from every
type='contact'record linked to the account. - Anonymous visitor events that have been stitched to one of those contacts via
hydra.identify(), chat capture, or the OR-whitelisting logic that ties a known browser to a known person. The anonymous events from before identification still count, because they've been retroactively associated with the contact.
Session-start markers are excluded — same rule as the per-contact strip. The number you see is the total number of substantive events: things the visitor actually did.
If an account has multiple contacts, their daily counts are summed into one daily bar. A day where Vader fired 6 events and Tarkin fired 4 reads as a single bar of 10.
The Engagement Strip on Account detail
Open any account detail page and the engagement strip appears near the top of the right rail, in the same slot the per-contact strip uses on Contact detail. It's the same component, just fed account-mode data.
- 30 daily bars. One bar per day, oldest on the left, today on the right. Empty days render as a flat baseline so the cadence stays readable.
- Color intensity scales with event count. A high-activity day reads darker than a low-activity day.
- Hover any bar for the exact event count and the date.
- Header line shows the 30-day total alongside a
contact_count— how many of the account's contacts contributed events to the strip. An account with 3 contacts and 91 events over the window reads as91 events / 3 contacts.
The strip is read-only — there's nothing to click into beyond the hover tooltip. To drill into a specific contact's activity, open that contact and look at their per-contact strip.
The Activity (30d) column on the accounts list
The accounts list at CRM → Accounts has a sortable Activity (30d) column. Each row shows the 30-day rolled-up event count for that account. Click the column header to sort ascending or descending — most-active accounts first is the usual use case for outreach prioritization.
A few specifics worth knowing:
- Visible-page only. The count is computed for the accounts currently rendered on the page, not the full table. As you paginate, the next page's counts get fetched on demand. This keeps the list fast on tenants with thousands of accounts.
- Sort applies before the count loads. The column shows a placeholder dash for accounts whose count is still in flight; once the batch resolves, the cells fill in. If you sort by Activity (30d) before counts have landed, the sort applies as soon as the data does — you don't need to re-click the header.
- Zero is sortable. Accounts with no tracked activity sort as
0, not as null. Descending puts them at the bottom; ascending puts them at the top.
"N/A — Not linked to site tracking"
When an account has no contacts with tracked activity, the engagement strip shows the same fallback the per-contact strip uses: "N/A — Not linked to site tracking." This happens for two reasons:
- No widget with tracking is installed on the pages those contacts visit, so no events have ever been recorded for them.
- No anonymous visitor has been stitched to any of the account's contacts, so even if the widget is tracking, there's no linkage from the anonymous events to a known record yet.
A brand-new account whose contacts haven't yet been identified will sit in this state. So will an account whose contacts haven't visited a tracked page in any 30-day window before. The fallback isn't a configuration error — it's an honest report that there's no data to roll up.
On the accounts list, the same accounts show 0 in the Activity (30d) column. The list doesn't distinguish "tracked but quiet" from "never tracked at all"; both read as zero. To tell them apart, open the account.
How recompute works
There's no nightly job and no cache to wait on. The engagement strip and the column counts are both computed at request time off the live visitor_events table, scoped to the account's contacts and a trailing 30-day window. Events that landed seconds ago are reflected the next time the page loads.
The window is rolling — "the last 30 days from now," recomputed on each request. There's no calendar-aligned monthly view in this surface; if you need that, the Site Activity dashboard has time-range pills for 24h / 7d / 30d / 90d.
Permissions
- Any teammate who can view an account can see the engagement strip on it and the Activity (30d) column on the list.
- There's nothing to enable or change — visibility tracks the underlying account permission.
Frequently asked questions
Why doesn't the strip appear on an account I know has tracked contacts?
Either the contacts on the account aren't yet linked to a tracked visitor (no hydra.identify() call, no chat capture, no OR-whitelisted browser match), or the widget on the pages they visit doesn't have Site Activity tracking turned on. See Site Activity tracking for both halves of the wiring. The strip falls back to "N/A — Not linked to site tracking" until at least one event lands.
Does anonymous visitor activity count toward the account's total? Only once the anonymous visitor has been stitched to a contact on the account. Pre-stitch anonymous events live in the anonymous pool and don't roll up to any account. Post-stitch, the visitor's full history (including the events from before they were identified) gets retroactively associated with the contact and starts showing up in the account's rollup.
A contact's per-contact strip shows activity, but the account it belongs to shows zero. Why?
Two things can cause this. First, check the contact's account_id — if it's null or pointing at a different account, that contact's activity won't roll up to the account you're looking at. Second, the rollup only includes records where type='contact'. If the activity is on a Lead that's been converted but the conversion didn't carry the events forward, the count won't match. Open the contact and check both fields.
Why is the Activity (30d) column blank for some accounts on the list?
The column loads in batches as you paginate. A blank cell with a placeholder dash means the count is still in flight for that row. If it stays blank after a few seconds, the row's count failed to fetch — refreshing the page usually resolves it. A solid 0 (not blank) is the real "no activity" state.
Can I change the 30-day window? Not on this surface. The engagement strip is fixed at 30 daily bars, and the list column counts the same 30-day window. For other windows, use the Site Activity dashboard — its time-range pills cover 24h, 7d, 30d, and 90d.
Is there a webhook or Slack delivery when an account crosses an activity threshold? Not directly off the rollup. The closest fit is a scheduled flow alert with the subject set to accounts and a threshold condition — it runs once per day and emails when an account drops below (or, with the right framing, climbs above) a given event count.
What happens to the rollup when I delete a contact on the account?
The contact's visitor_events rows cascade with the contact record. The next time the account's strip and column count load, the deleted contact's events are gone from the totals. If you wanted to preserve the data, archive the contact instead of deleting it — archived contacts still contribute to the rollup.
