Overview & Quick Links
Every board, dashboard, and Vibe app that makes the CRM and Sales Events run. Bookmark these.
Workspaces
| Workspace | Purpose |
|---|---|
| CRM (primary, ID 3364925) | All lead funnel boards live here: per-rep Outreach boards, Leads, Contacts, Accounts, Activities, Deals, No Connections, plus the CRM Workflows folder of automation-only utility boards. |
| CRM (secondary, ID 7173631) | Default workspace. Currently only hosts the Quotes & Invoices board. Don't confuse with the primary CRM. |
| Team Events (ID 13805175) | Sales events and conferences. Hosts Team Events List, Event Expenses, Events Dashboard, Conference List, Travel Request Forms, and the Sales Taskboard Vibe app. |
| Chris Mouch Vibes (ID 13721313) | Sandbox / source workspace for Vibe-generated boards and apps. Note: published Vibe apps run against board IDs from other workspaces (e.g., Sales Taskboard runs against Team Events List in the Team Events workspace). |
| Design (ID 3404966) | Design Status (the active design tracking board, also home to the C&P Request Form view), Design Ops, SOW Client Templates, C&P Library, and the archived original C&P Requests board. |
Lead Acquisition Boards
| Board | Role in the funnel |
|---|---|
| Outreach - Nick | Per-rep cold prospect holding tank (Stage 0). One board per rep (Nick, James, Eileen, Bill, Chris). Items move OFF this board when Status becomes Move to Leads or No Connection. |
| Outreach - James | Same structure as Nick's. Each rep owns their board and has Owner-level permissions. |
| Outreach - Eileen | Same structure as Nick's. |
| Outreach Chris | Chris's Outreach board. Note: naming convention differs (no dash). |
| Leads (5270617307) | Primary acquisition board. Every lead from first real conversation through conversion. Lead Stage column drives the funnel: Working Leads → Qualified → In Discovery → In Design. |
| Contacts (5270617302) | Person-level records. Auto-created when a Lead reaches In Discovery via the Contact Creation - OSA workflow board. |
| Accounts (5270617317) | Company-level records. Auto-created at the same time as Contacts via the Account Creation - OSA workflow board. |
| Activities (5270617328) | Source of truth for all call/meeting activity. Powered by the Emails & Activities widget on Leads and Contacts. |
| Deals (5270617351) | Tracks deal value and win/loss outcome. Auto-created when a C&P Request is submitted on the Design Status board. One Lead can spawn many Deals (one per project). |
| No Connections (18407788411) | Holding board for prospects with no response after multiple outreach attempts. Items land here from Outreach boards when Status becomes No Connection. |
| Outside Sales Advisors Leads | Leads sourced from OSAs (Outside Sales Advisors). Distinct funnel; routes into the standard Leads board when qualified. |
| NDA Request Form | Form board (18390295900). Submitted before sharing IP/concepts with prospects. Must be fully executed before moving from Discovery to Concept Review. NDA Status labels (color_mky4ymmr): NDA Requested → NDA Sent → Dominated, where "Dominated" = fully executed (there is no "Executed" label). As of 2026-06-11 the durable home of NDA status is the Account: the form's required Account question writes board_relation_mm47rws9 ("Account"), a true two-way pair with Accounts board_relation_mm47kgx1 ("NDA Requests"), which feeds the Accounts board's NDA Status mirror (lookup_mm47whvb) and the form board's Client IDN# mirror (lookup_mm473dhn). This survives repeat business, which never creates a new Lead. History: the earlier columns (mm22jx9g, mm22n6we, mm22scjs, mirror lookup_mm226s7m) were one-way orphans whose two-way partners had been deleted — links written on one side never synced — and were all replaced/deleted on 2026-06-11. If a connect column's "two-way" toggle is on but links don't appear on the other board, its partner column was deleted; the only fix is a fresh two-way column. |
Design & Project Boards
| Board | Role |
|---|---|
| Design Status (5342150390) | Active design tracking board. Hosts the C&P Request Form as a view. New items here (created by C&P submission) trigger a corresponding Deal on the Deals board. |
| C&P Request Form | Single entry point for any new design project — new or repeat customer. Submitting creates a Design Status item AND triggers Deal creation. |
| Design Research (5341974735) | Where designers open research requests (venues, vendors, activities, quotes) so research runs in parallel with design. Requests are parent items; each thing to research is a subitem (board 5341974793). 7pace-tracked. Detailed below. |
Sales Events Boards
| Board | Role |
|---|---|
| Team Events List (5463185693) | Source of truth for all sales events and conferences. Powers the Sales Taskboard Vibe app. 9 groups (4 per-rep, Not Assigned, Not Approved, Past Events, Team Events, Archived). Rep people column is the source of truth as of 2026-05-22. |
| Event Expenses (18400471989) | Auto-created row per approved event. Tracks expenses for each event the rep attends. |
| Conference List 2026 | Annual reference list of conferences. Source data for prospecting and event planning. |
| Travel Request Form 2.0 | Travel approval workflow. Submitted when conference attendance is approved. |
| Sales Tasks | Internal sales team task tracking for events ops. |
Vibe Apps & Dashboards
| App / Dashboard | What it does |
|---|---|
| Sales Taskboard (Vibe) | App ID 10098771. Calendar swimlane + event detail dialog for managing sales events. Runs against Team Events List (5463185693). Source code in events-vibe-app-source/. |
| Imagine Leads Portal (Vibe) | Kanban view of the Leads board built as a Vibe app. Primary day-to-day interface for reps. Source code in vibe-app-source/. Mobile-optimized layout with a floating + Add Lead FAB on the Overview tab, sticky-top dialog buttons in the AddLead modal, and the Imagine pinwheel hero. Mobile-specific behaviors (rep-facing) are documented in Section 14 of the Sales Workflow Guide. Pinwheel asset is served from https://imagine-monday-infra-guide.netlify.app/pinwheel.png (this guide's Netlify deploy). Brand font (Noto Sans Extra Bold) loaded from Google Fonts at runtime. |
| Sales Event Tracking Dashboard | Management dashboard aggregating Outreach activity across all per-rep boards. Widgets: Total Outreach In Flight, Outreach Actively Worked, Activity by Event, Status by Event, Approved Events Missing Outreach (critical filter). |
| Events Dashboard (18394407658) | Custom-object board functioning as the events ops dashboard. Note: lives in the Team Events workspace. |
CRM Workflow Utility Boards
These boards live in the CRM workspace's "CRM Workflows" folder and exist purely to host automations that route data between primary boards. They are not user-facing in day-to-day work.
| Board | Function |
|---|---|
| Leads → No Connections Workflow (18409441381) | Routes items from Leads to No Connections board on status change. |
| No Connections → Leads Workflow (18407789311) | Reverse routing if a No Connection prospect re-engages. |
| Account Creation - OSA (18405049375) | Auto-creates Account records when a Lead reaches In Discovery. |
| Contact Creation - OSA (18405058689) | Auto-creates Contact records when a Lead reaches In Discovery. |
| Fulfillment Kickoff Slack (18398163775) | Posts a Slack notification when SOW is fully executed and project moves to fulfillment. |
| Signed SOW Slack Workflow (18399485852) | Posts a Slack notification when a SOW gets signed. |
System Architecture
The Monday infrastructure is two distinct subsystems that share users (sales directors) and one connecting column. Understanding the split is the foundation for everything else.
Subsystem A
Lead Acquisition Funnel
Lives in the CRM workspace (3364925). Tracks every new customer relationship from first cold contact through signed SOW. Boards: per-rep Outreach, Leads, Contacts, Accounts, Activities, Deals, Design Status, No Connections.
Flow: Outreach → Leads → (auto-creates) Contacts + Accounts → Design Status (C&P) → Deals.
Subsystem B
Sales Events Operations
Lives in the Team Events workspace (13805175). Manages which sales directors attend which conferences and tracks the logistics around each event.
Flow: New event added → assigned to a rep via Rep column → automation routes to rep's group → 21/14/7-day reminders fire → Date End passes → moves to Past Events. Approved events trigger Event Expenses item creation.
The bridge: Event/Source column
The two subsystems intersect at the per-rep Outreach boards. Each Outreach board has an Event/Source column (board_relation_mm1asdrb) that connects to Team Events List. This lets reps mine attendee lists for the conferences they're attending, then push qualified prospects into the lead funnel.
When you trace a lead back to its origin, "which event/conference did this come from?" is answered by the Outreach board's Event/Source connection. It's the only column that ties acquisition to events ops.
Workspaces
Monday organizes boards into workspaces. Knowing which workspace a board lives in matters for permissions, navigation, and asking "where is this thing?"
| Workspace | ID | What's in it |
|---|---|---|
| CRM (primary) | 3364925 |
The lead acquisition funnel. All per-rep Outreach boards, Leads, Contacts, Accounts, Activities, Deals, No Connections, the CRM Workflows folder of utility boards, plus archived boards. Owner: MJ Jacobson. This is the workspace people mean when they say "the CRM". |
| CRM (secondary) | 7173631 |
Despite the same name, this is a near-empty workspace holding only the Quotes & Invoices board (8327012822). Default workspace flag is set here. Easy to confuse with the primary CRM — always confirm workspace ID when adding boards. |
| Team Events | 13805175 |
Sales events ops. Hosts Team Events List (5463185693), Event Expenses (18400471989), Events Dashboard, Conference List 2026, Sales Tasks, Production Team Travel, and the source folder for the Sales Taskboard Vibe app. |
| Chris Mouch Vibes | 13721313 |
Sandbox/source workspace for Vibe-generated boards and apps. Vibe apps published from here run against board IDs in other workspaces. |
| Design | 3404966 |
Design Status (5342150390 — active design board hosting the C&P Request Form view), Design Ops, SOW Client Templates, C&P Library, Experiences Library, and the archived original C&P Requests board (5342150669). |
| Imagine Events | 8673947 |
Imagine-produced events and conferences. Distinct from "Team Events" (which is sales events the team attends). |
| Fulfillment | 3404963 |
Project fulfillment work after SOW signing. Receives handoffs from the Design / Deals workflow. |
| Other | — | Main workspace (7173609), WorkForms (3597804), Training (3424686), Culture (3388818), Development (10605676). Not directly involved in the CRM/Sales Events stack. |
Lead Acquisition Boards
Each board in the lead funnel has a specific role. Items move between boards via Monday automations — they don't get duplicated.
Per-rep Outreach boards (Stage 0)
Each sales director has their own Outreach board. Cold prospects from event attendee lists live here while reps are still trying to make first contact. Items physically move off this board when they become real leads or get marked as No Connection — they don't duplicate.
Bill is the CEO and a sales rep, but he does NOT have a personal Outreach board. The standard Outreach → Leads cold-prospecting pipeline is for the volume sales motion the other Sales Directors run; Bill's sales activity is high-touch senior relationships and events. He IS a first-class rep on Team Events List and the Sales Taskboard (own group, swimlane, automations) but skips the Outreach pipeline entirely. Don't propose adding a Bill Outreach board "for consistency" — it's intentional.
Standard columns on every Outreach board
| Column | Type | Purpose |
|---|---|---|
| Name | name | Prospect's full name. |
Event/Sourceboard_relation_mm1asdrb | board_relation | Two-way connection to Team Events List. Identifies which conference/event the prospect came from. The two-way connection auto-creates a reverse column on Team Events List. |
Statuscolor_mm16y791 | status | Drives all routing. Labels: Not Contacted · Sent Message · Responsive · Move to Leads · No Connection · Unqualified/Dead. |
| Company, Title, Email, LinkedIn, etc. | various | Standard contact-detail columns. Specifics may vary slightly per board but should follow the template. |
Status-driven routing on every Outreach board
| Status | What it triggers |
|---|---|
| Not Contacted | Stays on Outreach board. Default state. |
| Sent Message | Stays on Outreach board. Rep made initial contact. |
| Responsive | Stays on Outreach board. Prospect engaged; rep is qualifying. |
| Move to Leads | Item moves to Leads board (5270617307), Lead Stage set to Working Leads. |
| No Connection | Item moves to No Connections board (18407788411). |
| Unqualified/Dead | Item moves to the Unqualified/Dead group on Leads board. |
Leads (5270617307)
The primary acquisition board. Every real lead lives here from first qualifying conversation through conversion to Deal.
Lead Stage values
| Stage | Meaning | Move-here trigger |
|---|---|---|
| Working Leads | First touch / outreach started. | Default on creation. Items arrive here from Outreach boards. |
| Qualified Leads | Confirmed interest, ICP fit, wants to talk. | Move manually after a qualifying conversation. |
| In Discovery | Discovery call scheduled or completed. | Move manually. Triggers auto-creation of Contact + Account records. |
| In Design | C&P Request submitted, design work happening, Deal is open. | Move manually after submitting C&P Request. This is the last manual Lead stage move — the next move (to Clients or Lost Deal) is automatic. |
| Clients Auto-set | Deal Won — customer relationship is real and permanent. | Automatic. Set by the Design Stage webhook cascade (monday-design-sync) when Design sets Design Stage = Fulfillment Kickoff. Once a Client, always a Client (Won deals never get demoted by subsequent Lost deals). |
| Lost Deal Auto-set | Deal Lost without converting — Lead is closed. | Automatic. Set by the Design Stage webhook cascade when Design sets Design Stage = Not Moving Forward AND the Lead was still In Design. Never demotes existing Clients. |
| Friend | No active opportunity but worth staying in touch. | Move manually when relationship has value but no current deal. |
| Unqualified | No interest, no path, or no valid contact info. | Move manually. Confirmed dead end — never delete; keep for reporting. |
| No Connection | Reached Working Leads but never responded. | Move manually after multiple unanswered outreach attempts. |
The May 2026 open architecture question about a "post-Design Deals stage" was resolved on 2026-05-25. Result: Clients (Deal Won) and Lost Deal (Deal Lost) replaced the old ambiguous "Deals" group. Both are set fully automatically — the Design team sets the Design Stage column to Fulfillment Kickoff (Won) or Not Moving Forward (Lost) and the webhook cascade handles the rest. No rep action required. Once a Lead reaches either state, the Vibe app locks the Stage badge (no dropdown menu) and surfaces a banner explaining that further activity belongs on Contact/Account, not the Lead. New opportunities from Clients or Lost Deal prospects are handled per Scenario B in the CRM Workflow Guide — submit C&P against the existing Contact/Account, never reopen the Lead.
Monday's automation library (standard recipes, AI-powered, Custom Automation, Workflows) doesn't support dynamic linked-item status updates across boards on the Imagine account — confirmed exhaustively on 2026-05-25. The cascade is implemented as monday-design-sync, a Netlify serverless function that receives Monday webhooks from the Design Status board. When the Design Stage changes to Fulfillment Kickoff or Not Moving Forward, the function updates the Deal stage + group + close date, ensures the Lead ↔ Deal link exists, then applies Lead lifecycle rules (Won → Clients, Lost → Lost Deal, Client is forever). The Vibe app's useLeadDeals.js hook mirrors the same lifecycle logic for historical reference but no longer drives any writes at the Won/Lost transition — it is now read-only for Current Deals display.
Contacts (5270617302) and Accounts (5270617317)
Contacts holds person-level records. Accounts holds company-level records. Both are auto-created when a Lead reaches In Discovery via an automation on the Leads board (not via the Contact Creation - OSA / Account Creation - OSA workflow boards — those workflow boards exist for a different purpose despite the suggestive names; treat them as unrelated to the Contact/Account auto-creation).
Once created, all subsequent activity is logged against the Contact and Account records, not the original Lead. This is how the system maintains the "one Lead, many Deals" relationship — the Lead becomes a historical record after first conversion; Contacts and Accounts persist forever.
Activities (5270617328)
Native Monday board. The source of truth for every call/meeting activity record. Activities are NOT created directly on this board in day-to-day use — they're created via the Emails & Activities widget on Leads and Contacts records.
Key column IDs (used by the Leads Portal Vibe app's useActivities hook, mirrored in vibe-app-source/utils/config.js → ACTIVITY_COLUMNS): activity_status (Status), activity_type (Activity Type), activity_item (the "Lead / Contact" board_relation linking back to a Lead), activity_start_time (Start time). Note there is no reverse relation column on the Leads board pointing to Activities — so the Vibe app reads a lead's activities by filtering this board on activity_item server-side, not from the lead side.
The Fathom → Monday Railway integration (fathom_linker.py) now attaches each call recording to its matching Scheduled Discovery Call / Concept Review activity — matched by external attendee email (Lead lead_email / Contact contact_email) and a ±2-day date window. On an unambiguous single match it sets the recording, summary, flips Status → Completed, and marks Recording Link Status = Linked. Ambiguous/no matches are never auto-attached — they surface in the Fathom Meetings board's manual-link queue. New columns on this board: link_mm41zkqn (Recording Link), long_text_mm41vghe (Call Summary), text_mm41wyss (Fathom Recording ID — dedup key), color_mm419frk (Recording Link Status). The Leads Portal Vibe app's useActivities hook reads link_mm41zkqn + color_mm419frk so the Lead detail dialog shows a Watch Recording button (or a "No recording linked" nudge on Completed Discovery/Concept calls) — keep these in ACTIVITY_COLUMNS if the board changes. Full reference: Fathom-Monday-Reference.md.
Four activity types tracked
| Type | What it represents |
|---|---|
| Discovery Call | First real conversation to understand prospect's needs. |
| Concept Review | Walking a prospect through a proposed concept. |
| Follow-Up | Any follow-up contact post-meeting, post-proposal, or check-in. |
| Capabilities Call | Overview of what Imagine Experience can do. |
Activity Status values
Reporting only counts Scheduled, Completed, and Rescheduled — No Show and Cancelled are excluded so numbers reflect real work. Statuses are: Scheduled (auto-filled on creation) · Completed · Rescheduled (update the date too) · No Show · Cancelled.
Pre-conversion (Lead-level): Open the lead in the Imagine Leads Portal Vibe app → Lead Detail dialog → Activities section → Status dropdown. Writes back to Activities board automatically.
Post-conversion (Contact-level): Open the activity directly on the Activities board and update the Status column there.
Deals (5270617351)
The revenue board. One Deal per project — auto-created when a C&P Request is submitted on Design Status. Tracks deal value, win/loss, expected close, and post-close stages.
Critically: one Lead can spawn many Deals. When a returning customer starts a new project, you do NOT create a new Lead — you submit a new C&P Request linked to the existing Contact and Account, which creates a new Deal. The original Lead record stays untouched.
No Connections (18407788411)
Archive for prospects with no response after multiple outreach attempts. Items arrive here from per-rep Outreach boards when Status changes to No Connection. Kept for reporting; never deleted. Marketing may re-engage from here, in which case the No Connections → Leads Workflow (18407789311) automation board can route items back.
Design Status (5342150390)
The active design tracking board. Also hosts the C&P Request Form as a board view. Submitting the C&P Form creates a new item on this board, which in turn triggers Deal creation on the Deals board.
Three similarly-named columns, kept distinct: status_1 Design Stage is the workflow engine (drives the webhook + native automations); status Status is the day-to-day work state (Working on it, Dominated…); and color_mm01jrrw Design Status is a higher-level rollup (New Request → Request In Design → Request Delivered → Request Completed). The NDA status surfaced to designers is the mirror column lookup_mm4059zd (pulled from the associated Lead via board_relation_mm3rth1s). Deliberately left Lead-based (2026-06-11): the durable NDA record now lives on the Account (Accounts lookup_mm47whvb), but re-pointing this mirror through the Account would be a mirror-of-a-mirror, which Monday doesn't support. The Lead mirror covers all first-time business; for repeat business check the Account. NDA Status label "Dominated" = fully executed.
Concept & Proposal link columns
Two separate link columns track the decks pasted onto the Design item — don't conflate them. Concept (link) holds Concept-deck share links labeled Cv1, Cv2…; Proposal (link7) is its own dedicated column holding Proposal-deck links labeled Pv1, Pv2…. A deal that has both populates both columns. The board also carries a separate FX SOW link field — distinct from the Fulfillment Status item's Signed SOW file column (see Fulfillment Status below).
Design Stage values (status_1)
The complete value set on the workflow-engine column. Stage meanings below; the automations each stage fires are in the Design Status automations table further down.
| Design Stage | What it means |
|---|---|
| Not Started | Request received, design hasn't begun. |
| In Design | Actively building the concept or proposal. |
| Sales/Design Review | Internal review with the Sales Rep before it goes to the prospect. |
| Prospect Review | Shared with the prospect/client for their feedback. |
| In Design - Editing | Reworking based on review feedback (the iteration rounds). |
| Waiting on SOW | Approved; the SOW is being executed. The linked Deal is still open at this stage — it does not close Won, and the Lead does not convert to a Client, until Fulfillment Kickoff. |
| Fulfillment Kickoff | Handing the project to Fulfillment. Fires the Won cascade (Deal → Closed Won, Lead → Clients). |
| In Fulfillment | Fulfillment owns it now. |
| Executed | Done — the experience happened. |
| Not Moving Forward | Project stopped before completion. Fires the Lost cascade (Deal → Lost, Lead → Lost Deal). |
Treating the C&P Request Form as a view ON Design Status (rather than a separate form board) means the same item that captures the design request becomes the design tracking item. No duplication, no manual handoff.
Design Research (5341974735)
Where designers open research requests — venues, vendors, activities, quotes — so research runs in parallel without clogging the Design item. Lives in the Design workspace (3404966); item terminology "project." Each request is a top-level item; each thing to research is a subitem on the linked subitems board (5341974793). Functionally documented in the Design Workflow Guide §5; this is the technical reference.
Groups
- Active Concept Research Request (
topics) — open requests tied to Concepts. - Active Proposal Research Request (
new_group) — open requests tied to priced Proposals. - Closed Research Requests (
group_title) — completed/parked requests.
Request (parent item) columns
| Column (ID) | What it holds |
|---|---|
Lead DR (person) | Owner of the research request. |
Hours Planned (numbers_mkm7a4n) | Manual estimate of research effort. |
Hours Spent (numbers_mkm7b35g) | Actual time — written automatically by the 7pace integration (see automations). |
Priority (priority__1) | Critical ⚠️ / High / Medium / Low. |
Design Type (status_18) | Proposal / Concept / Imagine / Not Started — mirrors the Design item's Concept-vs-Proposal split and routes it to the matching group. |
Task Status (status) | Not Started / Working on it / Waiting on Fulfillment / Waiting on Design / Stuck / On Hold / Dominated / PAST DUE. |
Research Stage (status_1) | Not Started → Initial Research → Add'l Research → Design Review. |
Due Date (date4) | Worked backward from the C&P Delivery Deadline. |
Research Link (link) | Link to the working research doc/folder. |
Line (subitem) columns — board 5341974793
| Column (ID) | What it holds |
|---|---|
Researcher (person) | Who works this line. |
Hours Planned (numbers_1_mkm736j4) | Per-line effort estimate. |
Hours Spent (numbers_mkm7z31k) | Actual time — written by 7pace. |
Priority (priority__1) | Critical ⚠️ / High / Medium / Low. |
Research Stage (status) | Not Started / Initial Research / Waiting on Vendor / Requested Quote / Add'l Research / Completed Research — drives most of the automations below. |
Sub-Task Status (status_1__1) | Not Started / Working on it / Waiting on Fulfillment / Waiting on Design / Stuck / On Hold / Dominated / PAST DUE. |
Due Date (date0) | Per-line deadline; auto-pushed on Requested Quote / Waiting on Vendor. |
Cost (numbers5, $) | Per-person cost in USD from the vendor. |
Contact (text7) · Contacts Phone (text9) | Vendor contact details. |
Research Link (link) · Files (files9) · Attachments (text) | Supporting links and files. |
Vendor pricing and availability captured on each research subitem's Discussion feed get entered into the Master Pricing Sheet to price the experience (incremental, line-by-line). Access via the Creative Director / Design team. Functionally documented in the Design Workflow Guide.
Fulfillment Status (5343204571)
The handoff board Production builds the project from. A native automation on Design Status creates an item here the moment Design Stage hits Fulfillment Kickoff (see the Design Status automations). Design then fills these columns so Production has the full package:
| Column | What goes in it |
|---|---|
| Signed SOW | File column — attach the executed SOW PDF (don't paste a link). |
| Final Proposal | Link to the final Proposal PDF — the same PDF in Exhibit B of the Signed SOW. |
| Execution Dates | When the experience takes place. |
| Guest Count | Total guests listed in the SOW. |
| Gross Revenue | The gross price listed in the SOW. |
The executed-SOW field on the Fulfillment Status item is Signed SOW (a file column — attach the PDF). The Design Status board has its own separate FX SOW link field — different board, different field. Anything else pertinent goes on the Fulfillment Status item's Discussion tab. Don't conflate this board with the unused Fulfillment Status App board (18394609865). Functionally documented in the Design Workflow Guide §7.
Sales Events Boards
The events subsystem manages which sales directors attend which conferences. Powered by Team Events List and surfaced through the Sales Taskboard Vibe app.
Team Events List (5463185693)
Single source of truth for all sales events the team is attending or considering. Lives in the Team Events workspace. Powers the Sales Taskboard Vibe app's calendar view.
Groups (9 total)
| Group | Group ID | Purpose |
|---|---|---|
| Nick | group_mkw8xwrt | Events assigned to Nick Caldwell. |
| James | group_mkw85ek | Events assigned to James Neece. |
| Eileen | group_mkzzneys | Events assigned to Eileen Jackson. |
| Bill | group_mm14yf8h | Events assigned to Bill McCoy. Added 2026-05-21 when Bill became a first-class rep in the Vibe app. |
| Not Assigned | group_mkxj14zf | Pre-routing holding group. Events with no rep assigned land here. Note: was previously misdocumented as group_mkzhnryq; the correct ID is group_mkxj14zf. |
| Not Approved | group_mkxj14zf | Events that haven't yet been approved for attendance. (Verify — group IDs require confirmation against current board state.) |
| Past Events Attended | group_mm05rgs9 | Archive. Items move here automatically when Date End passes. |
| Team Events | group_mm0rnfbx | Legacy catch-all / multi-rep group. |
| Archived | group_mkyqa8vt | Soft-delete group for events that should no longer surface. |
Key columns
| Column | Type | Purpose |
|---|---|---|
| Rep | people | Source of truth for assignment as of 2026-05-22. Stores Monday user references (integer IDs). Drives group routing automations. |
Event Assigneecolor_mm0fh1qy | status | Legacy status column. Pre-2026-05-22 was the source of truth; now dual-written from the Rep column to keep legacy automations functional. Carries the same value as the Rep column's display name. |
| Date Start, Date End | date | Event date range. Drives reminder automations (21/14/7 days out) and the Past Events archival automation. |
| Attendance | status | Approval / completion status. Values include Approved (triggers Event Expenses creation), Dominated (set when Date End passes), etc. |
| Blackout Dates | date_range | Per-rep blackout dates feed into the Sales Taskboard's Possible Conflict detection. |
The Rep column (people type) is the source of truth as of 2026-05-22. The Sales Taskboard Vibe app reads from Rep, and the 5 Monday automations that route events to rep groups trigger on Rep column changes. The legacy Event Assignee column (status type) is kept and dual-written by the Vibe app on create and reassign — this preserves legacy automations and supports manual edits via Monday's native UI.
Event Expenses (18400471989)
Auto-populated board: a new Event Expenses item is created when an event's Attendance column changes to Approved. The item tracks per-event expenses (travel, hotel, registration, etc.).
Conference List 2026 (18399367921)
Reference list of conferences and trade shows for the calendar year. Source data for prospecting (used by the Imagine prospecting skill) and event planning. Update annually.
Travel Request Form 2.0 (18394194994)
Form board for travel approval. Submitted by reps after their conference attendance is approved on Team Events List.
Lead Lifecycle Flow
How a record actually moves through the infrastructure, from cold outreach to signed deal. Two acquisition paths feed into one funnel.
The two entry paths
Path 1
Cold outreach via per-rep Outreach board
- Rep finds prospect names from a conference attendee list, sends to manager for enrichment.
- Manager uploads enriched names to the rep's Outreach board.
- Rep works the list, updating Status as outreach progresses.
- When a real conversation happens, rep changes Status to
Move to Leads→ item moves to Leads board at Working Leads stage.
Path 2
Direct add to Leads board
For in-person event encounters, referrals, or anyone the rep has already had a real conversation with. Skip Outreach entirely — add directly to Leads at Working Leads stage.
Stages on the Leads board
Stages from Working Leads through In Design are moved manually by the rep. The two terminal states (Clients and Lost Deal) are set automatically by the Design Stage webhook cascade (monday-design-sync) when the Design team sets Design Stage = Fulfillment Kickoff (Won) or Not Moving Forward (Lost). The Vibe app's Current Deals section is read-only and does not drive these transitions.
- Working Leads — Rep is engaging the prospect.
- Qualified Leads — Confirmed ICP fit and interest.
- In Discovery — Discovery call scheduled or held. Automation triggers Contact + Account auto-creation here.
- In Design — C&P Request submitted via the Form view on Design Status. Automation triggers Deal creation here. Last manual stage move.
- Clients Auto — Deal Won. The webhook cascade moves the Lead here when Design sets Design Stage = Fulfillment Kickoff. Permanent state — once a Client, always a Client.
- Lost Deal Auto — Deal Lost without converting. The webhook cascade moves the Lead here when Design sets Design Stage = Not Moving Forward AND the Lead was still In Design. Never demotes existing Clients.
Current Deals in the Vibe app (read-only display)
The Imagine Leads Portal Vibe app surfaces a Current Deals section inside every Lead detail dialog (for In Design, Clients, and Lost Deal stages). The section is read-only — it shows each linked Deal's name, stage badge, value, and close date. There are no action buttons; Won/Lost transitions are handled automatically by the Design Stage webhook cascade.
The Lead-Deal link that powers this section (board_relation_mm3pg71j on the Leads board) is established automatically: when the C&P form creates a new Design Status item, the create_item webhook fires and the function links the Lead to the new Deal within ~8 seconds. Reps do not need to do anything to make the Deal appear.
For Clients and Lost Deal leads, the Stage badge in the dialog header is non-clickable. A banner reinforces that further activity should happen on the linked Contact/Account, not on the Lead.
Implementation: hooks/useLeadDeals.js in the Imagine Leads Portal Vibe app. Uses the Deals board_relation column on the Leads board (board_relation_mm3pg71j) and its reflection Source Lead on the Deals board (board_relation_mm3prdv1) — added 2026-05-25 to give the hook a one-hop traversal from Lead to linked Deals.
What the Deals board adds
The Deal record carries the revenue picture forward: value, expected close, signed SOW, fulfillment kickoff, and ultimately win/loss. Subsequent projects for the same customer create new Deals but do NOT create new Leads — the Lead is a one-time conversion artifact. For Clients leads, future Won/Lost on those subsequent Deals only updates the Deal — the Lead stays in Clients (one Client, many Deals).
Lost / off-ramp paths
| Trigger | Where it goes |
|---|---|
| Outreach Status: No Connection | Item moves to No Connections board (18407788411). |
| Outreach Status: Unqualified/Dead | Item moves to Unqualified/Dead group on Leads board. |
| Lead Stage: Unqualified | Stays on Leads; segregated into Unqualified group for reporting. Never deleted. |
| Lead Stage: Friend | Stays on Leads; no active opportunity but kept warm. |
Every cross-board automation in this system moves the item, never copies it. There is one record per prospect, and it physically lives on whichever board reflects its current state. Don't create duplicate records to "carry context forward" — the move preserves the item's full history.
Vibe Apps
Two Vibe apps sit on top of the boards and provide the day-to-day rep interfaces. Knowing how they read and write to Monday is critical when maintaining them or onboarding new reps.
Sales Taskboard (app ID 10098771)
Runs against Team Events List (5463185693). Source code lives in events-vibe-app-source/. Underwent a substantial perf overhaul on 2026-05-28 (see "Perf architecture" callout below).
Key files
| File | What it controls |
|---|---|
utils/config.js | Centralized constants: BOARDS, GROUPS (all 9 group IDs), REGIONAL_GROUPS array, GROUP_MAP (rep name → group), REPS (rep firstName → display name), ALL_REPS (swimlane order), ADMIN_NAMES (users who see all reps by default), MONDAY_URLS. This is what you edit when adding a new rep. |
utils/boardSDK.js | Singleton wrapper around the Monday Board SDK. Provides board.users.where({ids}).execute(), board.items(), etc. |
utils/eventAssignee.js | Helper functions getAssigneeName(taskOrEvent) and isAssignedTo(taskOrEvent, repName). Read the Rep column first, fall back to legacy eventAssignee string for backward compat. Use isAssignedTo() for all conflict-detection filters — using event.eventAssignee?.includes(repName) silently misses events that have rep populated but eventAssignee empty (fixed 2026-05-28). |
utils/photoCache.js | LocalStorage-backed cache of Monday user photo_thumb URLs, keyed by display name. Hydrated from localStorage on module load. Survives page reloads, so rep avatars render instantly on second+ page loads (no cold-start blink). |
utils/userFetcher.js | Added 2026-05-28. Module-level cache + in-flight dedup for the two user-fetch patterns: getSalesReps() (returns the 4 named reps — cached for the session, replaces 3 duplicated loadUsers implementations) and getUsersByIds(ids) (per-ID cache for avatar fetches in CalendarView + EventDetailsDialog). Pattern ported from the Leads app's useUserPhotos.js. |
hooks/useCalendarEvents.js | Consolidated 2026-05-28. Single source of truth for events — powers both Calendar timeline AND Tasks view. Replaces the deleted useTasks.js hook (which was fetching the same data twice). Exposes events, loading, error, refetch, stats (future-event counts), plus mutation helpers createTask, updateTask, deleteTask. Accepts (repFilter, startDate, endDate) — date params drive the server-side date-range filter. Date filtering is overlap-based (2026-06-01): the server fetch uses a 31-day buffered lower bound and App.jsx's filteredCalendarEvents / filteredTasks keep any event whose dateStart..dateEnd span overlaps the window, so events that start before the window but run into it stay visible. |
components/CalendarView.jsx | Renders calendar swimlanes — one per rep. Reads from photoCache for avatars. User-list fetches now go through getUsersByIds() from userFetcher (was direct board.users.where). |
components/EventDetailsDialog.jsx | Event detail modal. Confirmed Reassign UI uses synchronous conflict detection. Accepts existingEvents as a prop from App.jsx (was fetching its own copy via useCalendarEvents('all')) — eliminates the third full events fetch on every dialog open. Not Approved auto-unassign (2026-06-01): setting Attendance to Not Approved in handleStatusChange now also clears the rep, sets eventAssignee to Not Assigned, and moves the item to the Not Assigned group — so a denied event leaves the rep's swimlane in one action instead of two. |
components/CreateEventDialog.jsx | Event creation modal. Dual-writes Rep people column + legacy Event Assignee status column to keep automations synchronized. Accepts existingEvents as a prop from App.jsx (same change as EventDetailsDialog above). |
Source of truth pattern
Code reads only the Rep column as the authoritative assignment (via the getAssigneeName helper, which falls back to legacy eventAssignee for events that pre-date the migration). Code writes both columns on create and reassign — this preserves legacy automations and supports manual edits via Monday's native UI.
Cold-start went from ~7s to ~4s through four coordinated changes:
- Hook consolidation: deleted
hooks/useTasks.js;useCalendarEventsis now the single source of truth for both Calendar and Tasks views (was a redundant double-fetch). - Server-side date filter:
useCalendarEventsacceptsstartDate/endDateand passesdateStart: { between: [from, to] }to the BoardSDKwhere()clause — only events inside the visible window are fetched (40–70% network payload reduction depending on board history). Updated 2026-06-01: the lower bound is pulled back by a 31-day buffer so multi-day events that started before the window but are still running into it are fetched; App.jsx then enforces exact start..end overlap. Previously an event whose Date Start was last month (e.g. a conference spanning the month boundary) was filtered out even though it was still happening today. - Dialog prop passing:
EventDetailsDialogandCreateEventDialogreceiveexistingEventsas a prop from App.jsx instead of each running their ownuseCalendarEvents('all')for conflict detection. Eliminates the third full events fetch per dialog open. - User-fetch consolidation: 5 separate
board.userscall sites consolidated behindutils/userFetcher.js. Module-level cache + in-flight dedup means onegetSalesReps()network call per session and onegetUsersByIds()call per unique ID set.
Tradeoff: conflict-detection scope is now the currently-loaded events (visible date window + active rep filter) instead of every event ever fetched. For events scheduled within the near-term window this is identical behavior; for events 6+ months out it may miss conflicts with other events also 6+ months out. Worth knowing if it surfaces in practice.
Imagine Leads Portal
Runs against the Leads board (5270617307). Source code lives in vibe-app-source/. Primary day-to-day interface for reps — kanban view of leads with the activity-logging widget integrated.
Key files
| File | What it controls |
|---|---|
hooks/useSalesReps.jsx | Fetches list of sales directors for dropdowns. Excludes inactive members via the EXCLUDED_MEMBER_NAMES array (currently: 'Deleted Member', 'Marlie Tressler', 'Andrew Leeper'). Caches result in localStorage for 1 hour. |
hooks/useUserPhotos.js | Module-level shared photo cache hook. The pattern was replicated to the Sales Taskboard's photoCache.js on 2026-05-22 (and again to userFetcher.js on 2026-05-28) to fix the avatar render issues. |
hooks/useLeads.jsx | Primary leads-data hook. Updated 2026-05-28 with a 60-second soft TTL on cache hits (skip the background refresh if cache is <60s old) and a fix so the cache writes after the first page completes even when there's no cursor for more pages (was silently broken for boards small enough to fit in one page). Uses MAIN_FETCH_GROUP_IDS in the where clause — excludes Friends group from the main fetch. |
hooks/useFriendLeads.js | Added 2026-05-28. Lazy-fetch hook for the Friends stage. Does NOT fetch on mount. Caller invokes fetchFriends() when needed (Friends tab click OR first search keystroke). Result cached in state — subsequent calls are no-ops. Pattern keeps cold start fast while ensuring search results still surface Friends. |
hooks/useLeadDeals.js | Fetches Deals linked to a Lead via the board_relation_mm3pg71j column. Powers the read-only Current Deals section in the Lead detail dialog. Won/Lost transitions no longer go through this hook — they are handled by the Design Stage webhook cascade (monday-design-sync). |
hooks/useActivities.js | Powers the Activities section in the Lead detail dialog. Rewritten 2026-05-29 for speed (was ~10s to render). Previously ran two sequential queries on every open — a board-schema query to discover column IDs, then items_page(limit: 100) pulling the WHOLE Activities board and filtering in the browser (also a latent bug: anything past the first 100 items was invisible). Now: column IDs are static constants in utils/config.js (ACTIVITY_COLUMNS, no schema query), and a single items_page query filters the Activities board server-side by the activity_item relation (query_params rule, compare_value must be the numeric lead id, inlined — a typed GraphQL variable fails the CompareValue scalar). Results cached in a module-level Map (5-min TTL) shared with the hover prefetch. Status options and the allowed-type filter (Discovery Call / Follow-Up / Concept Review / Capabilities Call) are also constants in config. The status dropdown exposes only the five workflow statuses (Scheduled, Completed, Rescheduled, No Show, Cancelled) — the board's legacy Done and Open labels are intentionally omitted from ACTIVITY_STATUS_OPTIONS (they never counted toward reporting and were redundant). |
hooks/useLeadPrefetch.js | Hover prefetch for the Lead detail dialog. Updated 2026-05-29 to also call prefetchActivities(leadId) (fire-and-forget) so a lead's activities are warm in cache before the dialog opens. Independent of the lead-detail prefetch — never blocks or fails it. |
hooks/useAccountNDAStatus.js | Added 2026-06-11. Fetches the lead's linked Account's NDA Status (Accounts board lookup_mm47whvb — the durable Account-level NDA home) via GraphQL MirrorValue.display_value. Multiple comma-separated values → "Dominated" wins (= fully executed). Also returns the Account's linked NDA item id (via board_relation_mm47kgx1). Powers the single unified NDA badge in the Lead detail dialog (consolidated same day — the separate lead-level and Account-level badges were merged): status sourced from the Account mirror with lead-mirror fallback, shown for all stages except Working Leads / Qualified Leads (no Account exists pre-conversion), interactive update menu targeting the lead's linked NDA item or the Account's. Colors: green Dominated / orange NDA Sent / gray NDA Requested / red None on File. Requires 'linkToAccounts' (col board_relation_mm0qr4fj) in the dialog's withColumns fetch lists. |
components/LeadDetailsDialog.jsx | The Lead detail modal. Heavy mobile-vs-desktop split (see callout below) — large 2x2 quick-action grid (Call / Email / LinkedIn / Activities) on mobile, inline contact rows on desktop. Prominent solid-color Stage badge with chevron + lift hover. Medium rep avatar (title tooltip surfaces name on hover/long-press). No footer — X in top-right is the only close affordance. 2026-06-11: added module-level parseLocalDate() (Monday date-only strings were parsing as UTC midnight and displaying a day early — applied to activity dates and follow-up dates) and the Account NDA badge (see useAccountNDAStatus.js). The dead Monthly Goals feature (MonthlyGoals.jsx, MonthlyGoalLeadsDialog.jsx, 2 hooks) was deleted the same day. |
components/AddLeadDialog.jsx | The Add Lead modal. Sticky top action bar (Cancel + Create Lead) on mobile to avoid the Vibe heart overlap; standard bottom footer on desktop. Auto-defaults Sales Rep to the logged-in user. |
components/DashboardTabs.jsx | Tab navigation — desktop renders Chakra Tabs; mobile renders a Select dropdown with the positioning={{ fitViewport: false }} fix that prevents Floating UI from clipping the dropdown inside the Monday iframe. As of 2026-05-28: 8 tabs — Overview, Working Leads, Qualified Leads, In Discovery, In Design, Clients, Needs Attention, Friends. |
utils/leadHelpers.js | Lead-stage constants and helpers. Updated 2026-05-28 with new MAIN_FETCH_GROUP_IDS constant (derived from ALLOWED_GROUP_IDS minus Friends) — used by useLeads to exclude Friends from the main mount-time fetch. ALLOWED_GROUP_IDS itself is unchanged (processLeadItems still needs Friends as a valid group for the lazy fetch). |
utils/leadsCache.js | LocalStorage cache for the main leads fetch (5-min hard TTL inside the cache; 60-second soft TTL applied at the useLeads layer for background-refresh skip). |
utils/boardSDK.js | Same singleton pattern as Sales Taskboard. |
Tabs (as of 2026-05-28)
| Tab | Filter | Notes |
|---|---|---|
| Overview | All leads (respecting filters) | Default landing tab. Shows full lead pipeline grouped by stage. |
| Working Leads | stage === 'Working Leads' | Active leads being developed. |
| Qualified Leads | stage === 'Qualified Leads' | Confirmed interest, ICP fit. |
| In Discovery | stage === 'In Discovery' | Discovery call scheduled/underway. |
| In Design | stage === 'In Design' | C&P submitted, deal open. |
| Clients | stage === 'Clients' | Won deals — locked terminal state. |
| Needs Attention | qualifyStatus === 'Needs Attention' | Re-added 2026-05-28. Filters on Qualify Status column (not Stage). Grouped by sales rep. |
| Friends | stage === 'Friend' (lazy-fetched) | Added 2026-05-28. NOT in main mount fetch — fetches on first tab click OR first search keystroke. Cached for the rest of the session. Search auto-merges friends into results once fetched. |
Mobile UX (Leads Portal)
The Imagine Leads Portal was given a substantial mobile-specific UI pass on 2026-05-26 and refined further on 2026-05-27 so it works as a daily-driver mobile tool for Sales Directors. Mobile reps want to glance, tap, and act — desktop reps want detail and density. The split:
| Element | Mobile (hideFrom="md" additions) | Desktop (hideBelow="md" additions) |
|---|---|---|
| Tab navigation | Chakra Select dropdown with positioning fix to show all 8 tabs | Standard Chakra Tabs row (8 tabs as of 2026-05-28) |
| Filters row (Sales Rep / Stage / Date) | Removed entirely — search + tabs only | Visible |
| Add Lead button | Floating circular FAB (88px), centered bottom, Overview tab only | Inline button in header |
| Imagine pinwheel + branding | Centered between search and FAB on Overview tab only | Hidden (desktop has board header chrome) |
| AddLeadDialog action bar | Sticky top (Cancel + Create Lead) | Standard Dialog.Footer at bottom |
| LeadDetailsDialog quick actions | 2x2 SimpleGrid: Call (green), Email (blue), LinkedIn (cyan), Activities (purple) — each rendered conditionally on data presence | Inline Mail/Phone/LinkedIn text rows + small "Emails & Activities" button in header |
| LeadDetailsDialog Company Details box | Hidden (Company Size + Annual Revenue suppressed) | Visible |
| LeadDetailsDialog footer (Full Lead Details + Close) | Removed — X in top-right is only close affordance | Removed — same. Footer was deleted globally because both buttons were redundant (Activities replaces Full Lead Details; X replaces Close) and the Vibe heart overlay covered them. |
| Stage badge in dialog header | Solid colorPalette fill matching the stage color, larger padding, ChevronDown icon, shadow + translateY hover. Locked Badge for terminal Clients / Lost Deal stays subtle and non-clickable. | Same — applies to both breakpoints. |
| Rep display in dialog header | Medium circular Avatar only — no pill, no name text. title attribute on wrapping Box surfaces name on hover / iOS long-press. | Same — applies to both breakpoints. |
mobile-shortcut-setup.html
Rep-facing standalone guide for adding the Imagine Leads Portal to iPhone home screen via iOS Shortcut + custom pinwheel icon. Hosted alongside the Sales Workflow Guide at imagine-sales-workflow.netlify.app/mobile-shortcut-setup.html. Referenced as a Phase 7 item on the New Employee CRM Checklist board.
Why both apps need their own copies of similar code
Vibe apps each have their own bundled source — there's no shared library across apps. When a pattern proves useful in one app (like the photo cache), it has to be ported by hand to the other.
Automations Catalog
The system depends on a layered set of automations spread across boards. This catalog is organized by board so you can audit what fires from where.
Team Events List (5463185693)
| Trigger | Action |
|---|---|
| Rep column changes to [Rep Name] | Move item to that rep's group. 5 automations — one per rep. (Rewired 2026-05-22 from Event Assignee column to Rep column.) |
| Rep column becomes empty | Move item to Not Assigned group (group_mkxj14zf). Handles unassigned events globally without needing a per-rep rule. |
| Event Assignee column changes (legacy) | Same group routing as above, kept active as a fallback safety net for legacy events that only have the Event Assignee value set. |
| Attendance changes to Approved | Notify the assigned rep. Should use the dynamic Event Assignee / Rep person, not hardcoded names. |
| Attendance changes to Approved | Create a corresponding item on Event Expenses (18400471989) for the rep to track expenses. |
| Date Start arrives in 21 / 14 / 7 days | Send reminder to assigned rep. Three separate automations (21-day, 14-day, 7-day). |
| Date End arrives | Move item to Past Events Attended group (group_mm05rgs9); set Attendance to Dominated. Most important archival automation — ensures past events get retired correctly. |
Per-rep Outreach boards
| Trigger | Action |
|---|---|
| Status changes to Move to Leads | Move item to Leads board (5270617307); set Lead Stage to Working Leads. |
| Status changes to No Connection | Move item to No Connections board (18407788411). |
| Status changes to Unqualified/Dead | Move item to Unqualified/Dead group on Leads board. |
Leads board (5270617307)
| Trigger | Action |
|---|---|
| Lead Stage changes to In Discovery | Trigger Contact creation on Contacts (5270617302) via the Contact Creation - OSA workflow board (18405058689). |
| Lead Stage changes to In Discovery | Trigger Account creation on Accounts (5270617317) via the Account Creation - OSA workflow board (18405049375). |
Design Status (5342150390)
| Trigger | Action |
|---|---|
| New item created via C&P Request Form | Auto-create a corresponding Deal on the Deals board (5270617351). Also fires a create_item webhook (ID 586182479) → Netlify Function, which waits 8 s for the Deal automation to complete, then establishes the Lead ↔ Deal link so the Deal appears immediately in the Vibe app's Current Deals section. |
| Design Stage → Fulfillment Kickoff | Webhook (ID 586155509) → Netlify Function. Cascade: Deal stage = Won, moved to Closed Won group, close date = today → Lead moved to Clients (if was In Design or Lost Deal; no-op if already Clients). |
| Design Stage → Not Moving Forward | Webhook (ID 586155509) → Netlify Function. Cascade: Deal stage = Lost, moved to Lost group, close date = today → Lead moved to Lost Deal (if was In Design; never demotes existing Clients). |
| Design Stage → Fulfillment Kickoff | Native Monday automation: create an item on the Fulfillment Status board (5343204571). This is the item-creation step the Design Workflow Guide refers to in §7 — a native Monday automation on the Design Status board, not part of the monday-design-sync webhook. (Owner MJ, ~2 yrs, 100% success.) |
| Design Stage → Fulfillment Kickoff | Native: move the Design item into the Fulfillment Kickoff group. |
| Design Stage → Fulfillment Kickoff | Native: notify Production (highest-volume automation — 28 runs logged). |
| Design Stage → Fulfillment Kickoff | Native: notify the Sales Rep (added ~4 months ago). |
| Design Stage → In Fulfillment | Native: move the Design item into the In Fulfillment (Active) group. |
| Design Stage → Not Moving Forward | Native (safeguard, workflow 7919381300, added Jun 2026): notify the deal's Sales Rep + Chris Mouch + MJ Jacobson that the deal was marked Not Moving Forward (Deal LOST, Lead closed) — a same-day catch for mistaken closes. Audit ref B2. (Replaces the original build 7919377337, which had a text-direction rendering bug — disable that older one.) |
| Design Stage → Prospect Review | Native (NDA checkpoint, workflow 7919378604, added Jun 2026): notify the deal's Sales Rep to confirm NDA Status = Dominated (fully executed) before any IP is shared. Soft reminder is the final design (decided 2026-06-11) — Chris ruled out a webhook hard block on Prospect Review; the cancelled spec is kept at /Imagine/NDA-Hard-Gate-Webhook-Spec.md for reference. Audit ref A6 / B7. |
| Design Stage → Sales/Design Review | Native (workflow 7919379608, added Jun 2026): notify the deal's Sales Rep that the deck is ready for their internal review. Previously this stage sent no notification (relied on a manual @-tag); now the rep is pinged automatically. Sales-Rep-only by design — not the whole Design team. Audit ref B6. |
| Design Stage → Prospect Review | Native (workflow 7919379941, added Jun 2026): move the item to the Designs Waiting on Client Approval group — the client-facing move now happens at Prospect Review (not via Status = Dominated). Audit ref A4 / A8. |
| Design Stage → Waiting on SOW | Native: move the item to the Designs Waiting on Client Approval group and notify the Sales Rep & Designer. (The deal is approved but still open — it doesn't close Won until Fulfillment Kickoff.) Per the Design Workflow Guide §7. |
| Status → Dominated (being retired) | Legacy native automation — DISABLE. Previously moved the card to Designs Waiting on Client Approval, which fired prematurely at internal Sales/Design Review. Superseded by the Prospect Review move above (workflow 7919379941). Toggle this one OFF on the Design Status board so Dominated no longer relocates cards. Audit ref A4. |
Five rows above are native Monday automations defined directly on the Design Status board; the three webhook rows are the monday-design-sync Netlify function. They divide cleanly: the native automations handle everything that stays on the Imagine account — same-board group moves, creating the Fulfillment Status item, and notifications (Production, Sales Rep). The webhook handles only the cross-board cascade Monday's native library can't do — updating the linked Deal's stage/group/close date and converting the Lead. A single flip to Fulfillment Kickoff fires both layers at once: the native rules build the handoff locally while the webhook closes the Deal Won and converts the Lead.
Fulfillment Status naming: the create-item action targets the board literally named Fulfillment Status (5343204571). A separate Fulfillment Status App board (18394609865) exists but is not actively used — don't conflate the two.
Monday's native automation library cannot update a status column on a connected board (confirmed exhaustively — no such recipe exists on this account tier). All cross-board cascades are implemented via a single Netlify serverless function that handles two Monday webhook events.
Webhook 1 — create_item (ID 586182479): Fires when the C&P form creates a new Design Status item. The function waits 8 s for Monday's Deal-creation automation, then reads the Lead Associated column (board_relation_mm3rth1s) and the link to Deals column (board_relation_mm2xb4g9), and writes the Lead ↔ Deal bidirectional link. This makes the Deal appear in the Vibe app's Current Deals section immediately — without waiting for Fulfillment Kickoff.
Webhook 2 — change_column_value (ID 586155509): Fires on any column change. The function filters to Design Stage (status_1) changes only. On Fulfillment Kickoff or Not Moving Forward, it cascades: updates Deal stage + close date + group, ensures the Lead ↔ Deal link exists, then applies Lead lifecycle rules identical to useLeadDeals.js. Lead lookup uses the Design item's Lead Associated column first, falling back to the Deal's Source Lead column for items that predate column restoration.
Function URL: https://imagine-monday-infra-guide.netlify.app/.netlify/functions/monday-design-sync
Source: Monday_Infrastructure_Guide_Deploy/netlify/functions/monday-design-sync.js
Netlify env var required: MONDAY_API_KEY — generate at monday.com → Profile → Admin → API → Generate token.
Design Research (5341974735)
Native Monday automations (owner MJ), in two clusters: a research-workflow set and the 7pace time-tracking sync. Triggers run off the subitem Research Stage and the Due Dates.
| Trigger | Action |
|---|---|
| Request Due Date arrives AND Task Status ≠ Dominated | Notify Lead DR + Management (overdue safety net). |
| Subitem Due Date arrives AND subitem Research Stage ≠ Completed Research | Notify the Researcher + Management. |
| Subitem Research Stage → Requested Quote | Set subitem Due Date = today, then push it out 3 days (vendor-response buffer). |
| Subitem Research Stage → Waiting on Vendor | Set subitem Due Date = today, then push it out 3 days. |
| Subitem Research Stage → Add'l Research | Notify the Researcher + set subitem Sub-Task Status = Waiting on Fulfillment. |
| Subitem Research Stage → Completed Research | Notify Design + set subitem Sub-Task Status = Waiting on Design. |
| 7pace — total tracked time on an item or subitem changes | Write the new total into Hours Spent (item → numbers_mkm7b35g, subitem → numbers_mkm7z31k). |
| 7pace Timetracker sync — item/subitem deleted, renamed, or moved | Send a webhook to 7pace (six housekeeping automations that keep 7pace's mirror of the board in sync). |
Slack notification workflows
Two utility workflow boards in the CRM Workflows folder handle Slack notifications:
- Signed SOW Slack Workflow (18399485852) — Posts to Slack when a SOW gets signed.
- Fulfillment Kickoff Slack (18398163775) — Posts to Slack when a fully-executed SOW project moves to fulfillment handoff.
Monday automations can be defined on any board, but when an automation's trigger is on Board A and its action affects Board B, organizing them on a third "workflow" board keeps the primary boards' automation lists clean. The CRM Workflows folder gathers all the cross-board routing automations in one place.
Dashboards & Reporting
Where leadership and reps see aggregated data. Each dashboard pulls from specific boards via widget filters that must be updated when new boards are added.
Sales Event Tracking Dashboard (37094055)
Management dashboard aggregating Outreach activity across all per-rep boards. When a new rep is onboarded, every widget filter must be updated to include their new Outreach board.
| Widget | Purpose / filter logic |
|---|---|
| Total Outreach In Flight (668755102) | Counts active outreach prospects across all rep boards. Filter: Status text is NOT Move to Leads, No Connection, Unqualified/Dead. |
| Outreach Actively Worked (668766325) | Filter excludes Not Contacted plus the lifecycle terminals. |
| Outreach Activity by Event (668755913) | Horizontal bar chart grouped by event name (Group name on Outreach boards). |
| Outreach Status by Event (668755974) | Stacked vertical bar showing status breakdown per event. |
| Approved Events Missing Outreach (668791859) | Critical widget. Surfaces events that have been approved but have no outreach activity from any rep. When adding a new rep, you MUST add their Outreach board to the "is empty" filter group (combined with AND across all reps), or the widget shows false positives. |
Sales CRM Dashboards (CRM workspace)
Three management dashboards built on the CRM boards (Deals, Leads, Activities, Outreach). Each is an overview in the CRM workspace. Widgets read live from the boards; counts that filter on the current month roll over automatically.
| Dashboard | Widgets & source |
|---|---|
| Deals Pipeline Dashboard (overview 37029349) |
Revenue/pipeline view on the Deals board (5270617351). Widgets: Active Deals Count, Total Active Deals Value, Average Deal Size, Active Deals by Stage, Active Deals by Rep, Won Deals by Rep (added 2026-06-01), Pipeline Value by Stage, Closed Won Value (Last 12 Months), Win Rate, Average Deal Age. |
| Sales Performance Dashboard (overview 36954245) |
Acquisition view across Leads (5270617307) and the per-rep Outreach boards. Widgets: New Working Leads This Month (+ by Rep), Current Leads by Stage, Lead Acquisition Funnel, Outreach this Month (+ per Rep), No Connections Backlog, Lead Sources, Top Conferences for Lead Output, Working Leads Monthly Trend. Note: "this month" widgets read empty at the very start of a month. |
| Sales Activity Dashboard (overview 36951111) |
Rep-activity view on the Activities board (5270617328). Widgets: Discovery Calls This Month by Rep, Activities by Type This Month, Total Activities This Month, Activities by Rep & Type, Activity Trend by Type (Last 6 Months). Counts follow the Scheduled/Completed/Rescheduled rule (No-Show & Cancelled excluded). |
| Sales Workflow Guide (overview 37571595) |
Not a dashboard — the rep-facing Sales Workflow Guide widget (embeds imagine-sales-workflow.netlify.app). Part 1: Events & Conferences; Part 2: CRM & Lead Management. Moved into the CRM workspace 2026-06-11 for the team-wide release. Edited via /Imagine/Sales_Workflow_Guide_Deploy/ → drag onto the Netlify project to redeploy. |
A per-rep Sales Rep Scorecard (Cowork artifact) aggregates Outreach, New Working Leads, the four call types, Deals, and Deals Won by rep with a selectable time window (month / last 3 / quarter / YTD / all-time) and CSV export. It pulls the same boards live via the Monday API. Definitions: Outreach = per-rep Outreach boards + No Connections (by Assignee) + Leads items, all by "Date to Outreach"; New Working Leads = "Date Working Lead"; calls = activity Start time excl. No-Show/Cancelled; Deals = created; Won = closed-won by close date.
Events Dashboard (18394407658)
Custom-object board functioning as the events ops dashboard. Lives in the Team Events workspace.
Activities Dashboard
Aggregates activity logging across all reps. Each rep has a personal Activities view (Owner = their name, Group = Account Activities only, Start time ≥ today, sorted ascending) created during onboarding.
Dashboard widgets that count activities only include records with Status = Scheduled, Completed, or Rescheduled. No Show and Cancelled are excluded by design so numbers reflect real work, not noise.
People & Access
How people get into the system, how permissions flow, and what to remember when removing someone.
The Sales Group team — the umbrella access mechanism
Board access for sales directors flows through membership in the Sales Group team in Monday. The Sales Group team has Edit permissions on all CRM-relevant boards (Leads, Contacts, Accounts, Activities, No Connections, Team Events List, Design Status, Deals, Event Expenses, etc.). Adding a new rep to that team grants access to all of those boards at once.
Individual board subscriptions are still useful for personal notifications and views, but the actual edit access rights come from Sales Group team membership. Always start there.
The New Employee CRM Checklist
The full rep onboarding sequence lives on the New Employee CRM Checklist board (18413242438). It applies to new Sales Directors hired into the standard volume-sales role. It does NOT apply to Bill McCoy — Bill is the CEO and a special-case rep (full participation in Sales Events, but skips the Outreach pipeline; see the callout in Section 03). For any new rep, use Nick or James as the structural template, not Bill.
The checklist is organized into 8 phases:
- Phase 1 — Outreach Board Setup (duplicate, rename, move to CRM workspace, assign owner, verify columns)
- Phase 2 — Bidirectional Connect Boards
- Phase 3 — Team Events List Updates (group creation, Event Assignee label, Rep-column automation, Vibe app config, profile photo, smoke test, Leads Vibe exclusion check)
- Phase 4 — Dashboard Updates (widget filters on Sales Event Tracking Dashboard, personal Activities view)
- Phase 5 — Automations Verification
- Phase 6 — Permissions and Access (Sales Group team membership, individual subscriptions, monday seat license, Vibe app access)
- Phase 7 — Training and Documentation
- Phase 8 — General HR/Systems Onboarding
What changes in the Vibe apps when a rep is added
- Sales Taskboard — Add the new rep to
utils/config.jsin 5 places:REPS,GROUPS,REGIONAL_GROUPS,GROUP_MAP,ALL_REPS. Republish the app. Without this, the rep won't appear as a calendar swimlane or filter option. - Imagine Leads Portal — Verify the rep is NOT in
EXCLUDED_MEMBER_NAMESinhooks/useSalesReps.jsx. (That list is for inactive members — accidentally adding an active rep here will hide them from salesRep dropdowns.) - Monday profile photo — Required for the rep's avatar to render in both Vibe apps. Without one, they show as a 2-letter initials circle.
- ADMIN_NAMES in config.js — Add only if the new rep should see all reps' data by default. Currently: Chris Mouch, Bill McCoy.
When removing a rep
- Remove from Sales Group team to revoke board access.
- Add their name to
EXCLUDED_MEMBER_NAMESin the Leads Vibe app to hide them from salesRep dropdowns going forward. (Their historical assignments stay intact.) - Decide whether to keep their per-rep Outreach board (for historical records) or archive it.
- Their group on Team Events List should stay — past events assigned to them shouldn't be re-routed.
- The 5 Rep-column automation on Team Events List for "when Rep = [their name]" can stay disabled (or deleted).
Quick Reference
Common questions and rules to lock in.
Common questions
Where does a lead actually start?
Two options. Path 1: on the rep's personal Outreach board, then moves to the Leads board when a real conversation happens. Path 2: directly on the Leads board, for warm encounters or referrals.
What makes Contacts and Accounts auto-create?
Moving a Lead's stage to In Discovery. The Contact Creation - OSA and Account Creation - OSA utility workflow boards listen for that stage change and create the records.
Why is there a "Rep" column AND an "Event Assignee" column on Team Events List?
As of 2026-05-22, Rep (people column) is the source of truth. Event Assignee (status column) is legacy but still dual-written by the Vibe app on create/reassign. The dual-write keeps Monday-native edits and legacy automations working.
How do I add a new rep to the system?
Follow the New Employee CRM Checklist (18413242438). Phase 3 covers Team Events List + Vibe app config updates; Phase 6 covers Sales Group team membership.
Where does the C&P Request actually live?
The C&P Request Form is a view on the Design Status board (5342150390). Submitting the form creates a new item on Design Status, which triggers Deal auto-creation.
What workspace are the Vibe apps in?
The apps are published from the Chris Mouch Vibes workspace (13721313), but they run against board IDs in other workspaces — Sales Taskboard against Team Events List (in Team Events workspace), Imagine Leads Portal against Leads (in primary CRM workspace).
How do I update the Sales Taskboard config?
Open the Vibe app (app ID 10098771) → Code tab → src/generated/utils/config.js. Edit the constants you need (REPS, GROUPS, REGIONAL_GROUPS, GROUP_MAP, ALL_REPS, ADMIN_NAMES). Click Publish. Changes go live to all users immediately.
What's a board_relation column?
A Monday column type that links to items on another board. Two-way connections create a reverse column on the linked board automatically. The Outreach boards' Event/Source column (board_relation_mm1asdrb) is the key example — it ties prospects back to the conference they came from on Team Events List.
How do automations route events to rep groups?
5 per-rep automations on Team Events List trigger on Rep column changes: "When Rep is set to [Name] → move to [Name's group]". A 6th global automation handles "When Rep is empty → move to Not Assigned group". Legacy Event Assignee-based automations remain active as a fallback.
Why do dashboards exclude No Show and Cancelled activities?
By design — reporting should reflect actual rep work, not events that didn't happen. Only Scheduled, Completed, and Rescheduled activities count toward metrics.
Things to remember
- One Lead, many Deals — Don't create a new Lead for a returning customer. Submit a new C&P Request linked to the existing Contact and Account. The original Lead is a one-time conversion record.
- Items move, they don't duplicate — Every cross-board automation moves the item. One record per prospect, physically located on whichever board reflects its current state.
- Rep column is source of truth for Team Events List — As of 2026-05-22. Event Assignee column is legacy/dual-written by the Vibe app for backward compatibility. Don't write to Event Assignee directly from new code.
- Vibe apps need code change + republish for new reps — The Sales Taskboard's
utils/config.jshardcodes rep names and group IDs. New reps don't auto-appear; the config must be updated and the app republished. - Sales Group team is the access mechanism — Grant board edit access by adding the rep to the Sales Group team in Monday, not by subscribing them to each board individually.
- Don't delete leads — Unqualified, Friend, and No Connection records all stay for reporting. Never delete; the funnel needs the history.
- "In Design" is the terminal manual Lead stage; Clients / Lost Deal are auto-set — The Design team sets Design Stage to Fulfillment Kickoff (Won) or Not Moving Forward (Lost); the webhook cascade moves the Lead automatically. Don't drag a Lead past In Design manually. Once in Clients or Lost Deal, the Vibe app locks the Stage badge to prevent backflow.
- "Customer is forever" — Once a Lead is in Clients, Lost on a subsequent Deal does NOT demote it. New opportunities from Clients (or Lost Deal) prospects are handled per Scenario B: submit C&P against the existing Contact/Account, never reopen the Lead.
- The two CRM workspaces are not interchangeable — CRM (3364925) holds the full funnel. CRM (7173631) is the default workspace but holds only Quotes & Invoices. Always confirm workspace ID when creating new CRM-related boards.
Related references
- Sales Workflow Guide for Sales Directors — rep-facing daily playbook; the combined guide (Part 1: Events & Conferences, Part 2: CRM & Lead Management), formerly the separate CRM and Event guides
- New Employee CRM Checklist — onboarding sequence
Maintained by Operations. Questions or corrections: ask Chris.