Sales outcome log
Skills + workspace for AI agents in B2B service firms
npx -y skills add b2bforce/b2bforce --skill sales-outcome-logAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
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.
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
8.9 KB, ~2.1k tokens by cl100k_base, as published. Nobody here has run it
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.
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 |