From monday CRM
Syncs monday NoteTaker meeting transcripts to CRM deals by matching participants and appending structured updates with key points, next steps, and commitments.
How this skill is triggered — by the user, by Claude, or both
Slash command
/monday-crm:meeting-to-opportunity [optional: time window — 'today', 'yesterday', 'last 7 days', or 'since 2026-05-20'][optional: time window — 'today', 'yesterday', 'last 7 days', or 'since 2026-05-20']This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Pulls recent NoteTaker meetings, matches each to a CRM deal, and writes structured notes back as monday updates. Reverse-Salesforce-Einstein — Salesforce ships this loop, monday hasn't (until now). Cross-product stickiness for NoteTaker + CRM users.
Pulls recent NoteTaker meetings, matches each to a CRM deal, and writes structured notes back as monday updates. Reverse-Salesforce-Einstein — Salesforce ships this loop, monday hasn't (until now). Cross-product stickiness for NoteTaker + CRM users.
Flow: Trigger → Pull meetings → Match → Synthesize → Publish (α) → Auto-contact (β, opt-in) → Proactive next-step nudges (opt-in).
Meeting recap update per matched deal, summarizing key points + commitments + next steps. Body carries the Generated by Claude · <ISO timestamp> footer + <!-- claude-skill-id: meeting-to-opportunity --><!-- meeting-id: <id> --> comments. A Meeting sync — <Mon DD> doc lists what was matched, what wasn't, and unresolved attendees.Source = Claude on a status column.create_notification to deal owner for commitments due this week. Stage column edits and last-touch updates are also OK in Proactive (or in Default with batched confirm) when a clear transition phrase is present in the transcript ("we agreed to move to procurement review", "they signed today"). Surfaced as a single batched plan: " stage transitions detected. Apply all / review each / skip stage edits?". Amount-column writes still forbidden.get_user_context — user identity for filtering meetings.get_notetaker_meetings — recent meetings + transcripts.search / list_workspaces / get_board_info — locate Deals + Contacts boards.get_board_items_page — fetch active deals to match against.get_column_type_info — resolve email/company columns by type.create_update — write the recap onto the matched deal.create_item — β auto-contact on the Contacts board.change_item_column_values — populate the new contact's email + company columns, write Source = Claude on contacts, and apply confirmed stage / last-touch edits on matched deals. Never for amount columns.create_notification — proactive next-step nudges.create_doc — sync summary doc.all_monday_api — escape hatch for connect-board column writes (linking contact ↔ deal).bulk-data-hygiene to clean contact data.Goal: Fail fast if either the monday MCP connector or NoteTaker is missing.
mcp__monday__get_user_context. On error → standard install prompt, stop.mcp__monday__get_notetaker_meetings({ limit: 1 }).PAUSE: do not write any
create_*call before Step 6.
If undeclared, Default.
Hard safety rail regardless of mode: no deletes, no amount-column writes, no cross-workspace moves. Stage transitions are bundled into a batched plan — never written one-off, never silently.
AskUserQuestion (large windows produce noisy recaps).mcp__monday__get_notetaker_meetings({ since: <ISO>, until: <ISO>, limit: 50 }). Cache transcripts + attendees + meeting metadata.
Edge cases:
<window>. Try a wider range, e.g. last 7 days." Stop.Resolve the boards directly — this skill is self-contained:
get_user_context → scan favorites + relevantBoards for names matching deals|opportunities|pipeline|sales. One candidate → use it; multiple → AskUserQuestion; zero → list_workspaces → search("deal", BOARD). Still zero → degrade per step 4 below.contacts|people|leads (only if β auto-contact may run).get_board_info on each. Resolve columns by type:
email (if present), text company-name, people owner, status stage, numbers value, date last-touch.email, text (or company-link board_relation), phone, people owner./monday-crm:workspace-builder.Goal: For each meeting, find the single best matching deal — or flag it as unmatched.
For each meeting:
limit: 500.Edge cases:
@monday.com or @<company-domain>) and no deal-name title match: skip (likely standup), log to summary doc as "skipped: internal-only".For each matched meeting, compose a structured recap from the transcript:
? or signaled by "we need to figure out", "TBD").confidence: high|low based on (a) explicit phrase ("we agreed to ", "signed today") = high, (b) inferred ("seems like they're ready for legal review") = low. Only high transitions enter the batched plan; low ones surface as text recommendations.Deal-side metadata lookup: pull current stage + value + close date for context (single get_board_items_page filtered to the matched item ID).
For each matched meeting + deal pair:
<!-- claude-skill-id: meeting-to-opportunity --> and <!-- meeting-id: <id> -->. If found → update via all_monday_api, don't post a duplicate.create_update({ itemId: <dealId>, body: <recap markdown> }).# Meeting recap — <meeting title>
*<meeting date> · <duration>m · <attendee count> attendees*
## Key points
- ...
## Commitments
- <person> → <commitment> (due <date or "open">)
## Open questions
- ...
## Stage signal
<"applied: <old> → <new>" if the batched plan included it> OR <text recommendation if low-confidence> OR "no stage change">
---
<!-- claude-skill-id: meeting-to-opportunity -->
<!-- meeting-id: <noteTakerMeetingId> -->
Generated by Claude · <ISO timestamp> · run `/monday-crm:meeting-to-opportunity` to refresh.
Before any write, print a single plan:
"I'll write: recaps · stage edits (high-confidence only) · last-touch updates · new contacts. meetings unmatched (will list separately). low-confidence stage signals will surface as text only. Proceed? (yes / show plan in detail / no)."
If user picks "show plan in detail", walk through one example per write-type, confirm, then batch the rest. Never per-deal confirms beyond that.
Goal: Don't make the user manually add every meeting attendee to Contacts.
Only runs if mode = Proactive (option a) OR Default-mode user opts in at Step 7 confirm (added prompt: "+ create N missing contacts on Contacts board?").
For each unique attendee email not found on the Contacts board:
create_item({ boardId: <contactsBoard>, itemName: "<First Last>", groupId: "new" }).change_item_column_values to populate email, company (from email domain), the matching deal link (board_relation column → <dealId>), and Source = Claude on the board's source/status column. If no source/status column exists, prompt the user once: "Add a Source status column on Contacts so we can flag plugin-created records? (yes / skip)". If skipped, contacts are still created but source isn't tracked.Cap at 25 contacts per run. Above that, batch into a review-list doc rather than creating silently.
Only runs if mode = Proactive AND session-level approval was given.
For commitments parsed in Step 6 with a parseable due-date within next 7 days:
create_notification({ userId: <deal owner>, itemId: <dealId>, text: "Commitment due <date> on <deal>: <commitment>" }).Hard rail: never write commitments to amount columns. Notifications only for proactive nudges (stage edits already handled in Step 7's batched plan, not here).
If >20 nudges queued, batch into one This week's commitments doc (with <!-- claude-skill-id: meeting-to-opportunity --> in body) and notify once with a link.
create_doc (idempotent — same-day update-in-place):
# Meeting sync — <Mon DD>
## Matched (<N>)
- <meeting title> → <deal name> (<deal url>)
## Multi-match (<N>)
- <meeting title> → <deal A> + <deal B>
## Ambiguous (<N>)
- <meeting title> — candidates: <deal A>, <deal B> — review and re-run with explicit deal ID
## Unmatched (<N>)
- <meeting title> — attendees: <emails> — no matching deal. Suggest creating one.
## Skipped (<N>)
- <meeting title> — internal-only, no CRM relevance
## Contacts created (<N>)
- <name> (<email>) → linked to <deal>
---
Generated by Claude · <ISO timestamp>
One-line chat summary: Synced <N> meetings to <M> deals. <K> unmatched, <L> contacts created. Doc: <url>.
Generated by Claude footer + <!-- claude-skill-id: meeting-to-opportunity --> comment in update/doc bodies; Source = Claude on contact items.| Failure | Behavior |
|---|---|
| Connector / NoteTaker missing | Step 0 stops; print install link. |
| 0 meetings in window | Step 3 stops; suggest wider window. |
| No Deals board | Step 4 degrades — sync doc only, suggest workspace-builder. |
| Ambiguous match (≥2 candidates within 2 points) | Skip the write; log to sync doc as "ambiguous". |
| Idempotency hit (same meeting-id in update) | Update existing content, don't duplicate. |
429 on get_notetaker_meetings or create_update | Backoff 3x; halt on third with retry message. |
| Contacts board missing | Skip β; log "no Contacts board" once in sync doc. |
| Transcript empty / NoteTaker still processing | Skip that meeting; surface in sync doc as "transcript pending". |
| Cross-board permission error | Skip just that deal/contact; continue with the rest. |
<!-- claude-skill-id: meeting-to-opportunity --> + <!-- meeting-id: <id> --> + Generated by Claude footer.Source = Claude and a link to the matched deal.npx claudepluginhub mondaycom/mcp --plugin monday-crmReads monday.com deals board, ranks deals by activity and stall age, and publishes a timestamped Morning Briefing update inside monday.com.
Enhances Granola meeting notes post-transcript with AI templates, shares to Slack/Notion/CRM, extracts action items, and supports follow-ups.
Reviews CRM pipeline stages by pulling prospects, analyzing email histories and meeting transcripts, and sending concise Slack summaries with actions and hygiene recommendations.