Uma Claude Skill que escaneia os últimos sete dias de calls de CSM, anomalias de uso e tickets de suporte em todo o seu portfólio de clientes e emite um digest ranqueado por CSM de contas com intenção concreta de expansão. Cada conta exibida nomeia o SKU de upsell, as evidências verbatim que a sustentam e uma única next-best action que o CSM pode tomar nessa semana. O bundle é entregue em apps/web/public/artifacts/expansion-signal-detection-claude/ e contém SKILL.md mais três arquivos de referência que a equipe edita para corresponder ao próprio lineup de SKUs, baselines de segmento e playbook de ações de CSM.
Quando usar
Use esta skill quando sua equipe de CS gerencia mais contas do que qualquer humano consegue escanear manualmente toda semana, e você tem pelo menos duas fontes de dados sobrepostas para combinar — tipicamente calls de CSM gravadas no Gong mais anomalias de uso do Gainsight (ou emitidas pelo warehouse). A skill foi projetada para equipes de três ou mais CSMs com um portfólio de pelo menos 100 contas; abaixo dessa escala, um líder de CSM lendo cada call manualmente supera qualquer digest automatizado, porque o humano vê contexto que o arquivo de taxonomia não codifica.
A cadência certa é semanal — tipicamente na segunda-feira de manhã, antes da reunião de revisão de contas da equipe — e a saída certa é um Slack DM pessoal por CSM, limitado a três sinais fortes cada. O limite importa: em pilotos, um digest de CSM com 10 ou mais “contas engajadas” é lido por duas semanas e depois ignorado permanentemente. Três pedidos concretos por semana, repetidos toda segunda-feira, é a cadência que a equipe realmente internaliza.
Quando NÃO usar
Você quer alertas em tempo real sobre eventos individuais. Pings por evento inundam os CSMs e destroem a confiança no canal em duas semanas. A cadência semanal é deliberada. Se o seu CRO insiste em tempo real, espere o digest ser silenciado até o Q2.
Você ainda não tem anomalias de uso em um feed estruturado. A skill consome eventos de anomalia pré-emitidos; ela não os detecta de streams de eventos brutos. Se o Gainsight não está disparando eventos seat_count_spike, feature_first_use e tier_gated_feature_attempt, corrija esse pipeline primeiro — a skill em cima de um feed vazio produz um digest com apenas calls, o que colapsa cada sinal para fraco.
Os CSMs não estão registrando calls. Se menos de 60 por cento das contas têm uma call registrada na janela de análise, a metade de conversa de cada conjunto de sinais está vazia e a maioria dos sinais colapsa para fraco. Audite a adoção do Gong antes de depender disso. A skill aborta a execução com um erro de cobertura se a taxa cair abaixo de 40 por cento, em vez de emitir um digest de meio sinal.
Você quer criar CTAs no Gainsight automaticamente ou enviar e-mails a clientes automaticamente. Esta skill é sinal read-only. A saída foi projetada como preparação pré-reunião do CSM, não como trigger de workflow. Conectar uma camada de ação automática downstream é a forma mais rápida de enviar ao CFO um e-mail “notamos que você se beneficiaria do nosso tier enterprise” na semana depois que o champion deles acabou de sair.
Você quer uma previsão de expansion-ARR. A saída é sinal de intenção por conta, não um número para inserir em uma previsão financeira. A previsão de expansion-ARR requer calibração de taxa de fechamento que a skill não tem.
Setup
O bundle de artefatos é entregue em apps/web/public/artifacts/expansion-signal-detection-claude/. Faça o download, edite os três arquivos de referência para corresponder à sua realidade e instale a Skill.
Baixe e descompacte o bundle. Coloque expansion-signal-detection-claude/ em ~/.claude/skills/. O layout é SKILL.md mais references/1-expansion-signal-taxonomy.md, references/2-segment-baseline-config.md e references/3-action-library.md.
Construa a taxonomia de sinais. Edite references/1-expansion-signal-taxonomy.md com seus SKUs de upsell reais e as frases de trigger de call, tipos de evento de uso e tags de ticket de suporte que mapeiam para cada um. Seja específico: não “mais usuários”, mas “perguntou sobre preços para 50 ou mais assentos” ou “mencionou requisitos de compliance”. A seção de exemplos negativos captura frases condicionais (“se você suportasse X”) que parecem intenção, mas são na verdade relatórios de gap de feature — mantenha-a calibrada, porque uma lista de exemplos negativos desatualizada é a causa mais comum de inundação de falsos positivos.
Calibre as baselines de segmento. Edite references/2-segment-baseline-config.md com valores calculados em uma janela de 90 dias sobre seu warehouse de uso. Por segmento, liste o delta semanal mediano e a banda de ruído de dois sigmas para cada métrica. A skill rejeita eventos cujo delta_pct cai dentro da banda de ruído mesmo quando cruzaram o limite global do emissor — isso é o que impede o ruído de contagem de assentos de PMEs de sufocar expansão genuína de enterprise.
Preencha a biblioteca de ações. Edite references/3-action-library.md com uma ou mais next-best actions por SKU. Cada entrada deve seguir o formato verbo mais artefato nomeado (uma reunião, uma pessoa, um documento, um ticket) — a skill impõe isso com um filtro de substring literal no campo Action emitido, substituindo qualquer coisa vaga por needs human review.
Conecte as fontes de dados. Defina GONG_API_KEY para extração de transcrições, GAINSIGHT_TOKEN para o feed de eventos de uso e contas e seu token de API de ticket de suporte (Zendesk, Intercom ou Helpscout, conforme seu stack). A skill lê anomalias pré-calculadas do feed de uso; ela não executa detecção de anomalias por conta própria.
Execute semanalmente. Invoque expansion_signal_detection(window_days=7) a partir de uma sessão agendada do Claude Code (cron ou workflow_dispatch do GitHub Actions em um trigger semanal). A saída é um arquivo Markdown por proprietário CSM, postado como Slack DM em vez de post em canal público — o objetivo é responsabilidade por CSM, não um placar público que a equipe aprende a rolar sem ver.
O que a skill realmente faz
O corpo do trabalho são seis etapas sequenciais documentadas em detalhes no SKILL.md do bundle. O formato:
Coleta de evidências por conta. Reúne cada call, evento de uso e ticket na janela. Remove contas sem registros para que o silêncio não dilua a lista ranqueada.
Filtragem de baseline por segmento. Para cada evento de uso, consulta a banda de ruído do segmento em references/2-segment-baseline-config.md e descarta eventos dentro da banda. O motivo para baselines por segmento em vez de um único limite global: um salto de 30 por cento semana a semana em assentos significa coisas diferentes para uma PME de 5 assentos e uma enterprise de 500 assentos. Um único limite global garante que a banda de PME sufoque a banda de enterprise.
Extração de sinais de calls e tickets. Executa um prompt de extração contra cada transcrição e ticket usando as frases de trigger em references/1-expansion-signal-taxonomy.md, com a camada de exemplos negativos classificando explicitamente frases condicionais como not_signal.
Classificação forte vs fraco. Um sinal é forte apenas quando pelo menos uma menção em call E pelo menos um evento de uso incidem no mesmo SKU dentro da janela. Qualquer outra coisa é fraco. O motivo para a divisão em vez de uma única pontuação e ranqueamento: o roteamento difere. Sinais fortes justificam o CSM enviar um convite de reunião nessa semana; sinais fracos justificam uma olhada durante a revisão normal de conta. Colocar sinais fracos na lista ranqueada treina o CSM a ignorar a lista ranqueada.
Roteamento e priorização por CSM. Agrupa sinais fortes por owner_email, ordena por ARR decrescente depois renewal_date crescente, aplica cap_per_csm (padrão três).
Mapeamento de ações e emissão. Consulta cada sinal exibido em references/3-action-library.md e anexa a next-best action correspondente. Se nenhuma entrada corresponde, exibe needs human review em vez de sintetizar uma — ações vagas são o modo de falha que desgasta a confiança mais rapidamente.
Realidade de custos
O custo dominante de tokens é a etapa de extração de calls. Uma execução semanal típica para um portfólio de 200 contas com uma call de CSM por conta por semana roda aproximadamente:
200 transcrições com uma média de 6.000 tokens cada = 1,2M tokens de input para extração.
200 resumos de corpo de ticket com cerca de 800 tokens cada = 0,16M tokens de input.
Síntese por conta (200 contas, cerca de 2.000 input + 500 output tokens cada) = 0,4M input + 0,1M output.
Total por execução semanal: aproximadamente 1,76M tokens de input, 0,1M tokens de output.
No preço do Claude Sonnet (cerca de $3 por milhão de input, $15 por milhão de output até o Q1 de 2026), isso dá cerca de $5,30 + $1,50 = menos de $7 por execução semanal. Anualizado: menos de $400 por ano por portfólio de 200 contas. Em um portfólio de 1.000 contas com cobertura de calls similar, escale linearmente para menos de $2.000 por ano. O piso de custo é a etapa de extração de calls; se seus CSMs registram poucas calls, a conta cai proporcionalmente e a qualidade do sinal também.
O custo oculto é a manutenção da taxonomia. Espere que um líder de CSM gaste cerca de 30 minutos por trimestre editando references/1-expansion-signal-taxonomy.md e a biblioteca de ações, e uma sessão ad-hoc mais longa sempre que um novo SKU é lançado. Pular essa manutenção é o que faz o digest ficar obsoleto — a skill continua emitindo saída confiante contra um lineup de SKUs que não existe mais.
Métricas de sucesso
A métrica a acompanhar é a taxa de conversão de sinais fortes confirmada pelo CSM em conversas de expansão dentro de 14 dias. Acompanhe em uma janela de 30 dias consecutivos. Baselines iniciais de equipes piloto ficam na faixa de 25-40 por cento — significando que cerca de um em três sinais fortes leva a uma conversa real que o CSM não teria tido de outra forma naquele mês. Abaixo de 20 por cento por dois meses consecutivos significa que o corte forte vs fraco está muito frouxo ou a biblioteca de ações está muito vaga; ajuste a taxonomia ou reescreva metade das ações antes de continuar.
Métrica de lagging: contribuição de expansion-ARR atribuída ao digest, acompanhada no fechamento trimestral. Isso é mais difícil de medir de forma limpa porque conversas de expansão têm muitas causas, mas um campo de pesquisa com o CSM em cada expansão ganha (“o digest exibiu essa conta antes de você abrir a conversa?”) é um proxy bom o suficiente.
vs alternativas
vs Gainsight Expansion Management. O módulo nativo do Gainsight ranqueia contas em uma única pontuação composta e roteia via CTAs. Funciona, mas é opaco — quando um CSM discorda do ranqueamento, não pode editar um arquivo de configuração, apenas abrir um ticket com o admin. Esta skill mantém a lógica de ranqueamento em três arquivos de texto simples que o líder de CSM possui e edita diretamente. Escolha Gainsight quando sua equipe de CS-Ops quer um sistema fechado; escolha esta quando eles querem que a equipe seja dona das regras.
vs QBRs manuais conduzidos pelo CSM. Um CSM sênior rodando uma revisão pessoal no Notion de seu book of business supera qualquer digest na escala abaixo de 50 contas porque ele tem contexto que a taxonomia não consegue codificar. Em 100+ contas por CSM a matemática vira: ninguém consegue escanear tantas transcrições semanalmente. O digest é um multiplicador de força, não uma substituição, e a biblioteca de ações foi intencionalmente moldada para encorajar o CSM a fazer a conversa, não a skill.
vs dashboards genéricos de BI. Um dashboard Looker de “contas com picos de uso” produz uma lista toda semana que ninguém age porque não há SKU nomeado, nenhuma evidência verbal de call e nenhuma próxima ação. O valor do digest é a fusão mais a ação, não o ranqueamento — sem o mapa de SKU e a biblioteca de ações, você acaba com uma versão mais lenta do dashboard.
Pontos de atenção
Inundação de falsos positivos. Quando o prompt de extração de calls está frouxo, a lista de sinais fortes incha para 10 ou mais por CSM por semana. Proteção: imponha cap_per_csm estritamente, e se a lista forte de qualquer CSM único exceder o limite em três execuções consecutivas, adicione um aviso de que o corte forte vs fraco está muito frouxo e link para references/1-expansion-signal-taxonomy.md para ajuste. Não trunce silenciosamente.
Má interpretação de sinal — armadilha de saída do champion. Um pico de uso logo após o champion nomeado sair é um sinal de risco de expansão, não de intenção de expansão — o novo responsável está explorando antes de decidir se mantém o contrato. Proteção: cruze cada sinal forte com stakeholder_changes. Se um champion na conta saiu nos últimos 30 dias, rebaixe para fraco e marque com champion-departure suppressed: investigate before pursuing. A skill nunca deve rotear um pedido de expansão para uma conta que acabou de perder seu champion.
Deriva de threshold. Frases de trigger e mapeamentos de SKU ficam obsoletos conforme o produto muda. Um novo SKU lançado há dois meses tem zero entradas na taxonomia até alguém adicioná-las, e cada sinal para ele é silenciosamente roteado de forma errada. Proteção: inclua o SHA-256 (primeiros sete caracteres) de references/1-expansion-signal-taxonomy.md no rodapé de diagnósticos. Se o arquivo não foi tocado em 90 dias, adicione um aviso de que a taxonomia está obsoleta e link para o arquivo para recalibração.
Má classificação de menções condicionais. “Consideraríamos expandir se você suportasse X” parece intenção de expansão à primeira vista, mas é na verdade um relatório de gap de feature. Proteção: a camada de exemplos negativos na etapa de extração classifica explicitamente frases condicionais (“se”, “consideraria”, “pensando em”) como not_signal. O diagnóstico expõe com que frequência isso dispara — se nunca dispara, a camada está quebrada; se dispara constantemente, o mapeamento de SKU precisa de reformulação.
Colapso de especificidade de ação. Sob carga, o modelo vai para sugestões do tipo “fazer follow-up na oportunidade”. Proteção: o filtro de pós-processamento na etapa 6 rejeita qualquer campo Action contendo verbos vagos (follow up, reach out, touch base, align, socialize, engage) sem uma pessoa, reunião ou documento nomeado, substituindo por needs human review. Melhor silêncio do que ruído.
Stack
Gong — corpus de calls de CSM e API de transcrição
Gainsight — fonte de anomalias de uso e feed de contas
Zendesk / Intercom / Helpscout — fonte de tickets de suporte para sinais de perguntas de integração
Claude — extração de sinais, filtragem de baseline por segmento, classificação forte vs fraco, mapeamento de ações
---
name: expansion-signal-detection
description: Weekly account-portfolio scan that fuses CSM-call mentions with usage anomalies, classifies expansion intent into weak vs strong signals, and emits a per-CSM ranked digest mapping each signal to a likely upsell SKU and a next-best action. Read-only — never contacts customers, never auto-creates Gainsight CTAs.
---
# Expansion-signal detection
## When to invoke
Run once a week (typically Monday morning, before the CSM team's weekly account review) to scan the trailing 7 days of CSM calls and usage events across the customer portfolio. Output is a ranked digest per CSM owner, sized for a 5-minute pre-meeting read.
Do NOT invoke this skill for:
- Auto-emailing customers, auto-creating Gainsight CTAs, or any outbound action. The skill is read-only signal — humans decide which account to actually approach.
- Real-time alerting on individual events. Per-event pings flood CSMs and erode trust in the channel within two weeks. The weekly cadence is deliberate.
- Sales-call analysis (new logos, prospecting). The signal taxonomy here assumes existing customers with a baseline of usage and a named CSM. Use the AE call-coach skill instead.
- Replacing a usage-anomaly detection system. The skill consumes pre-computed anomalies; it does not detect them. If Gainsight isn't already firing usage-spike events, fix that first.
- Forecasting expansion ARR. The output is per-account intent signal, not a number a finance team should plug into a forecast.
## Inputs
- Required: `accounts` — JSON array with `id`, `name`, `arr`, `segment` (e.g. `enterprise` / `mid-market` / `smb`), `tier` (current SKU tier), `owner_email`, `renewal_date`.
- Required: `calls` — JSON array of CSM call records for the trailing window. Each record needs `account_id`, `call_id`, `occurred_at`, `transcript_url` or `transcript_text`, `attendees` (with `is_customer` flag and role/title where known).
- Required: `usage_events` — JSON array of usage anomalies emitted by Gainsight (or your usage-warehouse equivalent) for the same window. Each event needs `account_id`, `event_type` (e.g. `feature_first_use`, `seat_count_spike`, `api_call_spike`, `tier_gated_feature_attempt`), `metric_name`, `value_current`, `value_baseline`, `delta_pct`, `occurred_at`.
- Required: `support_tickets` — JSON array of recent tickets with `account_id`, `subject`, `body_summary`, `tags`, `opened_at`. Used to spot integration / capability questions tied to premium SKUs.
- Optional: `stakeholder_changes` — JSON array of org-chart events (`account_id`, `change_type` of `new_hire` / `promotion` / `departure`, `role`, `is_champion`, `occurred_at`). Used to suppress signals contaminated by champion churn (see watch-outs).
- Optional: `window_days` — lookback window. Defaults to 7. Going shorter than 7 typically yields too few signals per account to classify; going longer than 14 stale-dates the next-best action.
- Optional: `cap_per_csm` — maximum signals surfaced per CSM in the digest body. Defaults to 3. Overflow is summarized as a count.
## Reference files
Read these from `references/` before running. They encode the team's taxonomy and per-segment baselines — without them the output is generic "this account is engaged" filler.
- `references/1-expansion-signal-taxonomy.md` — the SKU-to-trigger mapping. Each upsell SKU lists the call phrases, usage patterns, and ticket topics that count as evidence, plus weak-signal vs strong-signal cutoffs.
- `references/2-segment-baseline-config.md` — per-segment baselines for usage anomalies (a 30 percent week-over-week jump means something different for an SMB on 5 seats than an enterprise on 500). The skill rejects anomalies that exceed the absolute threshold but fall inside the segment's noise band.
- `references/3-action-library.md` — the next-best-action library the skill maps signals to. Each action is a verb plus a named artifact (a meeting, a doc, a person), not a vague "follow up."
## Method
Run these six steps in order. Do not parallelize: classification depends on aggregation, routing depends on classification.
### 1. Per-account evidence collection
For each account in `accounts`, gather every record from `calls`, `usage_events`, and `support_tickets` within `window_days`. Drop accounts with zero records — silence is not a signal here, and an empty entry in the digest dilutes the ranked list. Record the count of dropped accounts for the footer so the team can see coverage.
### 2. Per-segment baseline filtering
For each `usage_event`, look up the account's `segment` in `references/2-segment-baseline-config.md` and fetch the baseline noise band (typically expressed as a two-sigma range around the segment median for that metric). Discard events whose `delta_pct` falls inside the noise band even if the absolute value crossed the emitter's threshold.
The reason for per-segment baselines (rather than a single global threshold): a 30 percent week-over-week seat jump is meaningful noise for an SMB account that adds 1-2 seats normally, and meaningful signal for an enterprise account on a flat 500-seat plan. A single global threshold guarantees the SMB band drowns out the enterprise band. Per-segment baselines are auditable — when a CSM lead disagrees with the cutoff, they edit one row in the config rather than tuning a hidden constant.
### 3. Signal extraction from calls and tickets
For each call transcript and ticket body in scope, run an extraction prompt that scans for the trigger phrases listed in `references/1-expansion-signal-taxonomy.md`. Each match is logged with the SKU it maps to, the verbatim quote, the speaker (with `is_customer` filter — coach mentions don't count), and the `call_id` or `ticket_id` it came from.
Negative-example guard: the prompt explicitly enumerates phrases that look adjacent but mean the opposite ("we're thinking about leaving," "your enterprise tier is too expensive," "we'd consider expanding if X were true" — conditional, not committed). These are classified as `not_signal` rather than dropped silently, so the diagnostics in step 6 can show how often the negative-example layer fired.
### 4. Weak-signal vs strong-signal classification
For each per-account candidate signal, classify into one of three buckets using the cutoffs in `references/1-expansion-signal-taxonomy.md`:
- **Strong** — at least one corroborating call mention plus at least one corroborating usage event for the same SKU within the window. These get routed to the per-CSM digest as ranked entries.
- **Weak** — call mention OR usage event alone, OR both but for different SKUs. These get aggregated into a per-CSM "weak signals worth a glance" footer with a count and a link, never as ranked entries.
- **Insufficient** — fewer than the cutoff above. Recorded for the diagnostics footer; not surfaced per-CSM.
The reason for weak-vs-strong split rather than a single score-and-rank: routing differs. A strong signal warrants a CSM sending a meeting invite this week. A weak signal warrants the CSM glancing during their normal account review. Putting weak signals in the ranked list trains the CSM to ignore the ranked list.
### 5. Per-CSM routing and prioritization
Group strong signals by `owner_email`. Within each owner's list, sort by ARR descending, breaking ties by `renewal_date` ascending (closer renewals first — expansion plus a near-term renewal is more actionable than expansion in month 11 of a 24-month deal). Apply `cap_per_csm` to the strong list. If the cap drops signals, surface them only as a count in the weak-signals footer for that CSM.
### 6. Action mapping and emit
For each surfaced strong signal, look up the SKU and signal pattern in `references/3-action-library.md` and attach the matching next-best action. If no action is found, output `needs human review` rather than synthesizing one. Vague suggested actions are the failure mode that erodes trust fastest — better silence than noise.
Render to the layout in the Output format section below. Emit one file per CSM owner (not one combined file) so the digest can be delivered as a personal Slack DM rather than a public channel post that creates implicit social pressure.
## Output format
```markdown
# Expansion-signal digest — {YYYY-MM-DD} — {CSM name}
Window: trailing {window_days} days · Strong signals: {n_strong} · Weak signals: {n_weak}
## Strong signals — act this week
### 1. {Account name} — ${ARR}k ARR · renewal {renewal_date}
SKU: {target_sku}
Call evidence:
> "{verbatim quote}" — {speaker_name}, {role}, {call_date} ({call_id})
Usage evidence: {metric_name} went from {value_baseline} to {value_current} ({delta_pct} over {n} days, segment-baseline-adjusted)
Action: {verb + named artifact, from action library}
### 2. {Account name} — ...
## Weak signals — worth a glance ({n_weak})
- *{Account name}* — {SKU}: {one-line summary, e.g. "call mention only, no usage corroboration"}
- *{Account name}* — {SKU}: {one-line summary}
- (+{n_overflow} more capped from strong list — see footer)
## Diagnostics
- Accounts in scope: {n_total}
- Accounts with zero records (dropped): {n_silent}
- Negative-example matches (suppressed): {n_negative}
- Champion-departure suppressions: {n_champion_suppressed}
- Taxonomy file hash: {first_7_chars_of_sha256}
```
## Watch-outs
- **False-positive flooding.** When the call-extraction prompt is loose, it surfaces "showed interest" mentions that don't actually predict expansion, and the CSM's strong-signal list bloats to 10+ per week. Guard: enforce `cap_per_csm` strictly, and if any single CSM's strong list exceeds the cap on three consecutive runs, prepend a `_Strong-signal threshold may be too loose — last 3 runs averaged {n} per week. Consider tightening the strong-vs-weak cutoff in references/1-expansion-signal-taxonomy.md._` warning. Do not silently truncate without flagging.
- **Signal-weighting drift.** Trigger phrases and SKU mappings go stale as the product changes. A new SKU that launched two months ago has zero entries in the taxonomy until someone adds them, and every signal for it is silently mis-routed. Guard: include the SHA-256 (first 7 chars) of `references/1-expansion-signal-taxonomy.md` in the diagnostics footer. If the file hasn't been touched in 90 days, prepend `_Taxonomy last edited 90+ days ago. Time to recalibrate against the current SKU lineup._`
- **Champion-departure misclassification.** A spike in usage right after the named champion leaves is an expansion-risk signal, not an expansion-intent signal — the new owner is exploring before deciding whether to keep the contract. Guard: cross-reference every strong signal against `stakeholder_changes`. If a champion on the account departed within the trailing 30 days, downgrade to weak and tag with `_champion-departure suppressed: investigate before pursuing._` The skill must NOT route an expansion ask to an account that just lost its champion.
- **Conditional-mention misclassification.** "We'd consider expanding if you supported X" reads as expansion intent on its face but is in fact a feature-gap report. Guard: the negative- example layer in step 3 explicitly classifies conditional phrases ("if," "would," "considering," "thinking about") as `not_signal`. Diagnostics expose how often this fires — if it never fires the layer is broken; if it fires constantly the SKU mapping needs rephrasing.
- **CSM call-coverage gap.** If CSMs aren't actually logging calls in Gong (or the equivalent), the call half of the signal set is empty and every signal collapses to weak. Guard: at the start of every run, compute `% of accounts with at least one logged call in the window` and prepend the digest with `_CSM call coverage: {pct}% of accounts had at least one logged call. Below 60% means most signals are usage-only._` Below 40%, abort the run with a coverage-error message rather than emit a half-signal digest.
- **Action specificity collapse.** Under load, the model defaults to generic "follow up on opportunity" suggestions. Guard: post- process the Action field with a literal substring check — if the action contains `follow up`, `reach out`, `touch base`, `align`, `socialize`, `engage` without a named person, meeting, or doc, replace with `needs human review`. Action library entries that pass this filter are the only acceptable shape.
# Expansion-signal taxonomy — TEMPLATE
> Replace these mappings with your actual SKU lineup and the trigger
> phrases / usage patterns your team has observed precede an upsell.
> The skill reads this file on every run; without your real taxonomy
> the digest output is generic and CSMs ignore it within two weeks.
## Strong-signal cutoff
A signal is classified **strong** only when at least one call mention AND at least one usage-event corroboration land on the same SKU within the run window. Anything else is **weak**. Edit this cutoff only after you have three weeks of digests showing repeated cases of genuine expansion that the strong-only filter missed.
## SKU map
For each SKU, list:
- **Call triggers** — verbatim phrase patterns the extraction prompt searches transcripts for. Be specific: "asked about pricing for more than 50 seats" not "asked about pricing."
- **Usage triggers** — pre-emitted anomaly types (from your usage warehouse) that count as evidence for this SKU.
- **Ticket triggers** — support-ticket subject / tag patterns that count as evidence (typically integration questions about premium features).
- **Negative-example phrases** — phrases that look adjacent but mean the opposite. The skill classifies these as `not_signal` rather than dropping silently.
### SKU: enterprise-tier (example)
- **Call triggers**:
- "do you support SSO" / "SAML" / "SCIM"
- "compliance requirements" / "SOC 2" / "HIPAA" / "FedRAMP"
- "asked about pricing for {N}+ seats" where N is at least 2x current seat count
- "our security team needs"
- **Usage triggers**:
- `tier_gated_feature_attempt` for SSO, audit-log, or RBAC features
- `seat_count_spike` over the segment baseline (see config)
- **Ticket triggers**:
- tags include `sso`, `compliance`, `security-review`
- subject matches `audit log`, `enterprise`, `compliance`
- **Negative-example phrases**:
- "we're going to need to drop down a tier"
- "your enterprise tier is too expensive"
- "we'd consider {feature} if it were on a lower tier"
### SKU: additional-team-seats (example)
- **Call triggers**:
- "the {team_name} team is also starting to use this"
- "rolling out to {N} more people"
- "our {team} would benefit from access"
- **Usage triggers**:
- `seat_count_spike` over baseline
- `feature_first_use` from a previously-inactive department (requires department tagging in usage events)
- **Ticket triggers**:
- subject contains `add users`, `new team`, `provisioning`
- **Negative-example phrases**:
- "we're consolidating teams onto fewer seats"
- "trying to figure out who actually uses this"
### SKU: premium-feature-pack (example)
- **Call triggers**:
- "does {premium_feature} support {use_case}"
- "we're trying to do {use_case} — is that on the roadmap"
- **Usage triggers**:
- `tier_gated_feature_attempt` for premium-pack features
- `api_call_spike` on premium-only endpoints
- **Ticket triggers**:
- tags include `premium-feature`, `api-limits`, `advanced-{feature}`
- **Negative-example phrases**:
- "we tried {premium_feature} and it didn't fit our use case"
- "we're using {competitor} for {use_case} instead"
### SKU: {your_next_sku}
(Add a section per SKU. The skill only routes to SKUs listed here.)
## Conditional-mention guard
The negative-example layer specifically catches conditional expansion mentions — phrases that sound like intent but are in fact feature-gap reports. The extraction prompt classifies any match containing both an expansion-shaped verb and one of the following conditional markers as `not_signal`:
- "if you {supported, added, built, shipped}"
- "would {consider, think about, look at} {expanding, upgrading}"
- "thinking about {upgrading, expanding, the enterprise tier}"
These are valuable product-feedback signals, but they belong in a roadmap-feedback channel, not a CSM expansion digest. Route them elsewhere if you want to capture them.
## Last edited
{YYYY-MM-DD}
# Segment baseline config — TEMPLATE
> Replace these baselines with values computed from your actual usage
> warehouse. The skill rejects usage anomalies whose `delta_pct` falls
> inside the segment's noise band even when the absolute value
> crossed the emitter's threshold. Without per-segment baselines,
> SMB noise drowns out enterprise signal.
## How baselines are used
For each `usage_event` ingested, the skill:
1. Looks up `account.segment` in this file.
2. Fetches the noise band (typically two-sigma around the segment median) for the event's `metric_name`.
3. If `delta_pct` falls inside the noise band, the event is discarded as noise even if it crossed the global emitter threshold.
4. If outside the band, the event is kept as a signal candidate and proceeds to the SKU mapping in step 3 of the method.
Edit one row at a time. Watch the next two digests before editing again — baselines that move every week train the team to ignore the output.
## Per-segment baseline table
Replace these placeholder values with values from a 90-day rolling window over your actual usage data.
### Segment: enterprise (example)
Typical: 200-1000+ seats, multi-year contract, dedicated CSM.
| Metric | Median weekly delta | Noise band (2σ) | Notes |
|-----------------------------|--------------------:|-----------------|---------------------------------------------|
| `seat_count` | +0.5% | ±3% | Enterprise plans tend to be flat-by-design |
| `daily_active_users` | +1.0% | ±8% | Vacation-week dips are normal |
| `api_calls` | +2.0% | ±15% | Spiky on integration release days |
| `tier_gated_feature_attempts` | 0 | ±0 (any > 0 is signal) | Crossing into a tier-gate is signal regardless of band |
### Segment: mid-market (example)
Typical: 50-200 seats, annual contract, shared CSM coverage.
| Metric | Median weekly delta | Noise band (2σ) | Notes |
|-----------------------------|--------------------:|-----------------|---------------------------------------------|
| `seat_count` | +1.5% | ±7% | Quarterly rollouts can produce one-off jumps |
| `daily_active_users` | +2.0% | ±12% | |
| `api_calls` | +3.5% | ±20% | |
| `tier_gated_feature_attempts` | 0 | ±0 (any > 0 is signal) | |
### Segment: smb (example)
Typical: 1-50 seats, monthly or annual contract, pooled CSM coverage.
| Metric | Median weekly delta | Noise band (2σ) | Notes |
|-----------------------------|--------------------:|-----------------|---------------------------------------------|
| `seat_count` | +5.0% | ±25% | Adding 1-2 seats is week-on-week normal |
| `daily_active_users` | +6.0% | ±30% | Highly variable |
| `api_calls` | +8.0% | ±40% | Often noisy due to integration tinkering |
| `tier_gated_feature_attempts` | 0 | ±0 (any > 0 is signal) | |
### Segment: {your_next_segment}
(Add a section per segment in your customer base.)
## Recompute cadence
Recompute the medians and noise bands from your usage warehouse on a quarterly basis. Append to the calibration log below so the next person editing this file can see why the numbers are what they are.
## Calibration log
Format: `YYYY-MM-DD — change — reason`.
- {YYYY-MM-DD} — initial baselines — placeholder, replace with values computed from a 90-day rolling window
## Last edited
{YYYY-MM-DD}
# Action library — TEMPLATE
> Replace these actions with the next-best actions your CSM team
> actually runs. The skill maps each strong signal to one entry in
> this library; entries that are vague ("follow up", "engage
> stakeholder") are rejected by the post-process filter described in
> the SKILL.md watch-outs section.
## Action shape
Every entry MUST follow the shape:
```
verb + named artifact (a meeting, a person, a doc, or a ticket)
```
Acceptable:
- "Send the SSO setup checklist to the security contact and propose a 30-min walkthrough this week."
- "Forward the Q3 roadmap deck to the new VP of Eng and ask for a 15-min reaction call."
- "Open a Gainsight CTA tagged `enterprise-tier-evaluation` and ping the renewal owner in the linked thread."
Not acceptable:
- "Follow up on the opportunity" (no named artifact)
- "Reach out about expansion" (no verb-and-artifact)
- "Engage the buying committee" (vague)
The skill enforces this with a literal substring check on the emitted Action field. Anything not from this library — or matching the vague-language denylist — is replaced with `needs human review`.
## SKU: enterprise-tier
| Trigger pattern | Next-best action |
|----------------------------------------------|------------------|
| Call mention of SSO/SAML/SCIM + tier-gated attempt | "Send the SSO setup checklist {link} to the security contact and propose a 30-min walkthrough this week." |
| Compliance language + ticket tagged `compliance` | "Forward the SOC 2 report {link} and the compliance one-pager {link} to the named compliance contact within 48 hours." |
| Seat-count spike at 2x baseline + pricing call mention | "Schedule a 30-min commercial conversation with the EB this week. Bring the enterprise-tier pricing sheet {link}." |
## SKU: additional-team-seats
| Trigger pattern | Next-best action |
|----------------------------------------------|------------------|
| Call mention of new team + seat-count spike | "Open a provisioning thread with the named admin and offer a 15-min onboarding for the new team this week." |
| `feature_first_use` from new department | "Send the {department} onboarding playbook {link} to the named admin and CC the new department's manager." |
## SKU: premium-feature-pack
| Trigger pattern | Next-best action |
|----------------------------------------------|------------------|
| Use-case question + tier-gated attempt | "Send the premium-feature one-pager {link} and book a 30-min product walkthrough with the asking persona this week." |
| `api_call_spike` on premium endpoints | "Open a Gainsight CTA tagged `premium-pack-evaluation` and ping the technical evaluator in the linked thread." |
## SKU: {your_next_sku}
(Add a section per SKU. Every SKU listed in the taxonomy file MUST have at least one matching trigger-action row here, or the skill will emit `needs human review` for every signal that maps to it.)
## Vague-language denylist
The post-process filter rejects any Action field containing the following substrings without an accompanying named artifact:
- `follow up`
- `reach out`
- `touch base`
- `align`
- `socialize`
- `engage`
- `circle back`
- `loop in`
- `start a conversation`
If a legitimate action needs one of these verbs, write the action with a named artifact attached (e.g. "Loop in the Solutions Engineer {name} on the next call to demo {feature}.").
## Last edited
{YYYY-MM-DD}