Collaboration analytics explains how a product becomes valuable to a group rather than only to one active user. It connects invitation and membership state with shared workflows, role participation, account activation, expansion, and retention.
GraphJSON does not create account membership or seat state from events. Keep workspace membership, roles, licenses, and permissions authoritative in the application database. Send bounded transitions and completed collaborative actions for analysis.
This recipe extends B2B SaaS product analytics and Account analytics and customer 360.
Define the account and membership grains#
Separate:
- account or organization
- workspace or project
- membership
- invitation
- user
- licensed seat
- collaborative object
One user may belong to several accounts and hold different roles in each. Role is a membership property, not a permanent user property.
{
"event": "account_membership_started",
"membership_id": "mem_91",
"account_id": "acct_7",
"workspace_id": "ws_12",
"user_id": "usr_42",
"role": "analyst",
"seat_type": "paid",
"effective_at": "2026-07-25T18:20:00Z",
"membership_version": 3
}
Use transitions or snapshots when roles and seats change. Do not group historical behavior by a user’s current role unless the chart says so.
Instrument the invitation lifecycle#
{
"event": "collaboration_invitation_created",
"invitation_id": "inv_81",
"account_id": "acct_7",
"workspace_id": "ws_12",
"inviter_user_id": "usr_11",
"invited_role": "analyst",
"invitation_channel": "email",
"invitation_policy_version": 2
}
Then emit:
- delivery accepted by the provider
- invitation opened, if measured honestly
- invitation accepted
- membership created
- invitation expired, revoked, or declined
Do not send the invitee email address, token, or message body. A provider open is an imperfect signal; scanners and privacy controls can create false opens.
An accepted invitation is not collaborative value. Continue the journey to the first meaningful action.
Define collaborative value#
Examples:
- one member creates an object and another reviews it
- a report is shared and viewed by another role
- an administrator configures a source and an analyst uses it
- a teammate comments and the owner resolves the comment
- two distinct members complete complementary workflow steps
Emit completed facts:
{
"event": "collaborative_workflow_completed",
"workflow_id": "flow_61",
"account_id": "acct_7",
"workspace_id": "ws_12",
"object_type": "report",
"object_id": "rpt_44",
"workflow": "created_reviewed_shared",
"distinct_participants": 3,
"participant_role_set": ["admin", "analyst", "viewer"],
"workflow_version": 2
}
Prefer the terminal fact over rebuilding sensitive content interactions from comments or document bodies.
Measure the invitation funnel#
WITH invitations AS (
SELECT
JSONExtractString(json, 'invitation_id') AS invitation_id,
argMin(JSONExtractString(json, 'account_id'), timestamp) AS account_id,
min(toDateTime(timestamp)) AS invited_at
FROM collaboration_events
WHERE JSONExtractString(json, 'event') = 'collaboration_invitation_created'
GROUP BY invitation_id
),
accepted AS (
SELECT
JSONExtractString(json, 'invitation_id') AS invitation_id,
min(toDateTime(timestamp)) AS accepted_at
FROM collaboration_events
WHERE JSONExtractString(json, 'event') = 'collaboration_invitation_accepted'
GROUP BY invitation_id
),
first_value AS (
SELECT
JSONExtractString(json, 'invitation_id') AS invitation_id,
min(toDateTime(timestamp)) AS first_value_at
FROM collaboration_events
WHERE JSONExtractString(json, 'event') = 'invited_member_value_completed'
GROUP BY invitation_id
)
SELECT
toStartOfWeek(invitations.invited_at, 1, 'UTC') AS invite_week,
count() AS mature_invitations,
countIf(
accepted.accepted_at >= invitations.invited_at
AND accepted.accepted_at < invitations.invited_at + INTERVAL 14 DAY
) AS accepted_invitations,
countIf(
first_value.first_value_at >= invitations.invited_at
AND first_value.first_value_at < invitations.invited_at + INTERVAL 28 DAY
) AS value_invitations,
accepted_invitations / nullIf(mature_invitations, 0) AS acceptance_rate,
value_invitations / nullIf(mature_invitations, 0) AS invited_value_rate
FROM invitations
LEFT JOIN accepted USING invitation_id
LEFT JOIN first_value USING invitation_id
WHERE invitations.invited_at < now() - INTERVAL 28 DAY
GROUP BY invite_week
ORDER BY invite_week
Choose windows that match the product. Report expired, revoked, bounced, and duplicate invitations separately.
Measure seats and participation correctly#
Distinguish:
- contracted seats
- assigned seats
- memberships
- eligible members
- active members
- collaborating members
Publish a point-in-time seat snapshot from the entitlement authority:
{
"event": "account_seat_snapshot",
"account_id": "acct_7",
"snapshot_at": "2026-07-26T00:00:00Z",
"contracted_seats": 25,
"assigned_seats": 18,
"active_members_28d": 14,
"seat_type": "paid",
"definition_version": 2
}
Do not sum daily seat snapshots. Use the latest snapshot for a stock or average the intended point-in-time values for a period.
Seat utilization is not product value. A fully assigned account can still have weak adoption, and an account may receive strong value with a small licensed team.
Define multi-user activation#
Account activation may require:
core outcome completed
AND at least 2 distinct active members
AND at least 2 required roles represented
WITHIN 30 days of account creation
Keep the qualifying event and member IDs available for audit, but emit a versioned account-level activation decision for broad reuse.
Avoid setting a universal member threshold. A small business and an enterprise department have different expected team shapes.
Measure collaboration depth#
Useful measures include:
- active members per active account
- share of active accounts with two or more participants
- distinct roles participating
- collaborative objects per active account
- median time from invite to first value
- creator-to-viewer or creator-to-reviewer completion
- concentration of activity among the top member
- accounts dependent on one champion
Show distributions. An average of five active members can describe every account having five, or a few large accounts hiding many single-user accounts.
Evaluate network effects carefully#
Accounts with more members often retain better, but larger and healthier accounts also invite more people. Collaboration can be a consequence of success rather than its cause.
Compare:
- accounts of similar size, plan, age, and acquisition motion
- collaboration achieved before the outcome window
- mature acquisition cohorts
- invited accounts from controlled product experiments, when available
Call an observational result an association. Use Behavioral driver and outcome analysis for the full method once that guide is introduced in this release.
Protect permissions and privacy#
Do not log:
- invitation tokens
- email addresses
- private object titles or bodies
- comments or document content
- access-control lists
- sensitive role names when a broader category works
A shared-object view must be emitted after authorization. Analytics must not become evidence that an unauthorized user should have access.
Build the collaboration dashboard#
Show:
- accounts creating invitations
- delivery, acceptance, and invited-member value rates
- time from invitation to first value
- assigned, active, and collaborating members
- participation by event-time role
- multi-user activation
- collaborative workflow completion
- single-champion dependency
- retention and expansion by prior collaboration depth
- membership and event freshness
Normalize invitation and collaboration counts by eligible active accounts when comparing segments.
Launch checklist#
- Account, workspace, user, membership, invitation, and seat are distinct.
- Membership roles and seats come from the application authority.
- Invitation tokens, addresses, and message bodies are excluded.
- Acceptance is separated from first collaborative value.
- Multi-user activation has one governed definition.
- Seat stocks are snapshots and are never summed across time.
- Role segmentation uses event-time membership.
- Collaboration distributions expose single-champion accounts.
- Retention comparisons control for size, age, and plan.
- Shared actions are logged only after application authorization.
When an invitation acquires a new customer or participant rather than adding a member to the same account, use Referral and product-led growth-loop analytics.