Recalibrate estimate for SMB acceptability
Real-world feedback: list-rate calc overshot SMB-acceptable levels. - scaling: driver properties_total -> subbrands_total (chains share templates), cap x6.5 -> x2.0, applied to On-page only (Technical now fixed site-wide) - add 'smb' entry tier (lean hours @ 0.55 billing); 3-tier auto-select (smb/basic/treatment) by portfolio size; per-tier billing; --baseline smb enabled - docs (findings_to_service.md, SKILL.md) synced to 3-tier model Effect: SHR 25-property chain 71.5M -> 29.5M; SMB single hotel ~3.0M; basic/treatment still reproduce real 10.5M/25.0M at 1 property. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,19 +1,22 @@
|
||||
# Findings → estimate mapping (effort-based)
|
||||
# Findings → estimate mapping (effort-based, SMB-aware)
|
||||
|
||||
`estimate.py` builds the 견적 from `sow_templates.yaml` priced via `rate_card.yaml`:
|
||||
**cost = role_rate × billing_rate (0.70) × standard_hours**, grouped by module;
|
||||
제안가 = 합계 floored to `rounding_unit`. This mirrors OurDigital/D.intelligence's
|
||||
real SOW-based quoting.
|
||||
**cost = role_rate × billing_rate × standard_hours**, grouped by module; 제안가 = 합계
|
||||
floored to `rounding_unit`. Mirrors OurDigital/D.intelligence's real SOW-based quoting.
|
||||
|
||||
## Baseline selection (basic vs treatment)
|
||||
- `treatment` if any finding `severity == critical` **OR** `entity.properties_total > 3`
|
||||
- else `basic`
|
||||
- override with `--baseline`.
|
||||
## Tier selection (smb / basic / treatment)
|
||||
- `treatment` if `properties_total > 5` OR `subbrands_total > 3` (multi-brand / chain)
|
||||
- `smb` if `properties_total <= 1` AND `subbrands_total == 0` (single-property SMB)
|
||||
- `basic` otherwise (small multi-property / mid)
|
||||
- override with `--baseline`. **Note:** tiering is by portfolio size only — quote a
|
||||
single *premium* property as `basic`/`treatment` manually.
|
||||
|
||||
Per-tier billing: `smb` uses `billing_rate: 0.55` (set in sow_templates); `basic`/
|
||||
`treatment` use `rate_card.billing_rate` (0.70). Override with `--billing`.
|
||||
|
||||
## Module inclusion
|
||||
Each baseline carries the standard module set (P&M · Technical SEO · On-page SEO ·
|
||||
SEO Growth), matching real quotes. Findings justify modules via the `trigger` field
|
||||
in `sow_templates.yaml`:
|
||||
Each tier carries its standard module set (P&M · Technical SEO · On-page SEO ·
|
||||
SEO Growth). Findings annotate modules via the `trigger` field:
|
||||
|
||||
| Module | trigger finding classes |
|
||||
|---|---|
|
||||
@@ -23,18 +26,21 @@ in `sow_templates.yaml`:
|
||||
| SEO Growth | measurement, always |
|
||||
|
||||
## Hours scaling (portfolio)
|
||||
Tasks marked `scale: true` (Technical SEO + On-page SEO) have their **hours**
|
||||
multiplied sub-linearly by `entity.properties_total` per `rate_card.scaling.bands`.
|
||||
P&M and SEO Growth stay fixed (management/KPI overhead is ~flat). A single-property
|
||||
prospect → ×1.0, which reproduces the real single-site quotes exactly.
|
||||
Only **On-page** tasks (`scale: true`) scale, sub-linearly, by the
|
||||
`rate_card.scaling.driver` (= `subbrands_total`, i.e. distinct brands/templates),
|
||||
capped at **×2.0**. Rationale: chains share page templates, so on-page work grows
|
||||
with template variety, not raw property count. **Technical SEO is fixed** site-wide
|
||||
work (`scale: false`); P&M and SEO Growth are fixed too. Single-brand → ×1.0.
|
||||
|
||||
## Tools & terms
|
||||
`tools` (e.g. SEMrush Guru) are listed separately — client-subscribed, with +15%
|
||||
procurement markup if billed through us. VAT 별도 · 유효기간 14d · 현금 · 절사 from
|
||||
`rate_card.terms`.
|
||||
`tools` (e.g. SEMrush Guru) listed separately — client-subscribed, +15% procurement
|
||||
markup if billed through us. VAT 별도 · 유효기간 14d · 현금 · 절사 from `rate_card.terms`.
|
||||
|
||||
## Validated reproduction (2026-05-28)
|
||||
## Validated (2026-05-28)
|
||||
- `basic` ×1.0 → 합계 10,612,000 → 제안가 **10,500,000** (real Basic quote)
|
||||
- `treatment` ×1.0 → 합계 25,340,000 → 제안가 **25,000,000** (real Treatment quote)
|
||||
- `basic` ×1.0 → 합계 10,612,000 → 제안가 **10,500,000** (real Basic quote)
|
||||
- `smb` single property → ~**3,000,000** (lean × 55% billing)
|
||||
- chain example (SHR, 5 sub-brands ×1.6, treatment) → ~**29,500,000** (vs naive 71.5M)
|
||||
|
||||
Edit `rate_card.yaml` and `sow_templates.yaml` together when rates or standard hours change.
|
||||
Edit `rate_card.yaml` + `sow_templates.yaml` together when rates, hours, tiers, or
|
||||
scaling change.
|
||||
|
||||
@@ -42,11 +42,13 @@ role_rates:
|
||||
associate: 30000 # 사원
|
||||
intern: 12000 # 인턴
|
||||
|
||||
# 포트폴리오 규모에 따른 '시간' 스케일(서브선형). scale:true 인 task 에만 적용.
|
||||
# driver: findings.entity 의 카운트. bands: [최대값, 배수]; count <= 최대값 인 첫 밴드.
|
||||
# 포트폴리오 규모에 따른 '시간' 스케일(서브선형). On-page(scale:true) task 에만 적용.
|
||||
# driver = findings.entity 의 카운트. 체인은 페이지 템플릿을 공유하므로 '프로퍼티 수'가 아닌
|
||||
# '브랜드/템플릿 수(subbrands_total)'를 기준으로 하고, 캡을 ×2.0 로 낮게 둔다.
|
||||
# (Technical SEO 는 사이트 단위 고정 작업이므로 스케일하지 않음 — sow_templates 의 scale:false)
|
||||
scaling:
|
||||
driver: properties_total
|
||||
bands: [[1, 1.0], [5, 1.6], [15, 2.8], [30, 4.5], [999999, 6.5]]
|
||||
driver: subbrands_total
|
||||
bands: [[1, 1.0], [3, 1.3], [6, 1.6], [999999, 2.0]]
|
||||
|
||||
# 별도 조달 항목(인력비와 분리). 청구 시 procurement_markup 적용 가능.
|
||||
tools:
|
||||
|
||||
@@ -1,13 +1,40 @@
|
||||
# SOW task templates — standard 업무 시간(hours) by module.
|
||||
# Seeded from the two real OurDigital quotes so estimate.py reproduces them at
|
||||
# billing_rate 0.70:
|
||||
# basic -> 제안가 ₩10,500,000 (SEO Basic & Coaching, 3개월 프로젝트)
|
||||
# treatment -> 제안가 ₩25,000,000 (SEO Audit & Treatment, 월 정기)
|
||||
# task.role references rate_card.role_rates. scale:true → hours scaled by portfolio.
|
||||
# trigger: finding classes that justify the module (for annotation + selection).
|
||||
# Priced via rate_card.yaml: cost = role_rate × billing_rate × hours.
|
||||
# Tiers (제안가 at default billing): smb < basic < treatment.
|
||||
# basic -> ₩10,500,000 (real SEO Basic & Coaching quote, billing 0.70)
|
||||
# treatment -> ₩25,000,000 (real SEO Audit & Treatment quote, billing 0.70)
|
||||
# smb -> lean entry tier for single-property SMBs (billing 0.55)
|
||||
# Scaling: only On-page tasks (scale:true) scale by sub-brands/templates
|
||||
# (rate_card.scaling); Technical SEO is fixed site-wide work. P&M & Growth fixed.
|
||||
# Each baseline may override billing_rate; else rate_card.billing_rate (0.70).
|
||||
|
||||
baselines:
|
||||
|
||||
smb:
|
||||
service: "SEO Quick Audit (SMB)"
|
||||
billing_rate: 0.55 # SMB 진입 티어 — 낮은 청구율
|
||||
modules:
|
||||
- name: "Planning & Management"
|
||||
trigger: [always]
|
||||
tasks:
|
||||
- {task: "업무 관리·착수", desc: "과업 정의·일정·리포팅", role: senior_manager, hours: 8, scale: false}
|
||||
- {task: "웹 사이트 분석", desc: "유입·행동·전환 flow 요약 분석", role: senior_manager, hours: 8, scale: false}
|
||||
- name: "Technical SEO"
|
||||
trigger: [crawlability, cwv, schema_entity]
|
||||
tasks:
|
||||
- {task: "Crawling·Indexing 점검", desc: "검색사이트 등록·수집·Site Health 점검", role: manager, hours: 8, scale: false}
|
||||
- {task: "속도·CWV 점검", desc: "로딩속도·Core Web Vitals·모바일 점검", role: manager, hours: 8, scale: false}
|
||||
- {task: "구조·메타·사이트맵 점검", desc: "사이트/URL 구조·메타·사이트맵·색인", role: manager, hours: 8, scale: false}
|
||||
- name: "On-page SEO"
|
||||
trigger: [onpage, schema_entity]
|
||||
tasks:
|
||||
- {task: "키워드·메타 진단", desc: "중점 키워드·페이지 메타·템플릿 진단", role: manager, hours: 12, scale: true}
|
||||
- {task: "on-page 퀵윈 가이드", desc: "타이틀·메타·헤더·링크·이미지 핵심 개선 가이드", role: manager, hours: 16, scale: true}
|
||||
- name: "SEO Growth"
|
||||
trigger: [measurement, always]
|
||||
tasks:
|
||||
- {task: "기본 성과 지표 설정", desc: "핵심 SEO 지표·중점 키워드 트래킹 설정", role: manager, hours: 8, scale: false}
|
||||
|
||||
basic:
|
||||
service: "SEO Audit & Basic Treatment"
|
||||
modules:
|
||||
@@ -19,10 +46,10 @@ baselines:
|
||||
- name: "Technical SEO"
|
||||
trigger: [crawlability, cwv, schema_entity]
|
||||
tasks:
|
||||
- {task: "Crawling & Indexing 설정", desc: "검색사이트 등록/수집 관리, Site Health Check 도구 설정", role: technical_advisor, hours: 16, scale: true}
|
||||
- {task: "속도·UX·수집 설정", desc: "로딩속도·페이지 UX·링크·수집 제외 설정", role: manager, hours: 16, scale: true}
|
||||
- {task: "사이트/URL 구조·메타", desc: "구조·URL·메타데이터·사이트맵·리다이렉션", role: senior_manager, hours: 12, scale: true}
|
||||
- {task: "색인·CWV 진단", desc: "GSC·SEO Tools 활용 색인/크롤오류/Core Web Vitals 진단", role: senior_manager, hours: 16, scale: true}
|
||||
- {task: "Crawling & Indexing 설정", desc: "검색사이트 등록/수집 관리, Site Health Check 도구 설정", role: technical_advisor, hours: 16, scale: false}
|
||||
- {task: "속도·UX·수집 설정", desc: "로딩속도·페이지 UX·링크·수집 제외 설정", role: manager, hours: 16, scale: false}
|
||||
- {task: "사이트/URL 구조·메타", desc: "구조·URL·메타데이터·사이트맵·리다이렉션", role: senior_manager, hours: 12, scale: false}
|
||||
- {task: "색인·CWV 진단", desc: "GSC·SEO Tools 활용 색인/크롤오류/Core Web Vitals 진단", role: senior_manager, hours: 16, scale: false}
|
||||
- name: "On-page SEO"
|
||||
trigger: [onpage, schema_entity]
|
||||
tasks:
|
||||
@@ -46,10 +73,10 @@ baselines:
|
||||
- name: "Technical SEO"
|
||||
trigger: [crawlability, cwv, schema_entity]
|
||||
tasks:
|
||||
- {task: "Crawling & Indexing 설정", desc: "검색사이트 등록/수집 관리, Site Health Check 도구 설정", role: manager, hours: 24, scale: true}
|
||||
- {task: "속도·UX·리다이렉트", desc: "로딩속도·페이지 UX·링크·리다이렉트·수집 제외 설정", role: technical_advisor, hours: 30, scale: true}
|
||||
- {task: "사이트/URL 구조·보안", desc: "구조·URL·메타데이터·사이트맵·보안 관리 진단", role: senior_manager, hours: 24, scale: true}
|
||||
- {task: "모바일·CWV·개선과제", desc: "모바일 최적화·Core Web Vitals 진단·개선 과제 도출", role: manager, hours: 20, scale: true}
|
||||
- {task: "Crawling & Indexing 설정", desc: "검색사이트 등록/수집 관리, Site Health Check 도구 설정", role: manager, hours: 24, scale: false}
|
||||
- {task: "속도·UX·리다이렉트", desc: "로딩속도·페이지 UX·링크·리다이렉트·수집 제외 설정", role: technical_advisor, hours: 30, scale: false}
|
||||
- {task: "사이트/URL 구조·보안", desc: "구조·URL·메타데이터·사이트맵·보안 관리 진단", role: senior_manager, hours: 24, scale: false}
|
||||
- {task: "모바일·CWV·개선과제", desc: "모바일 최적화·Core Web Vitals 진단·개선 과제 도출", role: manager, hours: 20, scale: false}
|
||||
- name: "On-page SEO"
|
||||
trigger: [onpage, schema_entity]
|
||||
tasks:
|
||||
|
||||
Reference in New Issue
Block a user