Skip to main content

Signal — Revenue Overlap

Written by Schae Lilley

Revenue Overlap is a read-only analysis view in Signal (Power Digital's internal BI web app) at route /revenue-overlap, visible to Team Lead access and above, in the Finance nav section. It answers: how much client revenue is being managed by employees who sit outside the client's own division — which divisions lend staff, which borrow, and exactly which account–employee pairings cause the crossing. Revenue figures originate in Vena (the finance planning system); team membership ("who is on each account") originates in nova (Power Digital's client-management platform) merged with Signal's own team-assignment records (entered by users in Signal's Manage Leads view). The view writes nothing except invisible page-view telemetry.

Field

Value

Route

/revenue-overlap

Access

Team Lead and above (TeamLeadRoute guard; app_users.is_team_lead flag in Signal's own records, implied for Admin/Gandalf tiers)

Nav section

Finance (section itself is Team-Lead-gated; the sibling "Divisional P&Ls" link is Gandalf-only, so most team leads see Revenue Overlap as the only Finance entry)

Primary data sources

Vena (account revenue, division, department, contract type); nova (team seats, employee home division/department); Signal's own records (team-assignment overrides from Manage Leads, access flags)

Writes

None user-facing. Passive page_view telemetry to Signal's own usage-event records

Key code refs

src/views/RevenueOverlapView.tsx; src/App.tsx (route + nav); src/context/DataContext.tsx (data assembly); src/utils/allocation.ts (revenue splits); src/utils/orgStructure.ts (CLIENT_VERTICAL_DIVISIONS); server/vena-kpi-engine.ts (getAssignmentsData); server/snowflake-only-queries.ts (getSeatAssignmentsQuery); server/index.ts (/api/assignments, /api/assignments/batch, /api/employees, /api/months)

Last verified

staging @ 98df0c4, verified 2026-07-07

Purpose

Power Digital's client book is organized into seven revenue divisions ("client verticals"): B2B, CPG, Consumer Services, Core, Fashion, Healthcare, Lifestyle. Ideally a Fashion client is staffed by Fashion-division people, but in practice teams get borrowed across division lines — a B2B strategist covers a Healthcare account, a Core account director carries a Lifestyle client. Each crossing muddies divisional P&L attribution, hides true division capacity, and creates accountability gaps. The Revenue Overlap view makes that invisible borrowing visible: how big is cross-division staffing overall, is it growing or shrinking over time, which divisions are net lenders versus net borrowers, and exactly which employee-on-account pairings drive it. Leadership uses Revenue Overlap to decide whether to restaff accounts back into their home division, formally credit a lending division, or accept the overlap as deliberate (e.g., a specialist skill that lives in only one division).

Access & visibility

  • Route guard: /revenue-overlap is wrapped in TeamLeadRoute (src/App.tsx). Users without the team-lead flag are redirected to /summary.

  • Where the flag lives: the is_team_lead column of the app_users table in Signal's own records (Supabase). AuthContext reads is_team_lead, is_admin, is_gandalf for the signed-in email; the effective team-lead flag is true if ANY of the three is true (Admin and Gandalf tiers implicitly include Team Lead access). The flag is cached in the browser per email and reconciled against the database in the background.

  • How the flag is granted: two paths. (1) Automatically: on every sign-in the frontend calls POST /api/auth/ensure-provisioned, which creates the user's app_users row if missing and auto-sets is_team_lead = true when the user's email appears as an executive_sponsor (Account Director) or group_director on any active nova client. The auto-grant never downgrades an existing true flag. (2) Manually: a Gandalf-tier user can set the flag in Signal's General Access screen (/users).

  • Nav placement: "Revenue Overlap" appears in the Finance nav section. The Finance section itself is team-lead-gated, and its other link ("Divisional P&Ls") is Gandalf-only — so a plain team lead sees Revenue Overlap as the only Finance item.

  • Deep link: Global Search (available to non-member users) lists Revenue Overlap under the keywords "overlap" / "cross-division", and an employee search result offers a division-overlap link that opens /revenue-overlap?division=<their division> pre-focused on that employee's division.

  • Sign-in domains: Signal login (Google OAuth via Supabase) is restricted to authorized Power Digital and Cardinal email domains.

  • Base-tier ("member") users — signed-in users with no elevated role — cannot reach Revenue Overlap (the TeamLeadRoute redirect applies) and do not see the Finance nav section.

Data sources & lineage

Revenue Overlap makes no API calls of its own — every number is computed in the browser from the app-wide data context (src/context/DataContext.tsx). The lineage below traces each on-screen element of Revenue Overlap to the system where the data originates.

On-screen element

Origin system

Code path

Refresh

Caveat

Account rows: revenue, division, department, contract type (one "account" = client × department × division × contract-type slice)

Vena (finance planning system; writes the FINAL_VENA_CONTRACTS dataset — Signal reads only)

GET /api/assignments / /api/assignments/batch → getAssignmentsData() in server/vena-kpi-engine.ts

Vena's Blueprint Data Load refreshes roughly weekly (per code comment in server/vena-cache.ts); the Signal server caches the result for 4 hours by default (venaCache, 240-min TTL)

VABO department rows are deliberately excluded from Revenue Overlap (revenue-uplift line, not billable revenue)

Who is on each account (the "leads" set — every seated team member, lead and support)

nova (client-management platform; seat history in nova's client_account_assignment_history, users, departments tables)

Same endpoints; seat query getSeatAssignmentsQuery() in server/snowflake-only-queries.ts, matched to revenue rows in TypeScript

Server cache 4 hours; upstream replication cadence from nova is not defined in the app repo

AM/AD/PM-role seats match every department on their client; Group/Managing Directors are stripped from Consulting seats unless deliberately assigned in Manage Leads (stripLeadershipFromConsultingLeads)

Manual team overrides (a client whose team was edited in Signal's Manage Leads view)

Signal's own records (entered by users in Signal; team_assignments + managed_clients)

Fetched by DataContext, merged over the nova-detected team via buildManageLeadsDisplayAccounts; a Render-disk backup (GET /api/assignments/backup/:month) is the outage fallback

Read on page load / month change

A saved team always wins over the nova-detected team, so Manage Leads edits are reflected in Revenue Overlap

Each employee's home division and department (the matrix row axis)

nova (each user's primary division and department in nova's users/divisions/departments tables)

GET /api/employees in server/index.ts

Server cache 1 hour (explicit TTL on this endpoint)

Home division is read as of now — a person who transferred divisions retroactively recolors their past months in the trend charts

Month list driving the trend charts and Month Selector

Vena (distinct months present in FINAL_VENA_CONTRACTS)

GET /api/months → computeMonths() in server/vena-kpi-engine.ts

Server cache 4 hours

Capped at the current calendar month — forward-scheduled contract months are excluded

Trend charts (three time-series)

Same Vena + nova + Signal-records mix as above, for all historical months

Background "history preload" into accountsByMonth in DataContext; charts render only after isHistoryLoaded and only when more than one month has data

Loaded once per session in the background; a mid-session department-mapping heal can wipe and rebuild the history

Charts can be absent briefly after page load, or disappear/re-render mid-session during a mapping heal

Per-employee "allocated revenue" figures (KPI cards, matrix cells, detail table)

Derived in the browser — account revenue × a fixed split by team size

getEmployeeAllocation() in src/utils/allocation.ts, called from RevenueOverlapView.tsx

Recomputed on render

Role-blind legacy split (see Metrics & definitions); ignores the revenue-split overrides that other Signal views honor

The seven divisions on both matrix axes

Hardcoded frontend list mirroring nova divisions

CLIENT_VERTICAL_DIVISIONS in src/utils/orgStructure.ts

Code constant as of Jul 2026

G&A and Shared Services are excluded from both axes by design; a divisional reorg requires a code change

Page-view telemetry (invisible)

Signal's own records (write)

usePageViewTracking() in src/hooks/useUsageTracking.ts → logUsageEvent() → signal_usage_events

On every route change

Feeds Signal's Analytics/adoption view; module name revenue-overlap

Scope filters baked into every number on Revenue Overlap: only active accounts, with revenue > 0, in the seven client-vertical divisions; VABO department rows excluded; employees whose home division is not one of the seven verticals (e.g. Shared Services staff) are excluded from the matrix entirely.

Month sensitivity: the KPI cards, matrix, and detail table reflect the months chosen in the app-wide Month Selector — revenue is summed across the selected months (pick 3 months and dollars are roughly 3× a single month). The three trend charts always show the full history regardless of the month selection.

Not included: client-level Account Director / Senior Account Director assignments made via the header chips in Manage Leads (stored in Signal's own records and, since July 2026, synced live with nova) are injected into a separate accountsWithADs collection in DataContext — Revenue Overlap consumes the base accounts collection, so those chip-level AD/Sr. AD assignments are NOT counted in Revenue Overlap's crossing numbers.

Metrics & definitions

All metrics on Revenue Overlap are computed in the browser in src/views/RevenueOverlapView.tsx. "Allocated revenue" is the building block for every dollar figure.

  • Allocated revenue (per employee, per account) — the employee's share of the account's revenue for the selected months, using a fixed order-based split by team size from src/utils/allocation.ts: 1 person = 100%; 2 people = 60/40; 3 people = 50/30/20; 4+ people = 30/30/20/20 (positions 4+ share the last 20% evenly). Revenue Overlap uses the role-blind legacy path (every teammate treated as the same role), so these are the "other departments" defaults; the role-aware consulting splits (50/35/15 etc.) that exist in the same file are NOT used here. The percentages are marked in code as placeholders "for John to finalize" (code constants as of Jul 2026). This view also does NOT apply the per-client revenue-split overrides stored in Signal's own records (revenue_split_overrides) that some other Signal views honor. Origin: Vena revenue × in-browser formula. Treat as directional, not payroll-grade.

  • Cross-Division Revenue (all-divisions KPI card) — sum of allocated revenue for every employee-account pairing where the employee's home division (from nova) differs from the account's division (from Vena), across the selected months. Diagonal (own-division) work is excluded.

  • Accounts Affected (KPI card) — count of distinct accounts that have at least one cross-division person on their team.

  • Employees Crossing (KPI card) — count of distinct employees managing at least one account outside their home division. Includes support seats, not just formal leads — the underlying "leads" set is every seated team member.

  • Outbound Revenue (focus-mode KPI card) — allocated revenue of the focused division's employees on other divisions' accounts ("we lend").

  • Inbound Revenue (focus-mode KPI card) — allocated revenue of other divisions' employees on the focused division's accounts ("we borrow").

  • Net (Out − In) (focus-mode KPI card) — Outbound minus Inbound; green/positive means the division lends more than it borrows, red/negative the reverse.

  • Revenue Overlap Over Time (stacked area chart) — each month's total allocated revenue split into Within Division (green) vs Cross Division (orange). Full history, independent of month selection.

  • Overlap Rate Trend / Overlap % (dual-axis line chart) — orange line: cross-division allocated revenue ÷ total allocated revenue per month, as a percentage (rounded to 0.1); dashed purple line: count of cross-division accounts per month. No target or alert threshold is encoded — the view surfaces the rate only.

  • Cross-Division Revenue by Division (stacked area chart) — cross-division allocated revenue per month attributed to the employees' home division, one color per division. When a division is focused, becomes "{Division} — Cross-Division Breakdown" showing where that division's people lend time.

  • Division Overlap radar (focus mode only) — one spoke per other division; purple = outbound, teal = inbound dollars against that division.

  • Cross-Division Staffing Matrix — 7×7 heat table; rows = employee's home division, columns = account's division; each cell shows allocated revenue (hover shows account count). Diagonal cells (own-division work) are displayed but excluded from all row/column/grand totals — totals are cross-division only. Off-diagonal cells shade orange with intensity proportional to dollars.

  • Cross-Division Assignments (detail table) — one row per employee-account crossing: Account, Account Division, Employee, Employee Dept, Employee Division, Allocated Revenue, sorted largest-first. Respects both the Focus Division and Department filters.

How it's used

  1. Monthly org health check. Open Revenue Overlap with no filters; read the three KPI cards, then the Overlap Rate Trend. Decision: is cross-division staffing at an acceptable level and trending down, or does it warrant a staffing review this cycle?

  2. Division leader's lend/borrow review. Set Focus Division to your division; read Outbound vs Inbound and the Net card. A heavy net lender has a case for headcount credit or pulling people back; a heavy borrower has a hiring-gap signal. The radar chart shows which specific divisions to have that conversation with.

  3. Restaffing a misaligned account. In the Cross-Division Staffing Matrix, spot the hottest off-diagonal cell (e.g. Core staff on Fashion accounts), then scan the Cross-Division Assignments table for the largest-dollar rows in that pairing. Decision: transition the account to a home-division team member (executed in Signal's Manage Leads view, not here) or accept and document the exception.

  4. Checking a specific job function. Set the Department filter (e.g. Consulting, Paid Media) to see whether crossing is concentrated in one job family — a common pattern when one division's account directors carry legacy clients. Decision: rebalance that department's book specifically.

  5. Investigating a person from Global Search. Search an employee in Signal's Global Search and click their division-overlap link; Revenue Overlap opens focused on that employee's division so their crossing appears in the context of the division's overall lend/borrow position.

  6. Measuring a reorg. After clients or people are re-divisioned (in nova) or teams reassigned (in Manage Leads), watch the Overlap Rate Trend over the following months to confirm the overlap percentage actually drops — a natural before/after KPI.

What users can change here

Nothing — Revenue Overlap is a read-only analysis view. The two filter dropdowns (Focus Division, Department) only change what is displayed; they do not persist to the URL — incoming ?division= / ?department= URL parameters are consumed on arrival and then cleared, so a copied link will not carry the filters.

The only write is invisible: a page_view usage event (module revenue-overlap) logged to Signal's own usage-event records (signal_usage_events) on route entry, which feeds Signal's Analytics/adoption reporting.

To act on what Revenue Overlap reveals, users go elsewhere: team membership changes in Signal's Manage Leads view (/leads, saved to Signal's own team_assignments records); client division ownership and employee home divisions change in nova.

Caveats & data quality

  • Allocation percentages are acknowledged placeholders. The per-employee revenue splits (100 / 60-40 / 50-30-20 / 30-30-20-20 by team size) are code constants as of Jul 2026, marked in src/utils/allocation.ts as "placeholders for John to finalize". Revenue Overlap uses the role-blind legacy path — every teammate is treated identically and seniority-order decides who gets the lead share — and it ignores the per-client revenue-split overrides (revenue_split_overrides in Signal's own records) that other Signal views apply. Dollar figures on Revenue Overlap are directional weightings, not exact revenue credit, and may differ from per-employee revenue shown in views that use role-aware splits or overrides.

  • The seven divisions are hardcoded (CLIENT_VERTICAL_DIVISIONS in src/utils/orgStructure.ts, plus per-division colors and abbreviations in the view file). A divisional reorg requires a code change. G&A and Shared Services are excluded by design.

  • Client-level AD/Sr. AD chip assignments are not counted. Account Director / Senior Account Director assignments made via the header chips in Manage Leads land in a separate data collection (accountsWithADs) that Revenue Overlap does not consume — only the seat-level team (nova seats merged with Manage Leads team saves) counts toward crossing numbers.

  • Group/Managing Directors are stripped from Consulting teams unless deliberately assigned via a Manage Leads team save (stripLeadershipFromConsultingLeads in src/utils/leadershipRoles.ts), so leadership-only oversight seats do not inflate crossing counts.

  • "Employees Crossing" includes support staff, not just formal leads — the underlying set is every seated team member on the account.

  • Numbers scale with the month selection. KPI cards, matrix, and detail table sum revenue across whichever months are selected in the app-wide Month Selector; two users with different selections see different magnitudes. The trend charts are selection-independent.

  • Employee division vs. account timing skew. An employee's home division is read as of now (current nova roster) while account revenue is historical, so a person who transferred divisions retroactively recolors their past months in the trend charts.

  • Trend charts load late and can rebuild mid-session. They wait for a background multi-month history fetch (isHistoryLoaded), are hidden entirely when fewer than two months have data, and a mid-session department-mapping heal (added in the July 2026 loading-hardening work) can wipe and rebuild the month history, briefly removing the charts.

  • No target threshold. The Overlap % has no encoded "healthy" level, target, or alert. Whether leadership has a business-accepted target is not defined in the app repo.

  • Server caches: Vena revenue and nova seat data are cached server-side for 4 hours by default; the employee roster for 1 hour. Vena itself refreshes roughly weekly (Blueprint Data Load, per code comment). Freshness of nova data replication into Signal's read path is not defined in the app repo.

  • Whether cross-division staffing is ever settled financially (inter-division credit) is not defined in the app repo — the view is informational.

Related views

  • Manage Leads (/leads, Team Lead+): where team membership is actually changed. Saved teams (Signal's own team_assignments records) override the nova-detected team everywhere, including Revenue Overlap — a restaffing done in Manage Leads shows up here on next load.

  • Divisional P&Ls (/divisional-pl, Gandalf-only, same Finance nav section): Revenue Overlap explains one reason a division's P&L and its people's actual workload diverge.

  • Summary, Employees, Analytics: share the same accounts/employees data foundation in DataContext, so revenue reconciles with those views by construction (before allocation splits are applied).

  • Global Search: deep-links into Revenue Overlap per employee division (/revenue-overlap?division=...).

  • Analytics (/analytics): consumes the page_view usage events Revenue Overlap emits.

  • nova (upstream platform, outside Signal): employee home divisions and client seat assignments originate there; changing them changes Revenue Overlap.

FAQ

Q: Who can see the Revenue Overlap page in Signal? A: Team Lead access and above. The route /revenue-overlap is guarded by TeamLeadRoute; the flag is is_team_lead on your app_users row in Signal's own records, and Admin/Gandalf tiers get it implicitly. Account Directors and Group Directors on nova clients are auto-granted Team Lead access on sign-in. If you believe you should have access, ask a Signal admin (Gandalf tier) to update your role in the General Access screen.

Q: Why doesn't the revenue on Revenue Overlap match Vena or the Summary view? A: Three reasons. (1) Revenue Overlap shows allocated revenue — each account's revenue is split among its team members by a fixed team-size formula (100 / 60-40 / 50-30-20 / 30-30-20-20), so per-employee dollars are fractions of account totals. (2) It sums across whichever months are selected in the Month Selector. (3) It excludes VABO rows, inactive accounts, zero-revenue accounts, and anything outside the seven client-vertical divisions. The underlying account revenue itself originates in Vena and reconciles with other Signal views before splitting.

Q: What does "Cross-Division Revenue" mean exactly? A: The sum of every employee's allocated share of account revenue where the employee's home division (from nova) is different from the account's division (from Vena), over the selected months. Work people do inside their own division is excluded from this number.

Q: Why is an employee showing as "crossing" when they're just a support person on the account? A: By design — Revenue Overlap counts every seated team member on an account (lead and support seats alike, as detected from nova assignments or saved in Manage Leads). "Employees Crossing" is therefore anyone with any seat on an account outside their home division.

Q: We reassigned a client's team in Manage Leads — when will Revenue Overlap reflect it? A: On the next page load. Teams saved in Manage Leads are stored in Signal's own records and always override the nova-detected team in Revenue Overlap. If it still looks stale, note the backend also caches nova seat and Vena revenue data for up to 4 hours.

Q: Why doesn't the Account Director I assigned with the AD chip in Manage Leads appear in Revenue Overlap? A: Client-level AD / Senior AD chip assignments are held in a separate data collection (accountsWithADs) that Revenue Overlap does not read — the view only counts seat-level team members (nova seats plus Manage Leads team saves). This is current behavior as of July 2026, not a data error.

Q: Are the revenue split percentages (60/40 etc.) official? A: No. They are code constants marked as placeholders ("for John to finalize") in src/utils/allocation.ts. Revenue Overlap also uses the role-blind version of the split and ignores per-client percentage overrides, so treat its dollar figures as directional weightings for comparing divisions, not as exact revenue credit.

Q: What is a healthy Overlap % — is there a target? A: No target, threshold, or alert is encoded in Signal — the Overlap Rate Trend chart surfaces the percentage only. Whether leadership has an agreed acceptable level is not defined in the app repo.

Q: Why are the trend charts missing when I open Revenue Overlap? A: The three trend charts wait for a background load of all historical months, which takes a few seconds after page load; they are also hidden entirely when fewer than two months have data, and can briefly disappear mid-session if the app heals its department mapping and rebuilds the history. The KPI cards, matrix, and detail table appear immediately.

Q: I opened a link like /revenue-overlap?division=Fashion but when I copied the URL the filter was gone. Why? A: The ?division= and ?department= URL parameters are consumed once on arrival to pre-set the filters, then immediately cleared from the URL. Copied links will not carry filters — tell the recipient which Focus Division / Department to select.

Q: An employee moved divisions — why did their history change color in the charts? A: Revenue Overlap reads each employee's home division as of now (the current nova roster) and applies it to all historical months. A division transfer therefore retroactively re-attributes that person's past allocated revenue to their new division in the trend charts.

Did this answer your question?