From sales-coach
Run the weekly sales coach data-gathering workflow for SRED.ca. Pulls the prior week's (Monday–Sunday) sales activity from Fireflies, HubSpot, HeyReach, and Gmail, synthesizes a Pre-Session Brief, and injects it into the VAPI coaching agent system prompt. Use this skill whenever running the Monday 6am weekly prep task, generating a pre-session brief, or preparing for Evan's coaching call. Triggers on: "run the weekly prep", "generate the pre-session brief", "prep for Evan's call", "pull this week's data", "sales coach prep", or when the scheduled task invokes this workflow. This is Phase 1 of the three-phase sales coaching system.
How this skill is triggered — by the user, by Claude, or both
Slash command
/sales-coach:sales-coach-weekly-prepThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
This skill runs every Monday at 6am ET. It gathers all of Evan's sales activity from the **prior calendar week (Monday 00:00:00 → Sunday 23:59:59 ET)**, synthesizes it into a Pre-Session Brief, and injects the brief into the VAPI coaching agent so "John" is fully briefed before Evan calls.
This skill runs every Monday at 6am ET. It gathers all of Evan's sales activity from the prior calendar week (Monday 00:00:00 → Sunday 23:59:59 ET), synthesizes it into a Pre-Session Brief, and injects the brief into the VAPI coaching agent so "John" is fully briefed before Evan calls.
The data window is ALWAYS the prior calendar week: Monday 00:00:00 → Sunday 23:59:59 ET.
Today is Monday [DATE].
Prior week: [Last Monday] 00:00:00 ET → [Last Sunday] 23:59:59 ET
Never use "last 7 days" — always anchor to the Mon-Sun calendar week.
Convert to epoch milliseconds for HubSpot queries. Convert to ISO 8601 for Fireflies.
Read these files at session start:
sales-coach/CLAUDE.md — full project context, methodology, open questionssales-coach/evan-profile.md — living profile (last session's commitments, patterns, SDT state)sales-coach/references/pre-session-brief-template.md — exact data format and classification logicsales-coach/references/stage-specific-evaluation.md — pipeline stage evaluation criteriaPull all four in parallel. Every query uses the same Mon 00:00:00 → Sun 23:59:59 ET window.
Use fireflies_get_transcripts with:
fromDate: [prior Monday ISO 8601]
toDate: [prior Sunday ISO 8601]
Then for each transcript involving Evan Batchelor:
Use fireflies_get_transcript to pull full text, speaker attribution, summary, action items.
Classify each meeting:
- Evan-led pitch/demo → high coaching value
- Discovery/handoff (Jude or Logan present) → note who leads
- Phone-only (no Fireflies capture) → flag as data gap
Calculate for each meeting:
- Evan talk ratio (his lines / total lines)
- Questions asked count
- Follow-up email timestamp (from HubSpot, within 24hrs of meeting)
Evan's owner ID: 228172981
Pull deals with activity this week:
Filter: deals owned by 228172981
Filter: hs_last_modified_date BETWEEN [Mon epoch ms] AND [Sun epoch ms]
For each deal: stage, close date, days since last activity, deal name, amount
Pull email activity this week:
Object type: emails
Filter: owner_id = 228172981
Filter: hs_timestamp BETWEEN [Mon epoch ms] AND [Sun epoch ms]
For each email: subject, recipient, timestamp, was it replied to?
Classify: personal email vs. Prospecting Agent sequence
Pipeline stage IDs:
30153821 = Opportunity
appointmentscheduled = SR&ED Assessment
31821993 = Technical Discovery
contractsent = Follow-Up
closedwon = Closed Won
closedlost = Closed Lost
HeyReach has no API. Use browser automation (Claude in Chrome):
1. Navigate to app.heyreach.io
2. Log in as Jude's account
3. Filter by sender: Evan Batchelor
4. Filter by date: prior Mon-Sun
5. Pull: connection requests sent, accepted, messages sent, replied, InMails sent, replied
6. Note any active campaign names and their current stats
If browser automation is unavailable, note the gap and proceed without LinkedIn data.
Gmail MCP only sees Jude's mailbox. For Evan's email activity, use HubSpot (step B above). However, check Gmail for any prospect replies that may have CC'd Jude or come to the main SRED.ca inbox.
Pull the prior week's coaching call transcript from VAPI to feed the "Last Session Recap" into this week's brief. This gives John direct memory of what was discussed, not just what evan-profile.md summarizes.
# Calculate prior week's Monday and Sunday (the week BEFORE the data window)
# If data window is Apr 7-13, prior coaching session was from Mar 31-Apr 6 window
PRIOR_MONDAY=$(python3 -c "
from datetime import datetime, timedelta
today = datetime.now()
data_monday = today - timedelta(days=today.weekday() + 7)
prior_monday = data_monday - timedelta(days=7)
print(prior_monday.strftime('%Y-%m-%dT00:00:00Z'))
")
PRIOR_SUNDAY=$(python3 -c "
from datetime import datetime, timedelta
today = datetime.now()
data_monday = today - timedelta(days=today.weekday() + 7)
prior_sunday = data_monday - timedelta(days=1)
print(prior_sunday.strftime('%Y-%m-%dT23:59:59Z'))
")
curl -s "https://api.vapi.ai/call?assistantId=401905cf-f38f-4277-8bee-814916aaf2c0&createdAtGe=$PRIOR_MONDAY&createdAtLe=$PRIOR_SUNDAY" \
-H "Authorization: Bearer $VAPI_API_KEY"
For each call found:
GET https://api.vapi.ai/call/{id}artifact.transcript), analysis.summary, durationIf multiple calls found (stitched session), combine them chronologically.
Also check for any expired partials from the prior week in outputs/partials/ — if a session was never completed, note this in the brief so John can address it.
Feed this into the Pre-Session Brief under a new "Last Session Recap" section (inserted after "Commitment Check", before "Wins").
Read evan-profile.md → Commitment Tracker.
Find all ⏳ Pending commitments. List them in the brief so John knows exactly what to ask about.
Last week Evan committed to:
1. "[exact quote]" — ⏳ Pending
2. "[exact quote]" — ⏳ Pending
John should open: "Hey, last week you said [commitment]. How'd that go?"
Calculate commitment track record from ALL resolved commitments (✅ Done, 🔄 In Progress, ❌ Missed):
Commitment track record: [X] kept / [Y] total ([Z]%)
Include this in the brief's Week at a Glance section. John uses this to calibrate — if Evan keeps 90% of commitments, push harder. If he keeps 40%, the commitments are too ambitious or something else is going on.
If no prior commitments (first session), skip this step.
Combine all data into the Pre-Session Brief format. See references/pre-session-brief-template.md for the full format spec.
Required sections:
Save to: sales-coach/outputs/pre-session-brief-[YYYY-MM-DD].txt
where YYYY-MM-DD is the prior Monday's date (the start of the reporting week)
File is plain text, ~10-20KB. This file is the anchor for the entire week's coaching cycle.
The VAPI agent's system prompt has two parts:
{{PRE_SESSION_BRIEF}} and {{PERSONAL_GOALS}} placeholdersRun the update script to inject the new brief into the VAPI assistant:
VAPI_API_KEY="$VAPI_API_KEY" python3 agents/update_vapi_prompt.py \
--brief outputs/pre-session-brief-[YYYY-MM-DD].txt
If there is an active partial from this week (a prior call was interrupted), include it:
VAPI_API_KEY="$VAPI_API_KEY" python3 agents/update_vapi_prompt.py \
--brief outputs/pre-session-brief-[YYYY-MM-DD].txt \
--partial outputs/partials/week-of-[YYYY-MM-DD]-partial.json
The script:
agents/vapi-coaching-agent-prompt.mdevan-personal-goals.md, and evan-profile.md{{PRE_SESSION_BRIEF}}, {{PERSONAL_GOALS}}, {{EVAN_PROFILE}}, and {{PREVIOUS_SESSION}} with actual contenthttp.client to bypass Cloudflare WAF)Environment variable required: VAPI_API_KEY must be set. The API key is stored securely — never commit it to git.
Fallback: If the API call fails, the assembled prompt is saved to outputs/vapi-prompt-assembled-[YYYY-MM-DD].txt for manual pasting via the VAPI dashboard.
After the update, proceed to schedule Evan's coaching call.
Create a 1-hour Google Calendar event for Evan's coaching call. The scheduling rules:
Timing logic:
Examples:
Create the event using gcal_create_event:
Summary: "Sales Coaching Call with John"
Description:
Everything is ready.
This week's data has been pulled from Fireflies, HubSpot, HeyReach,
and Gmail. Your Pre-Session Brief is loaded. John is waiting for you.
Call John: +1 (571) 498-9194
12-15 minutes. He'll start with a check-in, then get into the week —
wins, meeting reviews, pipeline health, and your one coaching focus.
— Sales Coach System
Start: [calculated time] ET (1-hour block)
End: [start + 1 hour]
Attendees: [email protected], [email protected]
sendUpdates: "all"
Google Calendar sends the invitation email to Evan automatically.
This step keeps the repo in sync with the live John assistant. The problem this prevents: the weekly prep pushes prompt and rubric edits into the live VAPI assistant (Step 6), but git only reflects them if they're committed. Without this step the live John silently drifts ahead of the repo — which is exactly how agents/vapi-coaching-agent-prompt.md and references/stage-specific-evaluation.md ended up live but uncommitted.
What gets committed: only tracked source files — typically agents/ (prompt edits), references/ (rubric updates), and CLAUDE.md (project history). The new Pre-Session Brief and PDFs in outputs/ are intentionally gitignored (they hold Evan's private metrics) and must stay out of git — do not force-add them.
Invoke the project's commit-and-push skill, which stages tracked changes (git add -A, respecting .gitignore), generates a message from the diff, and pushes to origin/main with a pull --rebase fallback:
/push
If running headless where the skill isn't available, do the equivalent inline from the project root:
cd "$(git rev-parse --show-toplevel)"
git add -A
if git diff --cached --quiet; then
echo "Repo already in sync — nothing to commit."
else
git commit -m "Weekly prep [Monday YYYY-MM-DD]: sync source with live VAPI prompt"
git push origin main || { git pull --rebase origin main && git push origin main; }
fi
Sanity check: .vapi_key and outputs/ are gitignored and must never appear in the staged set. If they do, stop — the .gitignore is broken. If the push fails on auth/network, note it in the summary below; the commit is saved locally and can be pushed later.
Output a completion summary:
✅ Weekly prep complete — Week of [Monday] – [Sunday]
Data pulled:
• Fireflies: [N] meetings found, [N] with Evan
• HubSpot: [N] deals active, [N] emails in window
• HeyReach: [N] connections sent, [N] messages, [N] InMails
• Gmail: checked (no additional prospect emails found / found X relevant threads)
Pre-Session Brief: outputs/pre-session-brief-[DATE].txt ([size])
VAPI system prompt: ✅ Updated via API ([size] chars)
Coaching call: 📅 Scheduled [DAY] at [TIME] ET (event sent to Evan + Jude)
Repo sync: ✅ Committed & pushed [commit hash] / nothing to commit / ⚠️ push failed (committed locally)
Last week's commitments in brief: [yes / none — first session]
references/pre-session-brief-template.md — data gathering methodology + exact format spec for the briefreferences/stage-specific-evaluation.md — pipeline stage evaluation criteria (all 6 stages)references/sdt-coaching-framework.md — SDT framework for building the SDT Notes section of the briefnpx claudepluginhub sred-ca/sales-coach --plugin sales-coachSearches MemPalace before answering questions about past work, people, projects, or prior decisions. Returns verbatim stored content instead of guessing from model memory.
Guides Payload CMS config (payload.config.ts), collections, fields, hooks, access control, APIs. Debugs validation errors, security, relationships, queries, transactions, hook behavior.
Implements vector databases with Pinecone, Weaviate, Qdrant, Milvus, pgvector for semantic search, RAG, recommendations, and similarity systems. Optimizes embeddings, indexing, and hybrid search.