Skip to main content

Signal — My Submissions

Written by Schae Lilley

My Submissions (route /pulse/my-submissions, header title "My Pulse Submissions") is the personal audit trail inside Signal's Client Pulse section. It lists every Client Pulse submission the logged-in user has ever made — weekly client pulses and quarterly business plan (QBP) records — including voided (soft-deleted) entries. It is visible to Team Lead tier and above (typically Account Directors and Group Directors) and answers the questions "Did I already submit for this client?" and "Did my void/correction go through?". The submission rows are Signal's own records (entered by users in Signal via the Submit Pulse Data screen); the user's identity is resolved through Nova (Power Digital's internal platform) user directory; client display names come from Vena-derived client/revenue records. The page is read-only — clicking a row deep-links to the Submit Pulse Data screen for that client.

Field

Value

Route

/pulse/my-submissions

Access

Team Lead and above (TeamLeadRoute guard; admins and Gandalf-tier implicitly qualify)

Nav section

"Client Pulse" (section itself is teamLeadOnly; siblings: Submit Pulse Data, Pulse Summary — Pulse Summary link is admin-only)

Primary data sources

Signal's own records (pulse submission tables pulse_weekly_submissions, pulse_qbp_submissions); Nova user directory (identity + employee names); Vena-derived client records (client display names)

Writes

None — read-only view

Key code refs

src/views/MySubmissionsView.tsx; getMyPulseSubmissions() in src/services/supabase.ts; GET /api/pulse/my-submissions and resolvePulseCallerEmpId() in server/index.ts; route + nav in src/App.tsx

Last verified

staging @ 98df0c4, verified 2026-07-07

Purpose

My Submissions (/pulse/my-submissions) exists so that each Account Director (AD) or Group Director (GD) can self-audit their own Client Pulse history without asking support or leadership. Client Pulse replaced the old Pulse Google Sheet: ADs and GDs record a weekly read on each client (sentiment, pacing to goal, contract terms) and a quarterly QBP record directly in Signal. Once someone submits for several clients across many weeks, two questions recur: "Did I already submit for this client this week?" and "What did I say last time / did my void (retraction) actually land?" My Submissions answers both. It shows strictly the logged-in user's own rows — a Group Director does not see their team's submissions here, only their own. Portfolio-wide rollups live in Pulse Summary (/predictions/pulse-summary, admin-only), not here.

Access & visibility

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

  • The flag: TeamLeadRoute checks isTeamLead from AuthContext (src/context/AuthContext.tsx). Effective team-lead status is is_team_lead OR is_admin OR is_gandalf, read from the app_users table in Signal's own records (Supabase) by email.

  • How the flag is granted: on every sign-in the frontend calls POST /api/auth/ensure-provisioned (server/index.ts). That endpoint creates the user's app_users row if missing and auto-sets is_team_lead = true when the user's email appears as a client's executive sponsor (Account Director) or group director in Nova (Power Digital's internal platform; the server reads the Nova clients/users directory, cached 1 hour). The flag is never auto-downgraded from true to false. It can also be set manually by a Signal admin in the app_users table.

  • Nav visibility: the "Client Pulse" nav section in src/App.tsx is teamLeadOnly: true. Within it, "Submit Pulse Data" and "My Submissions" are visible to all team leads; the third link, "Pulse Summary", is adminOnly — most Team Lead viewers see only two items in the Client Pulse section.

  • Base tier: Signal also has a base "member" tier (no elevated role) that is redirected away from most views; My Submissions is unreachable for members via the TeamLeadRoute gate.

  • Hard dependency on Nova identity: even with route access, the page returns an error ("Your account is not linked to a Nova user. Contact #signal-support.") if the login email is not found in Nova's user directory — see Caveats.

Data sources & lineage

All rows on My Submissions were created through the Submit Pulse Data screen (/pulse/submit); My Submissions itself only reads.

On-screen element

Origin system

Code path

Refresh

Caveat

Weekly tab rows (client, week, sentiment, pacing, status, submitted-by, last update)

Signal's own records (entered by users in Signal): pulse_weekly_submissions table

MySubmissionsView.tsx → getMyPulseSubmissions() (src/services/supabase.ts) → GET /api/pulse/my-submissions (server/index.ts) → Supabase REST, filtered submitted_by = caller, ordered week descending

Live on page load

Includes voided rows; underlying record also stores fields not shown here (division, GD review notes, contract terms, etc.)

Quarterly (QBP) tab rows (client, quarter, QBP date, status, submitted-by, last update)

Signal's own records (entered by users in Signal): pulse_qbp_submissions table

Same call, same endpoint; filtered submitted_by = caller, ordered quarter descending

Live on page load

Includes voided rows

Caller identity (which rows are "mine")

Nova (Power Digital's internal platform) user directory

Server-side in /api/pulse/my-submissions: JWT email → Nova employee id via resolvePulseCallerEmpId() / getPulseEmailToEmpIdMap() (server/index.ts, reads Nova's users directory)

Email→id map cached server-side 5 minutes (code constant PULSE_OWNERSHIP_TTL_MS, as of Jul 2026)

If the email is missing from Nova's user directory the endpoint returns 401 and the page shows an error

Client names in the Client column

Vena (Power Digital's financial planning system) client/contract records, keyed by Nova client id

accounts from DataContext (app-wide load); view maps each submission's client_id → account parentName/name

Loaded once with the app's account data

Unmatched client ids display as the raw numeric id

Names in the "Submitted" column

Nova user directory (roster with job title/division/department)

employees from DataContext → GET /api/employees (server/index.ts); submitted_by (a Nova user id) resolved to a name in the browser

Roster cached server-side 1 hour

Legacy rows may carry a non-id submitted_by value, which then displays raw

Tab counters "Weekly · N" / "Quarterly · N" and Status dropdown counts (All/Active/Voided)

Derived in the browser

Computed in MySubmissionsView.tsx from the two fetched row sets

Instant

Tab totals count all rows including voided

Metrics & definitions

My Submissions displays statuses and enumerated values rather than computed KPIs:

  • Sentiment — the AD/GD's weekly judgment of the client's mood. Fixed 5-point scale (code enum PulseSentiment, src/services/supabase.ts, as of Jul 2026): "Delighted / Advocate", "Happy / Content", "Neutral", "Concerned / Showing Friction", "Very Unhappy / At Risk of Churn". Origin: entered by the submitter in Signal (Submit Pulse Data screen).

  • Pacing (pacing to goal) — whether the client is pacing to its performance goal. Fixed 4-value scale (code enum PulsePacing): "On Track or Ahead", "Slightly Behind", "Behind", "Unknown". Origin: entered by the submitter in Signal.

  • Week — the Monday-anchored week the weekly pulse covers (a database CHECK enforces Monday); displayed as "Week of {Mon D}" via formatWeekLabel() (src/utils/week.ts).

  • Quarter — the QBP record's quarter, format YYYY-Qn (e.g. 2026-Q2).

  • QBP date — the scheduled or held Quarterly Business Plan meeting date. May be up to 1 year in the future (code constant via qbpDateMaxIso() in src/utils/quarter.ts, as of Jul 2026 — the cap catches mistyped years, not planning).

  • Status — active or voided. Voiding is a soft delete performed on the Submit Pulse Data screen: the row's status flips to voided and it is retained for audit and downstream sync. Voided rows render visually muted on My Submissions.

  • Submitted — display name of the Nova user whose id is stamped in submitted_by. The server forces this to the logged-in submitter at write time; it cannot be spoofed.

  • Last update — timestamp of the row's most recent edit (updated_at), formatted as e.g. "Jul 7, 2026".

  • Tab counters — "Weekly · N" and "Quarterly · N" are total row counts for the caller including voided rows. The Status dropdown shows live All/Active/Voided counts for the current tab.

How it's used

  1. Monday completeness check — after (or during) the weekly pulse round, an Account Director opens the Weekly tab and scans the top rows: any owned client without a row for the current week still needs a submission. Clicking a row (or pressing Enter on it) jumps to Submit Pulse Data for that client.

  2. Verify a correction landed — after voiding a submission with wrong sentiment or contract terms, set the Status filter to "Voided" and confirm the retracted row shows as voided (and the corrected active row exists), so leadership rollups don't count the bad read.

  3. Pre-call refresher — before a client check-in, type the client's name in the search box to see the recent sentiment/pacing trajectory for that client at a glance, then click through for full history on the submit screen.

  4. QBP season audit — switch to the Quarterly tab and confirm every owned client has a QBP row for the current quarter with the correct meeting date, before a Group Director or leadership asks.

  5. "Did my submission save?" self-service — when unsure whether a form submission went through (flaky connection, double-click), My Submissions is the ground truth, avoiding duplicate submissions and support pings.

What users can change here

Nothing — My Submissions is read-only. The only interaction is navigation: clicking a row (or pressing Enter) deep-links to Submit Pulse Data at /pulse/submit?clientId=<id>, which opens that client's accordion card. All actual writes (create/update a weekly or QBP row, void a row) happen on the Submit Pulse Data screen through server endpoints (POST /api/pulse/weekly, POST /api/pulse/qbp, and matching void endpoints in server/index.ts). Those endpoints validate ownership — the caller must be the client's assigned Account Director (per-division assignments supported, multiple ADs per client possible), the client's Group Director per Nova assignment history, or a top-tier "Gandalf" admin — and stamp submitted_by from the login token. Direct database writes are blocked by row-level security (migration 20260509b_pulse_rls_tightening.sql).

Caveats & data quality

  • Tab counts include voided rows. "Weekly · N" is not "N active submissions" — use the Status filter to separate active from voided.

  • Division column exists in the data but is not displayed. As of Jul 2026 both pulse tables carry a division field (null for single-division clients), and uniqueness is per (client, week/quarter, division). A multi-division client can therefore legitimately show what looks like duplicate rows for the same week or quarter on My Submissions — they are separate per-division submissions the view does not distinguish.

  • Only a subset of each weekly record is shown. The underlying weekly submission also stores contract terms (rollover, early-out, term type), performance goal, YoY performance, week-over-week changes, GD review notes, last check-in date, goals-established and missed-business-goals flags — none of which appear in the My Submissions table. To see or edit them, click through to Submit Pulse Data.

  • Nova account-linking is a hard dependency. If the login email is not present in Nova's user directory, the page shows "Your account is not linked to a Nova user. Contact #signal-support." (typical cause: brand-new hire whose Nova record hasn't propagated). The email→id map is cached 5 minutes server-side (code constant PULSE_OWNERSHIP_TTL_MS, as of Jul 2026), so a fresh Nova record can take a few minutes to be recognized.

  • QBP dates may be in the future — up to 1 year ahead (code constant via qbpDateMaxIso(), src/utils/quarter.ts, as of Jul 2026). Builds before Jul 2026 rejected forward dates.

  • Admin submissions appear under the admin, not the AD. Top-tier ("Gandalf") admins can submit or void on behalf of any client from the submit screen (e.g. cleanup after an AD departs); those rows carry the admin's own id and appear in the admin's My Submissions, not the original AD's.

  • Legacy submitted_by values: the UI defensively handles submitted_by as number or string; rows predating the switch to Nova user ids may display a raw value instead of a name. How many such rows exist is a production-data question — not defined in the app repo.

  • Downstream sync cadence unknown: the two pulse tables feed a reverse-ETL pipeline into the wider Nova reporting stack (voided rows are retained specifically for that audit/CDC trail), but the schedule and target reports live outside this repo — not defined in the app repo.

  • Weekly cadence ownership (AD vs GD) is a process norm, not enforced in code: the write path allows both the assigned AD and the client's GD.

Related views

  • Submit Pulse Data (/pulse/submit, Team Lead+) — the sibling screen that creates every row shown on My Submissions; My Submissions deep-links into it via ?clientId=. The submit screen also uses GET /api/pulse/my-submitted-client-ids so clients a user pulsed historically stay pickable after reassignment.

  • Pulse Summary (/predictions/pulse-summary, admin-only) — portfolio-wide rollup of the same pulse submission records (latest pulse per client, sentiment/pacing distributions, joined with churn risk). My Submissions is the individual slice; Pulse Summary is the leadership slice.

  • POC Management (/predictions/poc-management) — shares the same server-side ownership plumbing (email→Nova employee, client→AD, client→GD maps), so pulse ownership behavior and POC visibility stay consistent.

  • Employee Pulse (/pulse-coverage, admin-only, under People)not related despite the shared word "pulse": it tracks Nova's internal employee survey completion, a completely different dataset.

FAQ

Q: Who can see My Submissions in Signal? A: Team Lead tier and above — the route /pulse/my-submissions is guarded by TeamLeadRoute, and the whole "Client Pulse" nav section is team-lead-only. Team-lead status is granted automatically at sign-in to anyone listed in Nova as a client's Account Director (executive sponsor) or Group Director, and admins/Gandalf-tier users qualify implicitly. If you believe you should have access, contact #signal-support.

Q: Can my manager or Group Director see my submissions on this page? A: No. My Submissions shows strictly the logged-in user's own rows — a Group Director opening the page sees only submissions they personally made. Leadership sees portfolio-wide pulse data in Pulse Summary (/predictions/pulse-summary, admin-only) instead.

Q: Why does the Weekly tab count look higher than my actual submissions? A: The tab counters ("Weekly · N", "Quarterly · N") count all of your rows including voided ones. Use the Status dropdown (All / Active / Voided) to see the active-only count.

Q: Why do I see two rows for the same client and the same week? A: Pulse submissions are stored per (client, week, division). For multi-division clients there can be one legitimate submission per division per week, and the My Submissions table does not show a Division column, so they look like duplicates. Click through to Submit Pulse Data to see the per-division detail.

Q: I voided a submission — how do I confirm the void went through? A: On My Submissions, set the Status filter to "Voided". The retracted row should appear with a muted "voided" pill. Voiding is a soft delete: the row stays visible here (and in the database, for audit and downstream sync) but is excluded from active rollups.

Q: The page says "Your account is not linked to a Nova user" — what do I do? A: My Submissions matches your login email against Nova's user directory to find your submissions. That error means your email isn't in Nova's directory yet (common for brand-new hires) or your Signal access was granted without a Nova account. Contact #signal-support. Note the server caches the email lookup for about 5 minutes, so a just-created Nova record can take a few minutes to be recognized.

Q: Why does the Client column show a number instead of a client name? A: Client names come from Signal's account records (Vena-derived client/contract data keyed by Nova client id). If a submission's client id can't be matched to an account — for example a client no longer in the active revenue data — the raw numeric id is displayed. The row is still valid and still clickable.

Q: Can I edit or delete a submission from My Submissions? A: No — My Submissions is read-only. Click the row (or press Enter on it) to jump to Submit Pulse Data for that client, where you can update this week's entry, add a QBP record, or void an incorrect submission.

Q: Can a QBP date be in the future? A: Yes. QBP meeting dates can be logged up to 1 year ahead (code constant as of Jul 2026); the cap exists to catch mistyped years. Older builds (before Jul 2026) rejected forward dates.

Q: Is this the same "Pulse" as Employee Pulse? A: No. My Submissions and Client Pulse concern client health submissions made by Account Directors and Group Directors in Signal. Employee Pulse (/pulse-coverage, admin-only, under People) tracks completion of Nova's internal employee survey — different data, different audience.

Q: What ultimately happens to the data I see here? A: The weekly and QBP submissions are Signal's own records and feed leadership views (Pulse Summary) and a reverse-ETL pipeline into the wider Nova reporting stack; voided rows are retained for that audit trail. The pipeline's exact schedule and downstream reports are managed outside the Signal app repo.

Did this answer your question?