Agent skill
af-generate-quotations
Generate client-facing quotations from Linear estimation data. Use when calculating pricing, producing PDF quotes, or formatting quote templates from effort breakdowns.
Install this agent skill to your Project
npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/other/other/af-generate-quotations
SKILL.md
Quotation Expertise
When to Use This Skill
Load this skill when you need to:
- Generate a client-facing quotation from Linear estimation data
- Calculate pricing from hour estimates and day rates
- Produce a PDF quotation document
- Email a quotation to a recipient
Common triggers:
- User says "prepare a quote", "generate a quotation", "create a quote"
- After estimation is complete and pricing is needed for a client
- When a PM needs to send costings to a stakeholder
Quick Reference
Constants
| Parameter | Value |
|---|---|
| Productive hours per day | 6 |
| Currency | GBP (£) |
| Default validity period | 30 days |
| PDF tool | md-to-pdf (v5.2.5+) |
| Quote reference format | Q-{YYYY}-{NNN} |
Estimation Source
Quotations are built from estimation data already in Linear. The estimation skill posts structured breakdowns as issue comments tagged [Discovery Estimate] or [Refined Estimate].
To find estimates: Read issue comments and look for the structured estimate format with the breakdown table (Area | Work | Hours | Role).
Rules
- Always gather inputs interactively. Never assume day rates or scope — ask the user.
- Day rates can be flat or per-role. Ask whether a single rate applies to all work, or different rates for SE, UX, QA, PM.
- Source hours from Linear estimates. Pull the breakdown from issue comments — do not re-estimate.
- Calculate in hours, present in days and cost. Hours are the base unit. Convert to days (÷6) and cost (days × rate).
- Round days up to nearest half-day. 7 hours = 1.5 days, not 1.17 days. This keeps quotes clean.
- Always include a validity period. Default 30 days from generation date.
- Generate a unique reference number. Format:
Q-{YYYY}-{NNN}where NNN is sequential. - Currency is GBP. Format as
£X,XXX.XX. No multi-currency support in v1. - No discounts in v1. If asked, note it as a future enhancement.
- No branding or T&Cs in v1. The quote is a clean, professional document without company branding.
- Always ask for email address. Do not assume — ask the user where to send the PDF.
- Email the PDF using af-send-emails-gmail. After generating the PDF, send it to the recipient via Gmail API. Load the email-sending skill for the sending workflow.
Workflow: Generate a Quotation
When: User requests a quotation for estimated work.
Procedure:
Step 1: Gather Inputs
Ask the user for:
-
Scope — Which Linear issue(s) to quote? Options:
- A single feature issue (e.g.,
AF-42) - A parent feature with sub-issues
- Multiple specific issues (comma-separated)
- A single feature issue (e.g.,
-
Day rate — Ask: "What day rate should I use? Single rate for all work, or different rates by role?"
- Flat rate example: £650/day for all work
- Per-role example: SE £650/day, UX £550/day, QA £500/day, PM £600/day
-
Recipient email — Where to send the finished PDF
-
Optional overrides:
- Validity period (default: 30 days)
- Custom quote reference
- Additional notes to include
Step 2: Extract Estimation Data
For each issue in scope:
# Read the issue and its comments
linearis issues read {ISSUE-ID}
Parse the estimation comment to extract:
- Functional area breakdown (FE, BE, INFRA, TEST, UX, DOCS)
- Hours per area
- Role assignments (SE, UX, QA, PM)
- Total hours
- Assumptions and risks
If the issue has sub-issues with individual estimates, gather all sub-issue estimates and roll up.
If no estimate exists: Stop and tell the user. Suggest running the estimation skill first.
Step 3: Calculate Pricing
For each line item:
days = ceil_to_half(hours / 6)
cost = days × day_rate_for_role
Where ceil_to_half rounds up to the nearest 0.5:
- 4 hours → 1 day (4/6 = 0.67, rounds to 1.0)
- 7 hours → 1.5 days (7/6 = 1.17, rounds to 1.5)
- 10 hours → 2 days (10/6 = 1.67, rounds to 2.0)
Sum all line items for the total.
Step 4: Generate Quotation Markdown
Use the structured output format below. Write the Markdown to a file:
/tmp/quotation-{REFERENCE}.md
Step 5: Convert to PDF
cd /tmp && md-to-pdf quotation-{REFERENCE}.md --launch-options '{"args": ["--no-sandbox", "--disable-setuid-sandbox"]}'
The --launch-options flag is required on the GiDev server for Puppeteer/Chromium. The PDF is written alongside the Markdown file (same name, .pdf extension).
Verify the PDF was created:
ls -la /tmp/quotation-{REFERENCE}.pdf
Step 6: Email the PDF
Load the af-send-emails-gmail skill and send the PDF to the recipient:
- To: The recipient email address gathered in Step 1
- Subject:
Quotation {REFERENCE} — {Project/Feature Name} - Body: Brief message introducing the quotation (e.g., "Please find attached the quotation for {scope description}.")
- Attachment: The generated PDF from Step 5
After sending, confirm delivery to the user with:
- A summary of the quotation (total cost, days, scope)
- The recipient email address it was sent to
- The local file path to the PDF (for reference)
Structured Output Format
Use this format for the quotation Markdown document:
# Quotation
**Reference:** Q-2026-001
**Date:** 6 February 2026
**Valid until:** 8 March 2026
---
## Prepared for
{Recipient name / company — ask user or leave as "Client"}
## Scope of Work
{Brief description of the work being quoted, derived from the Linear issue title and description}
## Pricing Breakdown
| # | Description | Days | Day Rate | Cost |
|---|-------------|------|----------|------|
| 1 | {Area/feature description} | X.X | £XXX | £X,XXX |
| 2 | {Area/feature description} | X.X | £XXX | £X,XXX |
| 3 | {Area/feature description} | X.X | £XXX | £X,XXX |
| | **Total** | **X.X** | | **£X,XXX** |
## Assumptions
- {From the estimation data}
- {Any additional assumptions}
## Notes
- All prices are in GBP and exclude VAT
- This quotation is valid for 30 days from the date above
- Estimates are based on current understanding of requirements; significant scope changes may require re-quotation
---
*Generated by AgentFlow*
Example Quotation
# Quotation
**Reference:** Q-2026-003
**Date:** 6 February 2026
**Valid until:** 8 March 2026
---
## Prepared for
Acme Ltd
## Scope of Work
User authentication system with login, registration, and password reset functionality.
## Pricing Breakdown
| # | Description | Days | Day Rate | Cost |
|---|-------------|------|----------|------|
| 1 | Backend API (auth endpoints, JWT, user model) | 1.5 | £650 | £975 |
| 2 | Frontend UI (login page, auth context, routes) | 1.0 | £650 | £650 |
| 3 | Infrastructure (Cognito, env vars, CORS) | 0.5 | £650 | £325 |
| 4 | Testing (unit + E2E tests) | 1.0 | £650 | £650 |
| 5 | Documentation (auth flow docs, API docs) | 0.5 | £650 | £325 |
| 6 | UX Design (login form Storybook story) | 0.5 | £550 | £275 |
| | **Total** | **5.0** | | **£3,200** |
## Assumptions
- Using AWS Cognito (not custom auth)
- Email/password auth only (no social login)
## Notes
- All prices are in GBP and exclude VAT
- This quotation is valid for 30 days from the date above
- Estimates are based on current understanding of requirements; significant scope changes may require re-quotation
---
*Generated by AgentFlow*
Common Pitfalls
- No estimate on the issue. Always check for estimation comments before proceeding. If missing, run estimation first.
- Stale estimates. Check the estimate date — if requirements have changed since the estimate, flag this to the user.
- Forgetting VAT exclusion note. Always include "prices exclude VAT" in the notes.
- Over-precise day rounding. Round to nearest 0.5 day, not to decimal places. Clients expect clean numbers.
- Missing scope description. Don't just list line items — include a human-readable scope summary at the top.
- Forgetting credential cleanup. The email-sending skill requires temporary credential files — always clean up after sending (the skill handles this, but verify).
Integration Points
Estimation skill (af-estimate-effort):
- Quotations consume estimation data — estimates must exist before quoting
- Hours, roles, and functional areas from the estimation skill map directly to quote line items
Linear API (af-query-linear-api):
- Read issue details and comments to extract estimates
Work management (af-manage-work-state):
- Track quotation generation as part of the discovery/requirements workflow
Email sending (af-send-emails-gmail):
- Sends the generated PDF to the recipient via Gmail API
- Sends as
[email protected]using service account credentials from Doppler - Subject format:
Quotation {REFERENCE} — {Project/Feature Name}
Communications (af-send-notifications):
- Zulip notification when a quote is generated (optional)
Future Enhancements (Out of Scope for v1)
- Company branding (logo, colours, fonts) on PDF
- Standard terms and conditions section
- Discount support (percentage or fixed, per-line or total)
- Multi-currency support
- Quote versioning and revision tracking
- Digital signature / acceptance workflow
- Quote templates per client
Remember:
- Always gather inputs interactively — never assume rates or scope
- Source hours from existing Linear estimates — don't re-estimate
- Calculate: hours → days (÷6, round to 0.5) → cost (days × rate)
- Generate clean Markdown, convert to PDF with
md-to-pdf - Email the PDF via
af-send-emails-gmail(Gmail API, sends as [email protected]) - Currency is GBP, validity is 30 days, no discounts in v1
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
agent-ops-spec
Manage specification documents in .agent/specs/. Use when user provides requirements, acceptance criteria, or feature descriptions that need to be tracked and validated against implementation.
agent-ops-state
Maintain .agent state files. Use at session start, after meaningful steps, and before concluding: read/update constitution/memory/focus/issues/baseline consistently.
agent-ops-spec
Manage specification documents in .agent/specs/. Use when user provides requirements, acceptance criteria, or feature descriptions that need to be tracked and validated against implementation.
agent-ops-testing
Test strategy, execution, and coverage analysis. Use when designing tests, running test suites, or analyzing test results beyond baseline checks.
agent-ops-testing
Test strategy, execution, and coverage analysis. Use when designing tests, running test suites, or analyzing test results beyond baseline checks.
agent-ops-state
Maintain .agent state files. Use at session start, after meaningful steps, and before concluding: read/update constitution/memory/focus/issues/baseline consistently.
Didn't find tool you were looking for?