# PQL Scoring & Ops Framework (Cross-Market) — Skeleton

> **Status: 1-page skeleton / placeholder.** Abstracted from the EMEA round (see `EMEA/emea-pql-model-upgrade/`). Fill in per market **after** EMEA's three queues are live and validated by ops. Keep it operational, not enterprise-heavy.

---

## Core principle

**Surface action queues + priority floors before rewriting scores.** Behaviors (events) are read on a recency window; states are read as-of-now. Prefer reversible flags over weight rewrites.

---

## 1. Data inputs

| Input | Examples | Notes |
|---|---|---|
| Tenant | id, name, domain | join key |
| Enrichment | billing, credit card, credits, cluster count, domain/company category | from monitor layer |
| Usage | QPS, import events, cluster count | workload signal source |
| Billing | paid / credit card, spending limit | commercial signal source |
| Events | import, spending-limit, premium open | **windowed** (see §2) |
| Attribution *(optional)* | `ga_channel`, UTM source/medium/campaign | raw fields only, no inference; one row per tenant |

---

## 2. Signals

| Signal | Reads | Window rule |
|---|---|---|
| **Workload intent** | import, sustained QPS, active POC | **event → recency window** (e.g. import 7d) |
| **Commercial intent** | paid, spending-limit, paid-but-unconnected | paid = **state, as-of-now**; spending-limit = **event, windowed** (e.g. 30d) |
| **Fit** | AI category / company category | state |
| **Engagement state** | connected / email / N/A (`track_step`) | state; *unconnected* must be NULL-safe |
| **Data quality** | unknown category, stale, errors | guardrail / watch |

> **Event vs state rule:** event-type signals (import, spending-limit, premium-open) get a recency window; state-type signals (paid, fit, engagement) are read current. Don't window a state — you'll drop quietly-good standing accounts.

---

## 3. Queues

| Queue | Definition (shape) | Priority |
|---|---|---|
| **P0 urgent** | import + strong usage/fit; high QPS; active POC with meaningful fit | P0 |
| **P1 high-intent** | paid-unconnected, spending-limit-unconnected (windowed), AI/company fit, multi-cluster-without-connected | P1, **floored** |
| **P2 nurture / monitor** | weak/early signal, premium-alone (watch) | P2 |
| **CS / OPS overlay** | existing-customer or hand-off cases routed to CS | overlay |

**Priority floor (monotonic, raise-only):** designated commercial signals (paid-unconnected, recent spending-limit) guarantee a *minimum* P1; never demote; never auto-promote to P0. Premium alone gets no floor; import stays stronger than premium.

---

## 4. Operating loop

- **Daily queue** — active list for operators (filter to active candidates).
- **Weekly trend** — all-actionable P0/P1; **must include new signups**, not just active-candidate filter.
- **Definition audit** — periodically re-check window lengths, floor rules, `connected` meaning, and re-snapshot baseline after any scoring change.

---

## 5. Market adaptation *(placeholder — fill after EMEA validation)*

> Do not build out until a market actually adopts the loop. Keep ownership simple; avoid owner matrices.

- **EMEA** — Kerry/TSE (outreach) + Lijia/Heidi (ops). Two operators; lightweight. *(reference implementation)*
- **APAC** — TBD (could split SDR vs AE).
- **NA** — TBD (likely HubSpot / sales-owner-first).
