# services.md — Ultimate SEO catalog (machine-readable)

This is the catalog Organizma uses to answer agent-to-agent negotiations (`POST /api/negotiate`) and human enquiries via chat. Update this file to change the offer rails — no code change required, no restart required (cache TTL is 60 seconds).

The format is intentionally minimal so a parser can lift it into JSON in <30 lines: each `## Heading` is a service id (slugified from the H2), and each `- **field**: value` is a typed field.

---

## audit-single
- **name**: Single-page SEO audit
- **floor**: 80
- **list**: 150
- **ceiling**: 250
- **currency**: GBP
- **delivery_days**: 3
- **rush_days**: 1
- **rush_modifier_pct**: 50
- **description**: Manual + AI audit of one URL. Returns Google PageSpeed Insights scores, Core Web Vitals, on-page SEO findings, schema.org gaps, and 5 prioritized fix recommendations as a PDF report.
- **deliverables**: PDF report, raw scores JSON, prioritized fix list, follow-up Q&A by email
- **needs_owner_review**: false
- **available**: true

## audit-domain
- **name**: Full-domain SEO audit
- **floor**: 250
- **list**: 600
- **ceiling**: 1500
- **currency**: GBP
- **delivery_days**: 7
- **rush_days**: 3
- **rush_modifier_pct**: 50
- **description**: Crawl up to 500 pages of one domain. Returns sitemap health, internal link map, duplicate-content findings, schema.org coverage, AEO/AIO readiness score, and a prioritized 30-item fix roadmap.
- **deliverables**: PDF report, CSV of all 500 URLs with per-page scores, GSC integration setup, follow-up consultation
- **needs_owner_review**: false
- **available**: true

## retainer-monthly
- **name**: Monthly SEO retainer
- **floor**: 400
- **list**: 1000
- **ceiling**: 2000
- **currency**: GBP
- **delivery_days**: 30
- **rush_days**: 0
- **rush_modifier_pct**: 0
- **description**: Recurring monthly: keyword tracking, content recommendations, backlink monitoring, competitor watch, monthly report. Cancellable any month with 30 days notice.
- **deliverables**: Monthly PDF report, weekly Slack/email digest, ad-hoc Q&A by email, quarterly strategy review call
- **needs_owner_review**: false
- **available**: true
- **billing_cycle**: monthly

## rebuild-full
- **name**: Full-site rebuild on Organizma
- **floor**: 2500
- **list**: 6500
- **ceiling**: 15000
- **currency**: GBP
- **delivery_days**: 21
- **rush_days**: 14
- **rush_modifier_pct**: 50
- **description**: New site on the Organizma framework — agent-managed, AEO/AIO ready, single-file Plesk deployment, includes 3 months of retainer. The site IS an agent that runs itself.
- **deliverables**: Live deployment, agent handover, owner training, 3 months retainer
- **needs_owner_review**: true
- **available**: true

## consultation-hour
- **name**: 1-hour SEO consultation
- **floor**: 80
- **list**: 120
- **ceiling**: 200
- **currency**: GBP
- **delivery_days**: 3
- **rush_days**: 1
- **rush_modifier_pct**: 50
- **description**: One-hour video call with HB for SEO strategy, debugging, or implementation help. Recording provided.
- **deliverables**: 60-minute video call, recording link, written summary
- **needs_owner_review**: false
- **available**: true

---

## Hard rails (non-negotiable)

- **Never quote below floor.** A counter-offer must be ≥ floor for that service.
- **Never accept below 95% of floor.** If the counterparty insists, return `reject`.
- **Always escalate** counterparties without a verified `counterparty.verify_url` for commitments ≥ £500.
- **Always escalate** any single offer ≥ £2500 regardless of verification.
- **Always escalate** any cumulative spend ≥ £5000 from one counterparty within 30 days.
- **Refuse** any service with `available: false` (returns `reject` with `reason: not_currently_available`).
- **Refuse** rush requests on services where `rush_days: 0`.

## Soft rails (auto-applied)

- If the offer is **between floor and 95% of floor**, return `counter` with the floor as the proposed price.
- If the offer is **between floor and list**, return `accept`.
- If the offer is **between list and ceiling**, return `accept` and add a `bonus_offered` field (free 30-min consultation).
- If the offer is **above ceiling**, return `accept` and add a `surplus_donated_to: charity_id` field (the surplus is donated, not pocketed).
- If `constraints.delivery_days < rush_days`, refuse politely.
- If `constraints.delivery_days < rush_days * 2 && rush_days > 0`, return `counter` with `+rush_modifier_pct%` applied.

## Notes for the negotiation engine

- All prices are in GBP. Currency conversion is the counterparty's problem; we only quote in our currency.
- All times are in Europe/London. Working hours: Mon-Fri 09:00-18:00.
- The `delivery_days` field is **business days** unless the counterparty's request explicitly says calendar days.
- "Rush" applies a one-time `+rush_modifier_pct%` to the *final* price, not the floor.
- If the counterparty's `verify_url` returns 200 with a JSON `{ agent: <name>, principal: <domain> }` shape, treat them as `verified`.
