Quote builder
@dealdesk/quote-builder
Price a quote from your price book CSV and the products a customer picked. Handles flat, volume, and graduated tier pricing plus line and deal discounts, checks per-product discount limits, and writes a customer-ready quote and a deal file for the order form.
- Activity
- New: be the first to try it
- Installs
- 0 installs
- Likes
- 0 likes
- Clones
- 0 clones
What it makes
Real output from this kit
- Sample file979 bytes, download to openQuote dealFrom the kit's tests
- Sample file2 KB, download to openQuoteFrom the kit's tests
- Sample file1010 bytes, download to openQuoteFrom the kit's tests
How this works
- It is a skill: written instructions Claude reads when your request matches what the skill is for. You do not call it by name; just ask for the task.
- While it works, it reads and changes files in the places it lists, nowhere else.
- It runs these commands on your computer: node scripts/quote.mjs.
- Nothing runs until you choose to use it, and you can remove it any time.
SKILL.md
Quote builder
Prices a quote the same way every time, from the price book, so nobody does tier math in their head. The script does the math; you collect the selections, explain the result, and flag anything that needs approval.
When to use
- A rep needs a quote for a set of products, quantities, a term, and maybe a discount.
- Comparing options: "what if they go to 200 seats?" or "1 year vs 3 years".
- Not for usage billing after the fact, and not for changing the price book itself (offer to edit the CSV only if the user asks).
Inputs
Price book at
data/price-book.csv(see the kit'sexamples/price-book.csv). One row per price tier:Column Meaning sku,name,unitProduct identity billingrecurring(priced per unit per year) orone_timepricingflat,volume(every unit gets the tier the total reaches), ortiered(each band priced on its own, like tax brackets)min_qty,max_qtyTier band. Leave max_qtyempty on the last tier. Bands must be contiguousunit_pricePrice per unit in that band max_discount_pctOptional: the most total discount off list allowed without approval If the user's price book is a spreadsheet or another layout, convert it to this shape in
data/and show them the result once.- Selections at
data/selections.json:customer,term_months(default 12),currency(default USD), optionaldeal_discount_pct(applies to recurring lines that do not set their own), optionaldiscount_one_time: trueto also discount one-time fees,valid_days(default 30), andlinesof{ "sku", "quantity", "discount_pct"? }.
Ask for the term and quantities if missing. Never guess a discount.
Steps
- Check the price book has every SKU the user named. If a name is close but not exact, ask which SKU they meant.
- Write
data/selections.jsonand show the user the selections in one short table. Run:
node scripts/quote.mjs data/price-book.csv data/selections.json --out out --name quoteUse a distinct
--nameper scenario (quote-1yr,quote-3yr) when comparing.- Read
out/<name>.json. Report the totals, per-line savings, and every item inwarnings. - For comparisons, put scenarios side by side: total for term, annual recurring, effective discount.
- Next steps:
out/<name>-deal.jsonfeeds straight intodiscount-approval-checkandpo-creator(add the start date, billing contact, and terms first).
Output to the user
**Quote Q-2026-0311, Northwind Traders LLC, 24 months:** $82,970.00 total ($38,985.00 per year recurring, $5,000.00 one-time). 16.2% off list.
| SKU | Qty | Your price / unit | Savings |
| --- | ---: | ---: | ---: |
| PLAT-SEAT | 60 | $486.00 | 19% (volume tier 10% + 10% deal discount) |
Warnings: none. Files: out/quote.md (customer copy), out/quote.json, out/quote-deal.json.The "How the price was built" and "Warnings" sections in quote.md are marked internal. Remind the user to delete them before sending the quote to a customer.
Guardrails
- Prices come only from the price book. If a SKU has no price, stop and ask; never estimate.
- A discount past
max_discount_pctis a warning, not a block. Say plainly who usually approves it and suggestdiscount-approval-check. - Do not change the price book unless the user asks you to.
- One currency per quote. If the price book has several, ask which one.
README.md
Quote builder
Builds an accurate quote from your price book and the products a customer picked. Volume tiers, graduated tiers, and discounts are worked out by a script, so the same inputs always give the same price.
Who it is for
Account executives, sales engineers, and deal desk teams who quote from a spreadsheet price book and want fewer math mistakes and faster "what if" scenarios.
Example
Input: examples/price-book.csv plus
{ "customer": "Northwind Traders LLC", "term_months": 24, "deal_discount_pct": 10,
"lines": [ { "sku": "PLAT-SEAT", "quantity": 60 }, { "sku": "API-1K", "quantity": 2500 },
{ "sku": "SUP-PREM", "quantity": 1, "discount_pct": 0 }, { "sku": "ONB-STD", "quantity": 1 } ] }Output (out/quote.md):
| SKU | Qty | List / unit | Your price / unit | Savings | Total for term |
|---|---|---|---|---|---|
| PLAT-SEAT | 60 | $600.00 | $486.00 | 19% | $58,320.00 |
| API-1K | 2500 | $2.00 | $1.53 | 23.5% | $7,650.00 |
Total for term $82,970.00, 16.2% off list. Plus out/quote-deal.json, ready for the PO creator and the discount approval check.
What it can access
- Runs
node scripts/quote.mjs(Node built-ins only, no network). - Reads
data/(plus the kit's ownexamples/), writesdata/andout/.
Setup
None. Export or copy your price book into data/price-book.csv.
Files
- README.md
- SKILL.md
- examples/price-book.csv
- examples/selections.json
- kit.json
- scripts/quote.mjs
Did it work?
0worked for them0did not work
Sign in to say whether it worked for you.
Nobody has said yet. Tried it? Tell the next person.
