# Ratecard

> Generate professional rate card document from service definition with pricing validation

- Skill: `reggiechan74/ratecard` (Agent Skill)
- Install (CLI): `npx skillmds@latest add reggiechan74/ratecard`
- Raw SKILL.md: https://api.skillmd.com/api/skills/reggiechan74/ratecard/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: reggiechan74 (https://skillmd.com/u/reggiechan74)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/reggiechan74/ratecard

---


## Configuration

Read `.jobops/config.json`. If missing, stop with:

> JOBOPS NOT CONFIGURED
> Run /jobops:setup (then /jobops-ic:setup) to initialize your workspace.

Use `config.directories.contractor_root` for output paths in this skill.
Use `config.preferences.default_currency` for pricing if applicable.

## Arguments

Generate professional rate card from service definition with pricing validation.

- `$1`: Format (default: md): `md` | `pdf` | `html`
- `$2`: Currency (default: CAD): `CAD` | `USD`
- `$3`: `--include-justification` to add credentials/ROI section

---

## Phase 1: Validate Prerequisites

### 1.1 Find and Load Service Definition

Find most recent: `{config.directories.contractor_root}/services/service_definition_*.md`

**If not found:**
```
PREREQUISITE MISSING: Service Definition

Run /defineservices first to create service catalog and pricing.
```

**Load and validate:**
- rate_card (hourly/daily rates for minimum/target/premium tiers)
- consultant identity (name, tagline, credentials)
- services catalog (>=1 service)
- payment_terms

**If rate_card missing:**
```
INVALID SERVICE DEFINITION: Missing Rate Card

Required structure:
## Rate Card
### Hourly Rates
- **Minimum**: $[X]/hr
- **Target**: $[Y]/hr
- **Premium**: $[Z]/hr
### Daily Rates
- **Minimum**: $[A]/day
- **Target**: $[B]/day
- **Premium**: $[C]/day

Fix with: /defineservices --update
```

### 1.2 Load Source Data (if --include-justification)

For rate-card generation, read these source files:
- `Preferences/Vision.md` — explicit rate preferences if user has stated them (overrides market research)
- `Technology/TechStack.md` — identify Expert-level skills (judged in-context from WorkHistory mentions, not from a precomputed enum)
- `Technology/Certifications.md` — Active certifications only
- `WorkHistory/*.md` — for years of experience, leadership scope, budget magnitude

Compute `years_total_experience` from earliest WorkHistory Start date to today. Do NOT load `candidate_profile.json` — removed in v2.2.0.

- If source files missing: Warn but continue without justification section

---

## Phase 2: Pricing Validation

### 2.1 Validation Checks

**Check 1: Daily Rate Consistency**
- Rule: `daily_rate ~ hourly_rate x 8` (+/-10% tolerance)
- If fails: Offer auto-correction or keep with explanation

**Check 2: Rate Tier Progression**
- Rule: `minimum < target < premium` (both hourly and daily)
- If fails: Refuse generation, require manual fix

**Check 3: Premium Multiplier**
- Rule: `1.3x <= premium/target <= 2.0x`
- If outside: Advisory warning only, continue

**Check 4: Retainer Discounts (if applicable)**
- Rule: Discounts increase with commitment length
- Warn if discount <5% or >40%

### 2.2 Validation Summary

Display results:
```
PRICING VALIDATION COMPLETE
- Daily rates align with hourly x 8
- Rate tiers ascending
- Premium multiplier reasonable (1.3x-2.0x)
[Advisory warnings if any]
[Auto-corrections if any]
```

---

## Phase 3: Generate Rate Card

### 3.1 Parse Arguments

- Format: Default md, fallback to md if invalid
- Currency: Default CAD, assume CAD if unspecified in service definition
- Justification: Check for `--include-justification` flag

### 3.2 Currency Conversion (if needed)

If output currency != service definition currency:
1. Web search for current CAD/USD exchange rate
2. Convert all monetary values
3. Add footnote with conversion rate and date

### 3.3 Markdown Rate Card Structure

**YAML Frontmatter:**
```yaml
consultant: "[Name]"
effective_date: [YYYY-MM-DD]
valid_until: [+6 months]
currency: [CAD|USD]
generated_on: [ISO8601]
pricing_validated: [true/false]
source_definition: "{config.directories.contractor_root}/services/service_definition_[Date].md"
```

**Sections:**

1. **Header**: Consultant name, tagline, credentials
2. **Service Offerings**: Top 5 services with descriptions, deliverables
3. **Engagement Models & Rates**:
   - Hourly: Standard/Premium with use cases, minimum engagement
   - Daily: Standard/Premium (8-hour equivalents)
   - Retainer (if applicable): Part/half/full-time with effective rates and discounts
   - Project-Based (if applicable): Typical ranges by service type
4. **Volume & Term Discounts**: 3/6/12-month retainer, project thresholds, referrals
5. **Expense Policy**: Included (standard tools, local travel) vs. Billed separately (travel, specialized licenses)
6. **Terms & Conditions**:
   - Payment terms (retainers, projects, hourly, late fees)
   - Cancellation policy (30-day notice retainers, prorated projects, 48-hour session notice)
   - Confidentiality & IP (standard confidentiality, work product ownership, anonymized case studies)
   - Rate validity (6 months, annual review)
7. **Why These Rates?** (if --include-justification):
   - Credentials (certifications, years experience, publications, speaking)
   - Proven ROI (top 3-5 proof points with business impact)
   - Unique value proposition
8. **Contact & Next Steps**: Contact details, 4-step engagement process
9. **Footer**: Version, generation date, source file

Save to: `{config.directories.contractor_root}/rate-cards/rate_card_[YYYYMMDD].md`

---

## Phase 4: HTML/PDF Generation (if requested)

### 4.1 HTML Template

**CSS Styling (embedded):**
- Professional B2B aesthetic: Blue (#2c5282) gradient header, clean tables
- Layout: 900px container, 2.5rem content padding
- Typography: System fonts, 1.6 line-height
- Tables: Header (#2c5282), alternating row backgrounds
- Print styles: Letter size, 0.75in margins, page-break-avoid for headings/tables

**HTML Structure:**
- Header: Gradient background with name/tagline/credentials
- Content sections: Parse markdown to HTML with styled classes
- Contact: Gray background callout box
- Footer: Metadata (version, date, source)

### 4.2 PDF Generation with Playwright

If format is `pdf`:

1. Save HTML to `/tmp/ratecard_temp_[timestamp].html`
2. Navigate: `mcp__playwright__browser_navigate` to `file://[tmp_html]`
3. Wait: 2 seconds for content load
4. Generate PDF via `browser_run_code`:
   ```javascript
   await page.pdf({
     path: '{config.directories.contractor_root}/rate-cards/rate_card_[YYYYMMDD].pdf',
     format: 'Letter',
     printBackground: true,
     margin: { top: '0.75in', bottom: '0.75in', left: '0.75in', right: '0.75in' }
   });
   ```
5. Close browser and cleanup temp file

**If PDF fails:** Fallback to HTML with manual conversion instructions

If format is `html`:
- Save to `{config.directories.contractor_root}/rate-cards/rate_card_[YYYYMMDD].html` and skip Phase 5

---

## Phase 5: Final Report

### 5.1 Success Report

```
PROFESSIONAL RATE CARD GENERATED

**Output:** {config.directories.contractor_root}/rate-cards/rate_card_[YYYYMMDD].[format] ([XX] KB)
**Source:** service_definition_[Date].md

**Pricing:**
Hourly: $[min]-$[premium]/hr ([Currency])
Daily: $[min]-$[premium]/day
[Retainer: $[min]-$[max]/mo]

**Services:** [X] offerings ([List names])

**Validation:**
- Daily = hourly x 8 (+/-10%)
- Tiers ascending
- Premium multiplier: [X.X]x
[Auto-corrections: [count] | Warnings: [count]]

**Validity:** [Start] to [End] (6 months)
[Currency conversion note if applicable]
[Credentials section if --include-justification]

**Next Steps:**
1. Review for accuracy
2. Customize: Company-specific terms, volume discounts, special tiers
3. Distribute: Email PDF, host HTML, include in proposals
4. Maintain: Quarterly reviews, annual updates
5. Related: /defineservices --update, /proposaltemplate, /findclient

**Rate Card Summary:**
================================================================
[CONSULTANT] | [CURRENCY] | VALID: [Start] to [End]
----------------------------------------------------------------
Hourly:    $[min]/hr | $[target]/hr | $[premium]/hr
Daily:     $[min]/day | $[target]/day | $[premium]/day
[Retainer: Part-time $[X]/mo, Half-time $[Y]/mo, Full-time $[Z]/mo]
----------------------------------------------------------------
PAYMENT: [Deposit]% upfront, Net [days] | MINIMUM: [hours]
================================================================
```

---

## Error Handling

**Missing Prerequisites:**
- No service definition -> Run /defineservices
- Missing rate_card section -> Show required structure, suggest /defineservices --update
- Missing source files (with --include-justification) -> Warn, continue without justification

**Validation Failures:**
- Invalid rate progression (min > target > premium) -> Refuse generation, require manual fix
- Daily != hourly x 8 (>10% variance) -> Offer auto-correction (yes/no/cancel)

**Generation Failures:**
- PDF generation fails -> Fallback to HTML with manual conversion instructions
- Currency conversion unavailable -> Keep original, warn user
- Invalid format -> Default to markdown

---

## Implementation Notes

**Pricing Validation Philosophy:**
- Auto-correct: Daily rate alignment, minor rounding
- Refuse: Rate progression violations, missing required fields
- Warn but continue: Premium multiplier outside 1.3x-2.0x, unusual retainer discounts

**Rate Card Best Practices:**
- 6-month validity, annual reviews
- Version control in YAML frontmatter
- Keep old versions for reference
- Professional B2B aesthetic: blue/gray, clean tables, generous whitespace

**Playwright PDF Pattern:** Same as /formatresume - HTML with embedded CSS -> temp file -> navigate -> page.pdf() -> cleanup

---

Now executing rate card generation with format `$1`, currency `$2`, and justification flag `$3`...

