Magidoc

CrmUpsellCandidate
Object

A workspace ranked as a candidate for AI proofing upsell, based on cognition-substrate signals. Scoring rewards workspaces where multiple team members are actively annotating (a product fit for AI-assisted review) and is reported alongside the raw counts so operators can sanity-check each row.

Fields

#

workspaceExternalId

ID !
Non-null

Canonical Hive workspaceId the events are scoped to.

accountId

Hive HQ CRM Account _id linked to this row. Resolved first by Account.linkedOrganizationId (preferred, covers multi-workspace customers) then by Account.linkedWorkspaceId. Null when the workspace is not yet tracked as a CRM account (true prospect).

companyName

Human-friendly company name for the row — the top line in the UI. Precedence: CRM Account.name → organization name from ClickHouse identity projection → workspace.name from ClickHouse → Mongo workspace fallback → null.

companyDomain

Primary domain for the linked CRM Account, used to fetch a company logo in the UI. Null when the row has no CRM Account or the account has no domain set.

workspaceName

Human-friendly workspace name — the subline in the UI, representing the specific brand/team workspace the activity came from (e.g. 'CDM New York' under Omnicom). Sourced from the ClickHouse identity projection's workspaceName column, populated by Atlas triggers. Null when identity backfill hasn't populated this workspace yet.

annotations

Non-null

Proofing annotations created in the lookback window.

distinctAnnotators

Non-null

Distinct users who created annotations in the window (team adoption signal).

approvalRequests

Non-null

Approval requests initiated in the window.

filesApproved

Non-null

Proofing files approved in the window.

proofingSavingsUsd

Non-null

Estimated USD saved by running AI proofing over this window instead of paying a human proofreader. Computed as annotations × minutesPerAnnotation × (hourlyRate / 60) with defensible defaults for the pharma/ad-agency proofing space (see cognition resolver constants). Intended as a directional "this is what we're selling against" number for CSMs — it's intentionally conservative and not a binding quote.

score

Non-null

Composite rank score: annotations + 10 * distinctAnnotators.

lastActivityAt

Non-null

Most recent proofing event timestamp in the window.

trend

[Int !]!
Non-null

Daily annotation counts across the lookback window, oldest → newest. Length equals lookbackDays, zero-filled for inactive days. Intended for inline sparklines.