A Claude Skill that turns the messy reality of pipeline data into a one-page forecast narrative for the weekly forecast call. The output is the document the VP Sales / CRO reads in the thirty minutes before the live call: a headline number with a confidence band, the top three deals moving the number, the single biggest risk, and one ask of leadership.
The Skill reads Salesforce as ground truth on pipeline state and Gong as the truth-check on what reps say versus what customers actually said. It fights two specific failure modes RevOps teams hit every week: deals sitting in commit on hope rather than evidence, and exec briefs written in language so hedged that the exec stops reading.
When to use
Use the Skill on a recurring cadence — once per week per forecast segment, posted to the forecast Slack channel about thirty minutes before the live call. The point is to give leaders time to read it cold, walk in with sharper questions, and shorten the call.
It pays back when:
Your forecast segments have at least ten active commit deals each week. Below that, the marginal value over a manually-written brief shrinks.
Your reps log Gong calls reliably. If Gong activity is patchy, the Skill’s risk section becomes noise.
Your Salesforce stage and close-date discipline is reasonable. The Skill cannot fix bad data; it surfaces it more visibly, which is useful but not what most teams want from a “forecast tool.”
When NOT to use
Three situations where the Skill output is the wrong artifact:
Board-of-directors materials without CFO review. The narrative is an internal RevOps artifact reconciled against Salesforce, not against finance’s bookings ledger. Numbers shown to the board should come through finance under the controls policy. The Skill explicitly refuses to produce board-formatted output.
Financial-disclosure-bound communications (10-Q, 10-K, earnings prep, investor updates, public guidance, anything legal will see). Use finance’s process; do not paste this narrative into anything filed externally.
Re-baselining the official commit. This narrative explains the commit the segment leader already set. It does not replace the commit-setting meeting itself. If you find yourself using the Skill to discover what the commit should be, you have two problems and this Skill is not solving either of them.
Setup
The bundle lives at apps/web/public/artifacts/forecast-narrative-skill/. It contains:
SKILL.md — install at ~/.claude/skills/forecast-narrative/SKILL.md. Set SFDC_TOKEN, GONG_API_KEY in your environment.
references/1-narrative-structure.md — the section template and per-section rules. Edit the heading names if your exec scans for different labels, but keep the section count: every section exists because removing it caused a confusion in past calls.
references/2-hedge-words-blocklist.md — the input to the hedge-removal pass. Edit per company tone; extend whenever a hedge word survives a real run. The blocklist is the durable artifact — the prompt is not.
references/3-sample-output.md — a worked example with the reviewer checklist. Run a Skill invocation on a known segment first and compare against this; if the structure does not match, fix the prompt before shipping to the exec.
Configure your forecast segments in references/segment-config.md — one row per segment with the Salesforce report ID, the Gong workspace ID, and the segment leader’s name (so the “Ask of VP/CRO” line resolves automatically). Snapshots land at snapshots/<segment>/<week_ending>.json and are version-checked on every run; if the file’s row count does not match the report’s expected row count, the Skill aborts before computing deltas.
Invoke each week with the segment slug and the week-ending date: build_forecast_narrative(segment="enterprise-amer", week_ending="2026-05-01").
What the Skill actually does
Six steps, run in order. They are sequential by design — every step after the first depends on the snapshot, and the hedge-removal pass depends on the full draft existing.
Snapshot Salesforce at the cutoff. Pull the saved report at the week-ending timestamp. Persist to disk so the next run has a real prior-week snapshot to diff against. Diffing against the live Salesforce state instead of a stored snapshot loses the audit trail.
Compute the deltas. Surface every opportunity that changed forecast category, slipped close date by more than 14 days, changed amount by more than 10%, or was created or removed from the segment.
Pull Gong evidence per commit deal. For every deal in commit, query Gong for customer-side activity in the trailing 14 days. This is the part that makes the Skill different from “summarize Salesforce in pretty Markdown” — combining the two systems catches deals kept in commit on hope, which Salesforce alone cannot see.
Rank the movers. Score by abs(amount_change) × close_date_proximity. Take the top three. Hard cap at three because the narrative is for the exec, not for inspection.
Identify the single biggest risk. From the commit set, pick one deal where Gong is silent for fourteen-plus days, the close date has slipped twice in 60 days, or the deal was added to commit in the last 7 days without a corresponding customer call. Pick one. A list of five risks gets read as no risks.
Hedge-removal pass. Generate the draft following references/1-narrative-structure.md. Then run a second pass that scans against references/2-hedge-words-blocklist.md and rewrites every flagged phrasing into a direct claim or a “do not know” admission. The reason for two passes rather than prompting up front: language models drift toward hedging the longer the output gets, and a dedicated removal pass reliably catches what a single-pass prompt misses.
The choice to use a structured narrative format — fixed section order, fixed headings, fixed reasoning shape — rather than free-form prose is deliberate. Free-form output drifts in structure week-to-week, which forces the exec to re-orient on every read. Fixed structure means the exec scans the same five locations every week and arrives at the same information types in the same places. Predictability is the feature.
Cost reality
A single segment narrative consumes roughly 18,000-24,000 input tokens (the snapshot, the prior snapshot, the Gong activity rows, the three reference files) and produces about 1,200-1,800 output tokens, including the hedge-removal pass. With Sonnet 4.6 list pricing, that is on the order of $0.07-$0.11 per narrative. With Opus 4.7, expect $0.35-$0.55. Run it on Sonnet for the weekly cadence and reserve Opus for end-of-quarter when the stakes justify the spend.
Time saved against a manually-written brief: a senior RevOps analyst takes 60-90 minutes per segment per week to assemble the same artifact from raw Salesforce reports and Gong notes. Across four segments, that is roughly half a day per week reclaimed. The Skill takes 90-120 seconds per segment to run, plus 5-10 minutes of human review before posting to Slack.
The honest constraint: the time saved disappears entirely if the human review step gets skipped. Reviewers catch the hallucinated specifics this Skill cannot eliminate; without that step, the cost reality flips and the Skill becomes a liability. Budget the review time explicitly.
Success metric
Watch one number: forecast-call duration over a six-week trailing window. If the brief is doing its job, leaders walk in pre-read and the call shortens by 15-25%. The narrative replaces the “what changed this week” portion of the call, which is the part that scales worst with deal volume.
Secondary metrics worth tracking after the first month:
Beat-or-miss accuracy of the headline against actuals at period close (target: within $500K on segments above $10M commit).
Number of “this is wrong” corrections from segment leaders per week (target: trending toward zero by week six).
Whether the “single biggest risk” deal actually slipped — false positives are tolerable, but a pattern of false negatives (slipped deals that were not flagged) means the risk heuristics in step 5 of the Skill need tuning.
vs alternatives
Clari Narrative. Clari produces a similar artifact natively if you are already on Clari. The Skill wins when (a) you are not on Clari and your forecast tool of record is Salesforce + Gong + spreadsheets, or (b) you are on Clari but want to extend the narrative with company-specific reasoning the Clari template cannot express. Clari wins on out-of-the-box deployment and on tighter Salesforce hooks.
Gong Forecast Notes. Gong’s forecast features lean heavily on call-side signal and are weaker on pipeline-state reasoning. The Skill explicitly stitches Salesforce-side state with Gong-side evidence; Gong Forecast Notes does the opposite and treats the pipeline as a follow-on. Pick this Skill when Salesforce is the source of truth and Gong is the verification layer.
Manually-written exec brief. A senior RevOps analyst still produces the best narrative — the Skill is at best 80% of that output, and that 80% is on factual structure, not on judgment calls about which deals to surface. The Skill wins on consistency, cadence, and the half-day per week it returns to the analyst. The analyst should review and edit every run; this is a co-author tool, not a replacement.
Watch-outs
Confident-sounding hallucinations on deal specifics. The model can invent a procurement step, a stakeholder name, or a contract value that reads plausibly. Guard: every claim about a specific deal must trace to a Salesforce field or a Gong call summary in the source data. The Skill labels any inferred-not-observed claim with (inferred) or omits it. If a confident specific claim appears with no source citation, treat the run as failed and re-run with a smaller deal set.
Hedging language slipping back in despite the removal pass. “May,” “could,” “potentially,” “appears to” creep back, especially in the risk section. Guard: extend references/2-hedge-words-blocklist.md whenever a new hedge word survives a pass. The blocklist is the durable artifact; the prompt is not. RevOps owns this file.
The summary cited as the actual forecast. The narrative explains the commit; it does not set it. Guard: the headline cites the segment leader’s commit number, never a number computed by the Skill alone. If current_commit was not passed in, the Skill labels its computed range as “Skill-computed pipeline coverage range, not an approved commit” so the document cannot be misread as the official number.
Snapshot drift. If snapshots/<segment>/<week_ending>.json was written from a partially-loaded report (Salesforce timeout mid-pull, for example), the deltas in the next run will be wrong in invisible ways. Guard: the snapshot file’s first line records the row count expected vs received; if they disagree, the Skill aborts and tells the operator to re-snapshot before continuing.
Stage discipline. If reps move deals to commit without the work being done, no Skill fixes that. The narrative will faithfully report whatever Salesforce says. Pair this Skill with a stage-progression validator workflow upstream.
Stack
Salesforce — pipeline state, stage history, deal amounts, the saved report that defines each segment.
Gong — customer-side activity signal and call summaries used as the truth-check on rep narrative.
Claude — narrative synthesis, ranking, and the hedge-removal pass. Sonnet for weekly cadence; Opus for end-of-quarter when the stakes justify it.
---
name: forecast-narrative
description: Build a one-page forecast narrative for the weekly or monthly exec
forecast call by combining Salesforce pipeline state with Gong customer-call
evidence. Outputs a headline number with a confidence band, the top three
deals moving the number, the single biggest risk, and one ask of the
VP/CRO.
---
# Forecast narrative
## When to invoke
Invoke this skill when RevOps needs to ship the weekly or monthly forecast brief that the VP Sales / CRO reads before the live forecast call. Typical cadence: once per week per segment, 30-60 minutes before the call.
Take a segment (e.g. `enterprise-amer`), a week-ending date, and the URLs of the three reference files. Produce a single-page Markdown narrative the exec can read in under two minutes.
Do NOT invoke this skill for:
- **Board-of-directors materials without CFO review.** The Skill output is an internal RevOps artifact. It has not been reconciled against finance's bookings ledger and is not safe for board reporting until the CFO's team signs off on the numbers.
- **Financial-disclosure-bound communications** (10-Q, 10-K, earnings prep, investor updates, public guidance). Forecast numbers used in any disclosure flow have to come through finance under the controls policy, not through this skill.
- **Re-baselining the official commit.** This narrative explains the commit the segment leader already set. It does not replace the commit-setting meeting itself.
## Inputs
- Required: `segment` — the forecast segment slug (e.g. `enterprise-amer`, `commercial-emea`). Maps to a Salesforce report ID in `references/segment-config.md`.
- Required: `week_ending` — the cutoff date in `YYYY-MM-DD` for the Salesforce snapshot and the Gong activity window.
- Required: `salesforce_report_id` — the saved report that returns the pipeline rows for this segment at the cutoff. Must include: opportunity ID, account, amount, close date, stage, forecast category, owner, and the prior-week snapshot fields.
- Required: `gong_workspace_id` — the Gong workspace covering this segment's calls.
- Required: `last_period_actuals` — the closed-won total from the prior period and the prior-period commit number. The Skill uses these to compute the actual-vs-commit beat/miss that frames the current narrative.
- Optional: `current_commit`, `current_best_case`, `current_upside` — if the segment leader has already set these for the period, pass them in. The Skill anchors the headline to the leader's number and explains what supports or contradicts it. If omitted, the Skill computes its own range from pipeline coverage and labels it as such.
## Reference files
Always read the following from `references/` before generating the narrative. They encode the local definitions of "commit," "stalled," and the hedge-words blocklist that keeps the output usable. Without them the narrative is generic and will drift in tone from the rest of the forecast pack.
- `references/1-narrative-structure.md` — the literal section template the output must follow, with the exact headings the exec scans for.
- `references/2-hedge-words-blocklist.md` — the words and phrasings the hedge-removal pass strips. Edit per company tone.
- `references/3-sample-output.md` — a worked example so a new RevOps reviewer can sanity-check the structure of a fresh run.
## Method
Run these six steps in order. Do not parallelize — every step after step 1 depends on the snapshot taken in step 1, and the hedge-removal pass in step 6 depends on the full draft existing first.
### 1. Snapshot Salesforce at the cutoff
Pull the saved report at `week_ending` 23:59 segment-local time. Persist the rows to disk as `snapshots/<segment>/<week_ending>.json` so the next run has a real prior-week snapshot to diff against. Diffing against the live Salesforce state instead of a stored snapshot loses the audit trail and makes "this deal moved this week" un-auditable; that is the engineering choice this step protects.
### 2. Compute the deltas
For every opportunity in the snapshot, compare against the prior-week snapshot on disk. Surface every row that:
- Changed forecast category (especially in/out of commit and best-case)
- Slipped close date by more than 14 days
- Changed amount by more than 10% in either direction
- Was created or removed from the segment
This is the raw movement set. It is not the narrative yet.
### 3. Pull Gong evidence per commit deal
For every deal in the current commit, query Gong for customer-side activity in the trailing 14 days. Capture: most-recent customer call date, participants, and a one-line topic summary lifted from Gong's call summary field (do not re-summarize the transcript here — that is a separate, more expensive call and is not needed for the narrative).
The engineering choice: combining Salesforce + Gong rather than Salesforce alone catches the failure mode where a rep keeps a deal in commit out of hope. If a commit deal has zero customer-side activity in 14 days, the deal goes into the risk section regardless of what the rep says about it. Salesforce alone cannot see that.
### 4. Rank the movers
Score each delta row by `abs(amount_change) × close_date_proximity`. Take the top three. These become the "top three deals moving the number" section. Do not surface more than three; the narrative is for the exec, not for inspection.
### 5. Identify the single biggest risk
From the commit set, surface the one deal where: (a) Gong activity is silent for 14+ days, OR (b) the close date has slipped twice in the trailing 60 days, OR (c) the deal was added to commit in the last 7 days without a corresponding customer call. Pick one. If multiple deals tie, pick the largest by amount.
The engineering choice for "one risk, not five": exec attention is the constraint, not data volume. A list of five risks is treated as no risks.
### 6. Hedge-removal pass
Generate the draft narrative following `references/1-narrative-structure.md`. Then run a second pass that scans the draft against `references/2-hedge-words-blocklist.md` and rewrites every flagged phrasing into a direct claim or a "do not know" admission. The reason for two passes rather than prompting for direct language up front: language models drift toward hedging the longer the output gets, and a dedicated removal pass reliably catches what a single-pass prompt misses. The pass is cheap (under 500 output tokens) and it is the difference between a narrative the exec actually reads and a narrative that reads like CYA.
## Output format
The Skill returns one Markdown document with exactly this structure. No preamble, no closing pleasantries.
```markdown
# Forecast narrative — {Segment}, week ending {YYYY-MM-DD}
## Headline
**Commit: ${X}M.** Confidence band: ${X−Y}M to ${X+Z}M based on {N} deals
in commit, {pct}% covered by Gong activity in the last 14 days. Last
period landed ${actual}M vs ${prior_commit}M commit ({beat/miss} of
${delta}M).
## Top 3 deals moving the number
1. **{Account} — ${amount}M, close {date}.** {What changed this week in
one sentence.} Gong: {most recent customer call date + topic}.
2. **{Account} — ${amount}M, close {date}.** ...
3. **{Account} — ${amount}M, close {date}.** ...
## Single biggest risk
**{Account} — ${amount}M.** {Why this is the risk in one sentence — the
specific signal: 17 days no Gong activity, second close-date slip in 60
days, added to commit Tuesday with no customer call since.} If this slips,
commit lands at ${X − amount}M.
## Ask of {VP/CRO name}
{One specific ask. Examples: "Get on the {Account} call Thursday to
unblock procurement." "Decide whether {Account} stays in commit or moves
to best-case before Friday." "Approve the {discount} on {Account} so legal
can close redlines."}
## Sources
- Salesforce report: {report_id}, snapshot {YYYY-MM-DD HH:MM}
- Gong workspace: {workspace_id}, activity window {start} to {end}
- Prior-period actuals: {source}
```
## Watch-outs
- **Confident-sounding hallucinations on deal specifics.** The model can invent a procurement step, a stakeholder name, or a contract value that reads plausibly. Guard: every claim about a specific deal must trace to a Salesforce field or a Gong call summary in the source data. The Skill must label any inferred-not-observed claim with `(inferred)` or omit it. If you see a confident specific claim in the output that has no source citation, treat the run as failed and re-run with a smaller deal set.
- **Hedging language slipping back in despite the removal pass.** "May," "could," "potentially," "appears to" creep back, especially on the risk section. Guard: extend `references/2-hedge-words-blocklist.md` whenever a new hedge word survives a pass. The blocklist is the durable artifact; the prompt is not. RevOps owns this file.
- **The summary cited as the actual forecast.** The narrative explains the commit; it does not set it. Guard: the headline says "Commit: ${X}M" using the segment leader's number, never a number computed by the Skill alone. If `current_commit` was not passed in, the Skill labels its computed range as "Skill-computed pipeline coverage range, not an approved commit" so the document cannot be misread as the official number. The hand-off rule: the segment leader sets the commit, the Skill explains it, the CFO reconciles it before any external use.
- **Snapshot drift.** If `snapshots/<segment>/<week_ending>.json` was written from a partially-loaded report (e.g. Salesforce timeout mid-pull), the deltas in the next run will be wrong in invisible ways. Guard: the snapshot file's first line records the row count expected vs received; if they disagree, the Skill aborts and tells the operator to re-snapshot before continuing.
# Narrative structure — TEMPLATE
> This file defines the literal section template the forecast narrative
> follows. Adjust the headings to match what your exec scans for, but do
> not delete sections — every section here exists because removing it
> created a confusion in past forecast calls.
## Section order (do not reorder)
1. **Headline** — number + confidence band + last-period beat/miss
2. **Top 3 deals moving the number** — only three, ranked
3. **Single biggest risk** — one, not five
4. **Ask of the VP/CRO** — one specific action with an owner and a date
5. **Sources** — the report ID, the Gong workspace, the snapshot timestamp
## Per-section rules
### Headline
- Lead with the dollar number. Not "we are tracking to..." Not "our forecast is..." Just `**Commit: $X.YM.**`
- Confidence band is in dollars, not percentages. "$11M-$13M" beats "75% confidence" because the exec is doing the math against the number target, not the math against a probability.
- Always include last period's actual vs prior-period commit. Without it the exec has no baseline for whether the current number is trustworthy.
### Top 3 deals moving the number
- Each deal: account, amount, close date, what changed this week, Gong signal.
- "What changed" is one sentence. If you cannot say what changed in one sentence, the deal does not belong in the top three.
- Gong signal is a date and a topic line, not a transcript summary. ("Gong: Apr 28, customer raised SOC2 question." not "Gong: the customer expressed concerns about security posture and asked several follow-up questions about our compliance roadmap.")
### Single biggest risk
- Exactly one deal. Not "the biggest risks include..."
- Name the specific signal. "17 days no Gong activity," "second close slip in 60 days," "added to commit Tuesday with no customer call since." Vague risk descriptions ("execution risk," "competitive pressure") do not pass.
- Include the dollar impact: "If this slips, commit lands at $X − Y."
### Ask of the VP/CRO
- One ask. Specific. With a deadline.
- Good: "Get on the Acme call Thursday at 2pm to unblock procurement."
- Bad: "Help drive deals to close." "Engage on top deals."
### Sources
- Always include. The exec needs to know which snapshot they are reading against, especially when challenged in the call.
## Tone rules
- Direct. Numbers in the first sentence of every section.
- No hedging — see `2-hedge-words-blocklist.md`.
- No internal jargon the exec does not use.
- No emoji. No bold-italic. Markdown bold is fine on the headline number and on the deal name in each list item.
## Last edited
{YYYY-MM-DD} — bump on every material change so the Skill can warn when the structure may have drifted from what the exec expects.
# Hedge-words blocklist — TEMPLATE
> This file is the input to the hedge-removal pass in step 6 of the Skill.
> Every phrasing here is rewritten on the second pass. Add to the list
> whenever a hedge slips past — the blocklist is the durable artifact,
> not the prompt.
## Categorical hedges (rewrite to a direct claim or a "do not know")
| Hedge phrase | Rewrite to |
|---|---|
| may | will / will not / unknown |
| might | will / will not / unknown |
| could | will / will not / unknown |
| should (as in "should close") | will close on {date} / no committed close date |
| potentially | drop the word |
| possibly | drop the word |
| likely | use the dollar number or drop the word |
| appears to | is / is not / unknown |
| seems to | is / is not / unknown |
| tends to | drop the word |
| in most cases | drop unless followed by a percentage with a source |
## Forecast-specific weasels (rewrite or remove)
| Weasel phrase | Rewrite to |
|---|---|
| tracking to | committed at $X.YM / forecasting $X.YM |
| trending toward | committed at $X.YM / forecasting $X.YM |
| in line with expectations | name the dollar delta vs commit |
| executing well | drop — say what closed, what slipped |
| strong pipeline | name the coverage ratio with a number |
| healthy coverage | name the coverage ratio with a number |
| good momentum | name what closed this week, in dollars |
| positive trajectory | drop — name the deltas |
| some risk on | the specific deal name and the specific signal |
| a few deals to watch | name the deals and why |
## Soft modal stacking (drop the redundant modal)
- "may potentially" → drop both
- "could possibly" → drop both
- "might be able to" → "will" or "cannot"
- "we are working to" → "we will" or omit
- "we will look to" → "we will" or omit
## Confidence theater (drop unless there is a number)
- "high confidence" → only with a dollar band
- "low confidence" → name the specific risk that is driving low confidence
- "we feel good about" → drop entirely
- "we are bullish on" → drop entirely
- "we are cautious on" → name the specific risk
## Things that are NOT hedges (do not strip)
These are sometimes flagged by overzealous filters. Keep them.
- "If {Account} slips, commit lands at $X." — this is a dollar consequence, not a hedge.
- "Inferred from Gong call summary" — this is a source citation, not a hedge. Source labels increase trust; they do not undermine the claim.
- "No recent customer activity" — direct admission. Keep.
- "Reporting line not public" — direct admission. Keep.
## Last edited
{YYYY-MM-DD} — extend whenever a new hedge survives the removal pass in production. The list grows; it does not shrink.
# Sample output — TEMPLATE
> A worked example of what the Skill produces, so a new RevOps reviewer
> can sanity-check structure and tone on a fresh run. Replace the
> placeholder names with your real run before sharing internally — these
> are illustrative, not real customers.
---
# Forecast narrative — Enterprise AMER, week ending 2026-05-01
## Headline
**Commit: $11.4M.** Confidence band: $10.1M to $12.6M based on 14 deals in commit, 79% covered by Gong activity in the last 14 days. Last period landed $9.8M vs $10.5M commit (miss of $0.7M).
## Top 3 deals moving the number
1. **Northwind Logistics — $1.6M, close 2026-05-22.** Moved from best-case to commit on Tuesday after Northwind's CRO confirmed the budget on the Apr 29 call. Gong: Apr 29, procurement timeline confirmed for May.
2. **Helios Health — $0.9M, close 2026-05-15.** Slipped from May 8 to May 15 after a redline round; legal agrees the new date is realistic. Gong: Apr 30, redlines exchanged with their legal team.
3. **Atlas Manufacturing — $1.2M, close 2026-06-12.** Amount increased from $0.9M to $1.2M after they added the EMEA org to scope. Gong: Apr 25, EMEA VP joined the call.
## Single biggest risk
**Concord Industries — $0.8M.** No Gong activity in 19 days; deal has been in commit since Apr 4 with no customer-side call since Apr 12. If this slips, commit lands at $10.6M.
## Ask of Sarah Chen
Get on the Concord call scheduled Thursday 2pm PT — the AE has not been able to engage their VP Procurement directly and your sponsorship would unblock the next redline cycle before the May 22 deadline.
## Sources
- Salesforce report: `0050000000ABCDE`, snapshot 2026-05-01 23:59 PT
- Gong workspace: `enterprise-amer`, activity window 2026-04-17 to 2026-05-01
- Prior-period actuals: April commit close, finance ledger 2026-05-01
---
## Reviewer checklist
Before sending to the exec, the RevOps reviewer scans for:
- [ ] Headline opens with a dollar number, not a verb.
- [ ] Confidence band is in dollars, not a percentage.
- [ ] Top 3 list is exactly 3, ranked, each with a Gong signal date.
- [ ] Risk section names exactly one deal with a specific signal.
- [ ] The ask names a person, an action, and a deadline.
- [ ] No hedge words from `2-hedge-words-blocklist.md` survived.
- [ ] Every specific deal claim traces to a Salesforce field or a Gong call summary visible in the source data — no inferred numbers without an `(inferred)` label.