Sales: Offer
Generates a sales offer from meeting context. Reads the agreements, asks about missing data — never hallucinates prices or scope. Output is a markdown file ready to send.
What this skill does
The salesperson returns from a meeting with agreed scope and price. The skill reads recent meeting notes, extracts concrete agreements, and generates a ready offer document.
Key principle: every number in the offer comes from a certain agreement. The skill never invents prices, rates, or scope — it asks for missing data.
How it works
Before writing, it reads the last three meetings and tags every line item: concrete agreement, mentioned but unspecified, or missing entirely. You see where you stand before a single number goes into the offer. What’s missing — it asks. What it doesn’t know from your notes — it never invents.
Sent, accepted, or rejected offers stay untouched. A new version is created instead.
What you get
- An offer where every number has a meeting as its source
- Confidence tagging that shows you exactly where the gaps are before sending
- Version history: v1 → v2 without losing what was there before
Requires
sales-meeting-recap — reads meeting notes to extract scope, prices, and deadlines.
Skill file
---
name: sales-offer
description: 'ALWAYS use this skill when a salesperson wants to generate a sales offer for a client — even if the word "offer" is not used explicitly. Triggers: "make an offer for John Smith from today meeting", "generate offer for ACME", "draft offer", "offer for the first module", "prepare a proposal for <client>", "price quote for <client>", "/sales-offer". The skill identifies the client, reads recent meetings (scope, price agreements, deadlines), asks about missing data — NEVER hallucinates prices or scope — and saves a ready offer file. Status at generation is always `draft`. Idempotent: does not overwrite sent offers, creates version v2.'
argument-hint: "<client first name, last name, or company>"
---
# Sales Offer — generating a sales offer from meeting context
You are the salesperson's assistant composing an offer. You read recent meetings, extract scope, prices, deadlines, terms. What's missing — you ask. You don't invent anything, especially prices and scope.
## Configuration
- `{CLIENTS}` — client folder (default `Clients/`)
- `{OFFERS}` — offers folder (default `Offers/`)
- `{CRM}` — client contact data (default `{CLIENTS}/_clients.csv`)
## Workflow
**Step 1:** Find workspace and mode (full with `{CRM}` or degraded).
**Step 2:** Identify client and intent (topic, A/B variants, urgency).
**Step 3:** Load 3 most recent meetings from `{CLIENTS}/<id>-<slug>/Meetings/`. Tag confidence for each item: concrete → goes directly to offer; mentioned without specifics → ask; missing → user fills in.
**Step 4:** Clarification dialog — show what you have and what's missing, ask for additions.
**Step 5:** Generate offer file: `{OFFERS}/YYYY-MM-DD-<client-slug>-<topic-slug>.md`
Required frontmatter: `type: sales-offer`, `date`, `client`, `net_amount`, `currency`, `valid_until`, `status: draft`, `version: v1`.
Structure: Context → Scope (table with net+tax+gross) → Timeline (optional) → Terms → Validity → Contact.
**Step 6:** Idempotency — file with `sent`/`accepted`/`rejected` → don't overwrite, create v2.
## What NOT to do
- NEVER hallucinate prices — every number comes from a certain agreement
- NEVER improvise client data
- Status is an enum — the skill only sets `draft`
When to use
- “make an offer for John Smith from today’s meeting”
- “generate offer for ACME”
- “offer for the first module”
- “prepare a proposal for the client”
/sales-offer
Offer structure
- Context — reference to the meeting
- Scope — table of line items with net/tax/gross total
- Timeline — stages with measurable outputs (optional)
- Terms — payment, invoice details
- Validity — date + number of days
Existing offers stay untouched
Sent, accepted, or rejected offers are never overwritten — a new version is created instead. Status only set to draft.
How to install
- Download the skill folder via the Download button above or from GitHub
- In Voicie Desktop: go to the Local tab → find Skills → click the folder icon to open it in Finder
- Move the downloaded skill folder into that directory
- Open a new chat — the skill is now available
- Call it with natural language or
/<skill-name>
→ Full guide: How to install skills in Voicie