NEW The app beta is live! Join now to get early access!
Sales

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

  1. Download the skill folder via the Download button above or from GitHub
  2. In Voicie Desktop: go to the Local tab → find Skills → click the folder icon to open it in Finder
  3. Move the downloaded skill folder into that directory
  4. Open a new chat — the skill is now available
  5. Call it with natural language or /<skill-name>

→ Full guide: How to install skills in Voicie