Skip to content

feat(web): move Hire Us pricing to $400/hour metered billing (PRD 0002) - #102

Merged
ralyodio merged 2 commits into
masterfrom
feat/hourly-hire-us-rate
Jul 28, 2026
Merged

feat(web): move Hire Us pricing to $400/hour metered billing (PRD 0002)#102
ralyodio merged 2 commits into
masterfrom
feat/hourly-hire-us-rate

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

Implements PRD 0002. Replaces the $250/week retainer with a $400/hour rate billed against actual hours, invoiced through CoinPay after the client approves them. A 10-hour minimum engagement replaces the week as the unit of commitment.

The two decisions the PRD was blocked on

  • $400/hour, confirmed deliberately. ~64x the weekly figure at a 40-hour week. That's the point — the old number was a token retainer, not a rate.
  • Metered actual hours, not a committed weekly block. Chosen partly because the old "recurring CoinPay invoice" copy documented a mechanic that never existed: /api/payments/create creates a single one-shot payment, never a subscription. A committed block would also just be a weekly rate wearing an hourly label.

Scope was wider than the PRD listed

The PRD named 3 front-page spots plus /hire-us. The weekly price actually lived in 12 places — the four it missed entirely were /pricing (metadata, two FAQ answers, rate bullet), /about, llms.txt, skill.md, and the Hire Us form's success message.

Code, not just copy

  • coinpay-checkout derives amount_usd from hours × 400 instead of a hardcoded 250, validates hours as quarter-hour increments at or above the minimum, and returns 422 before calling CoinPay on bad input. Metadata carries billing/hours/rate_usd_per_hour in place of interval.
  • project-request returns a rate + billing mode + minimum; no amount exists until hours are approved.
  • CoinPay config block now documents COINPAY_RATE_USD_PER_HOUR=400 / COINPAY_BILLING=metered_hours / COINPAY_MINIMUM_HOURS=10.
  • New real /terms route (R9) replacing the SPA stub: what is billable, the approve-then-invoice flow, the minimum, cancellation on one week's notice, and an explicit clause that existing engagements keep their terms until both sides agree in writing — making the "no silent repricing" success metric enforceable rather than aspirational.

Verification

  • 51/51 contract tests pass (3 new: hours-derived pricing, minimum/increment rejection, updated fallback)
  • tsc --noEmit clean
  • next build succeeds, /terms emits as a static route
  • 5/5 Playwright e2e pass
  • R6 grep over tracked files returns zero stale pricing references

Known gaps (recorded in the PRD, not fixed here)

  • Hours capture is an operational process with no tooling. /terms defines what is billable, so the definition is settled even though the mechanism isn't.
  • Whether any active $250/week clients exist is unknown; the terms page protects them either way.

🤖 Generated with Claude Code

Replaces the $250/week retainer with a $400/hour rate billed against actual
hours, invoiced through CoinPay after the client approves them. A 10-hour
minimum engagement replaces the week as the unit of commitment.

The weekly price lived in 12 places, not the 3 the PRD listed: the front-page
Hire Us section, the Top-Level Pages list, /hire-us metadata, /pricing
(metadata, two FAQ answers, rate bullet), /about, llms.txt, skill.md, and the
Hire Us form success message.

Metered billing rather than a committed weekly block, because the old
"recurring CoinPay invoice" copy documented a mechanic that never existed:
/api/payments/create makes a single one-shot payment, not a subscription.

- coinpay-checkout derives amount_usd from hours x 400 instead of a hardcoded
  250, validates hours as quarter-hour increments at or above the minimum, and
  returns 422 before calling CoinPay on bad input. Payment metadata carries
  billing/hours/rate_usd_per_hour in place of interval.
- project-request returns a rate, billing mode, and minimum; no amount exists
  until hours are approved.
- CoinPay config block documents COINPAY_RATE_USD_PER_HOUR / COINPAY_BILLING /
  COINPAY_MINIMUM_HOURS instead of a weekly amount and interval.
- New real /terms route replacing the SPA stub: what is billable, the
  approve-then-invoice flow, the minimum, cancellation on one week's notice,
  and an explicit clause that existing engagements keep their terms until both
  sides agree in writing.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

vu1nz Security Review

0 finding(s) in PR #?

No security issues found.

The standards test asserts prd_next_id against the live prd/ directory, so
adding prd/0002-hourly-hire-us-rate.md moves the next free id to 0003. This
assertion advances with every PRD added to the repo.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@ralyodio
ralyodio merged commit eaf0a61 into master Jul 28, 2026
5 checks passed
@ralyodio
ralyodio deleted the feat/hourly-hire-us-rate branch July 28, 2026 17:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant