Agent skill
sales-outcome-log
Record how an opportunity ended — won, lost, or no-decision — with the reason and the competitor, then create the verified proof record on a win.
Filed under Calls, demos and discovery.
From b2bforce/b2bforce · 29 skills · 2 · pushed 2026-08-21
What it does when it runs
Record how an opportunity ended — won, lost, or no-decision — with the reason and the competitor, then create the verified proof record on a win. Also backfills proof records for past engagements. Use after a proposal is decided, for win-loss review, or when the firm has client results nothing in the repo has captured.
Read from the skill and the 0 files bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.
- Keys and connectors you must supply
- None found.
- Hosts it reaches
- No third-party host appears in the skill or its bundled files.
- Tool permissions it declares
- No
allowed-toolsin the frontmatter. It only issues instructions, so there is nothing to bound. - Actions present in the files
- None. Instructions only.
Install it
View source on GitHub ↗git clone --depth 1 --filter=blob:none --sparse https://github.com/b2bforce/b2bforce.git /tmp/b2bforce git -C /tmp/b2bforce sparse-checkout set ".agents/skills/sales-outcome-log" mkdir -p ~/.claude/skills/sales-outcome-log cp -R "/tmp/b2bforce/.agents/skills/sales-outcome-log/." ~/.claude/skills/sales-outcome-log/
Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗
The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.
The skill
Source on GitHub ↗Reproduced in full from b2bforce/b2bforce/blob/7682ed90c62190a0f3c09eb135596d08bd6890bc/.agents/skills/sales-outcome-log/SKILL.md, which is licensed MIT (skill frontmatter). 1,349 words, 16 headings.
Outcome Log
Closes the loop on one opportunity and feeds the proof library.
Two things depend on this skill. Win rate is not computable unless outcomes are
recorded — and a large share of proposal leaders cannot state their own win rate.
And marketing-content-case-study is unrunnable until a verified proof record
exists, because it correctly refuses to invent client results.
Read First
- The opportunity folder:
!_discovery.mdandproposal.mdif present. workspace/firm/proof/— an existing record for this client may just need updating.workspace/marketing/icp/{icp}.md— where a repeated loss pattern belongs.
When to Use
- A proposal was accepted, declined, or went quiet.
- Win-loss review across recent opportunities.
bid_decision: no_bid— a declined bid is an outcome worth recording.- Backfill: the firm has past client results and the repo has no proof records, so case studies and proposals have nothing to cite.
Modes
| Mode | Use |
|---|---|
close | An opportunity in workspace/sales/opportunities/ ended |
fill | Delivery produced results — turn an existing stub into a usable record |
backfill | A past engagement with no opportunity folder — record the proof only |
backfill is how a firm that just cloned this repo makes its existing track record
usable. Run it once per notable past engagement; three good records beat a folder
of thin ones.
fill is the mode that keeps this pipeline from stalling. A win creates a stub with
empty metrics, and a stub nobody returns to is the failure mode of the whole proof
library. Two things trigger fill: a client-qbr where the client just confirmed
numbers out loud, and client-health-review, which reports every stub still empty.
Core Rules
- Record the reason the buyer gave, separately from the firm's interpretation. The stated reason is usually not the real one, and conflating them destroys the only useful signal in the data.
- Never invent a loss reason, a competitor, or a decision date.
unknownis a real value, and a pattern ofunknownis itself the finding: the firm is not asking. verified: trueon a proof metric requires a human to have confirmed the number. An agent may never set it from inference.- Do not mark a client public.
client_publicandquote_approvedare the client's decision, recorded by a human. Default both tofalse. - A quiet prospect is
no_decision, notlost. They are different problems: one is a competitive loss, the other is a stalled decision process, and they need different fixes.
Output — outcome.md
workspace/sales/opportunities/{opportunity}/outcome.md
---
opportunity: acme-industrial--platform-migration--2026-07
result: won # won | lost | no_decision | declined_by_us
decided: 2026-09-12
value: 32000
currency: EUR
price_model: project
reason_stated: unknown # what the buyer said
reason_assessed: incumbent_renewal
competitor: unknown
proof_record: # set on a win
---
Allowed reason_assessed values: price, scope_mismatch, timing,
no_budget, incumbent_renewal, internal_build, no_decision_process,
lost_champion, capability_gap, we_declined, unknown.
Body:
## What happened
Short factual sequence, with dates.
## Reason the buyer gave
> "We decided to extend our current vendor for another year."
## Our assessment
The champion never introduced us to the economic buyer, and qualification flagged
that gap as a condition we then proposed past anyway.
## What we would do differently
Hold the `conditional` bid condition instead of waiving it.
The last section is what makes this a loop rather than a filing cabinet.
Output — Proof Record
On result: won, and in backfill mode, create or update:
workspace/firm/proof/{slug}.md
Schema and field rules: docs/WORKSPACE.md, section "Proof record".
---
client: northwind-logistics
client_public: false
quote_approved: false
usable_publicly: false
service: platform-migration
icp: mid-market-logistics
engagement_type: project
period: 2026-09..2026-11
metrics: []
reference_call_ok: false
source_opportunity: acme-industrial--platform-migration--2026-07
created: 2026-09-12
updated: 2026-09-12
---
On a fresh win the record is a stub: flags false, metrics empty. That is
correct and honest — the engagement has not produced results yet. Set
proof_record: {slug} in outcome.md so the two link.
Multi-brand workspaces: the record is written into the delivering brand's
home — firm/brands/{brand}/proof/{slug}.md, the brand taken from the
opportunity's path segment (sales/opportunities/{brand}/…), never asked for.
No brand: field — the path carries it. Set cross_brand: false unless the
user explicitly allows sibling brands to cite the result. In backfill mode
ask which brand delivered each result.
The stub becomes useful later, when delivery ends and a human confirms numbers —
that is fill mode. Say this to the user and offer to schedule the follow-up. If the
firm uses workspace/clients/, the QBR is the natural moment: the numbers are already
on the table, and client-health-review reports every stub still empty.
Filling a record
Each metric needs a label, before, after, and verified:
metrics:
- { label: "Deployment lead time", before: "6 weeks", after: "4 days", verified: true }
- { label: "Services on automated regression", before: "0", after: "9", verified: true }
Rules:
verified: trueonly for a number a human confirmed. Ask explicitly: "can you confirm this figure is right and that we may use it?"client_public: trueonly after the client agreed to be named.quote_approved: trueonly with an actual approved quote, stored in the body.usable_publicly: trueonly when the client agreed to public use. This governs case studies and the website; a private proposal may cite a record that is not publicly usable, as long as naming and quote flags are respected.
Feeding The Loop
- Repeated loss reason — the same
reason_assessedthree times: add the pattern to the ICP'santi_fit_criteria, so qualification, content, and prospecting all read it. - Named competitor — add or update
workspace/intelligence/competitors/{slug}/so the firm monitors who it actually loses to, rather than who it assumes. - Win with results — the proof record unblocks
marketing-content-case-study, the highest-converting content type the repo supports. - Measurement — with
workspace/pdca/,outcome.mdfrontmatter is the source of truth for thepipelinemetric pack. Win rate becomes agrep, not an estimate.
Workflow
- Pick the mode.
- For
close: read the folder, ask for the result, the date, the value, and what the buyer said. Ask what the buyer said verbatim — the paraphrase loses the signal. - Write
outcome.md. Keep stated and assessed reasons separate. - On a win, create the proof stub and link it both ways.
- For
backfill: skipoutcome.md, create the proof record directly, and ask which metrics a human can confirm right now. Leave the rest unverified rather than filling them in. - For
fill: read the existing record, ask which numbers the client has now confirmed, and updatemetrics, the permission flags, andupdated. Never promote a flag the client did not agree to. - Check the loop triggers above and act on any that fire.
- If several outcomes in a row are
unknownonreason_stated, say so. The firm is not asking losers why they lost, which is the cheapest research available.
Testing Requirements
- Close a lost opportunity with
reason_stated: unknown; confirm the assessment stays separate and no reason is invented. - Close a win; confirm a stub proof record appears with all flags
falseand emptymetrics, linked fromoutcome.md. - Run
backfillfor a past engagement; confirm a record is created with only human-confirmed metrics markedverified: true. - Run
marketing-content-case-studyagainst a filled, publicly usable record; confirm its proof gate is now satisfied. - Run
fillagainst a stub; confirm only human-confirmed metrics getverified: trueand that unconfirmed ones stay out rather than being estimated.
Related Skills
| Skill | When |
|---|---|
sales-proposal | Produced the proposal being decided |
sales-bid-qualification | Receives the repeated-loss patterns |
marketing-content-case-study | Consumes a filled, publicly usable proof record |
intel-competitor-monitoring | Start monitoring a competitor that beat the firm |
client-onboarding | A win becomes an account — run it next |
client-qbr | Where confirmed results arrive that fill mode needs |
client-health-review | Reports every proof stub still empty |
firm-pdca-cycle | Turns recorded outcomes into a measured win rate |
Other skills for the same job
Different authors, same problem. Matched on the words in the skill name, across every library in the catalogue except this one.
- sales-enablement by coreyhaines31 · 45,947
- sales-pipeline by ericosiu · 3,449
- sales-playbook by ericosiu · 3,449
- sales by zubair-trabzada · 1,079
- sales-competitors by zubair-trabzada · 1,079
- sales-contacts by zubair-trabzada · 1,079
- sales-followup by zubair-trabzada · 1,079
- sales-icp by zubair-trabzada · 1,079
Need help setting it up?
This page tells you what sales-outcome-log does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.
Book a call →The directory stays free. There is nothing gated behind this.