# objection-handler

Sales-objection handling and rebuttal pack for reps, SDRs, and founders closing deals: categorize a prospect objection into price, timing, trust, authority, or need; respond with 2-3 professionally...


Sales-objection handling & rebuttal adapter pack for reps, SDRs, and founders. Classifies a prospect
objection, returns framed rebuttals from proven sales frameworks, serves a per-category tactic
playbook, reframes negatives into positives, and generates feel-felt-found empathy responses.

Intelligent microservice: every tool has a deterministic playbook/template core that runs fully
**offline**. `respond` and `reframe` additionally try an optional LLM to personalize the wording and
**silently fall back** to the templates when no model is reachable (`mode: 'heuristic' | 'llm'`).

## The five objection categories

`price` · `timing` · `trust` · `authority` · `need` — each with curated psychology, tactics,
frameworks, and anti-patterns in `data/playbook.json`.

## Tools

| Tool | In → Out |
|---|---|
| `categorize` | `{ objection }` → `{ category, confidence, matchedSignals, ranking, psychology }` |
| `respond` | `{ objection, category?, context? }` → 2-3 framed rebuttals (auto-detects category) (+ optional LLM rewrite) |
| `playbook` | `{ category }` → psychology + tactics + frameworks + what to avoid (omit `category` for the index) |
| `reframe` | `{ statement }` → positive, opportunity-focused angle (+ optional LLM reframe) |
| `feelFeltFound` | `{ objection, context? }` → classic feel / felt / found empathy response |

## Usage

```js
import pack from './index.js';

pack.adapters.categorize({ objection: "It's way too expensive for us right now" });
// → { category: 'price', confidence: 0.7, matchedSignals: ['expensive', 'too much'? ...], ... }

await pack.adapters.respond({
  objection: 'We need to think about it',
  context: { product: 'Acme CRM', valueProps: ['faster follow-up', 'higher win rate'] },
});
// → { mode: 'heuristic', category: 'timing', responses: [ { framework, text }, ... ], tips: [...] }

pack.adapters.playbook({ category: 'trust' });
// → { psychology, tactics: [...], frameworks: [...], avoid: [...] }

pack.adapters.feelFeltFound({ objection: 'I already have a solution' });
// → { feel, felt, found, combined }
```

## Classification

Deterministic keyword/phrase scoring over a curated sales-objection lexicon (multi-word phrases
weighted higher; ties broken by category priority). An unclassifiable objection defaults to `need`
(a fit/diagnostic probe) with `confidence: 0`.

## DRY boundaries

- Sales-conversation intelligence only (objection taxonomy + rebuttal frameworks + playbook data).
  Generic tokenizing / sentiment belongs to `nlp` — the classifier here is a small curated matcher.
- Complements `proposal-builder` (pre-sale documents) and any CRM deal flow.
- No cross-pack imports except `../_shared/llm.js`. Pure ESM, Node built-ins, zero npm deps.


---
Source: shared/engines/adapters/domain/objection-handler/README.md
Canonical: https://docs.leumas.tech/p/adapters/domain/objection-handler
