> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orbit.devotel.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Auto-CSAT/NPS dispatch: close-triggered surveys, queue and agent scorecards

> Send a CSAT or NPS survey automatically the moment a conversation closes — pick the template, set the delay, gate by sentiment and cooldown, scope it by channel or agent, and read the per-queue / per-agent scorecards the answers roll up into.

# Auto-CSAT/NPS dispatch

Auto-CSAT sends a satisfaction survey to the customer automatically when a conversation closes — no manual send step. You pick the template once, and every qualifying close dispatches it after a configurable delay. Auto-NPS runs the same loop on a separate track, so satisfaction (CSAT, 1–5) and loyalty (NPS, 0–10) accumulate in parallel. The answers roll up into scorecards you can break down by queue or by agent.

This is distinct from the two other survey surfaces: [surveys end to end](/guides/surveys-voc) covers manual, audience-targeted distribution over the API (send to a segment, chase non-responders); [post-call surveys](/guides/post-call-surveys) covers the IVR digit-capture played inside a voice call. Auto-CSAT/NPS is the third pattern — a close-triggered follow-up message, with no audience step and no IVR.

## 1. Configure it in Settings

Open **Settings → CSAT** in the dashboard (owner or admin role). Everything on the page persists to one organization settings block; the shape is exact:

| Setting              | What it does                                                                                                                                                                                                   | Default                      |
| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- |
| **Enabled**          | Master toggle. Off stops all auto-dispatch tenant-wide.                                                                                                                                                        | On                           |
| **Survey template**  | The `csat`, `nps`, or `ces` template dispatched on close. Until you pick one, nothing fires.                                                                                                                   | None                         |
| **Delay (minutes)**  | How long after the close the survey goes out. A short breathing room so the survey does not land while the thread still feels live; B2B support teams typically set 30–60. Clamped to 1–1440.                  | 5                            |
| **Smart trigger**    | When on, the dispatcher skips conversations the sentiment analysis marked `negative` — asking an already-unhappy customer for feedback tends to inflame rather than collect signal.                            | On                           |
| **Cooldown (days)**  | Per-contact fatigue window: a contact who received any survey within this many days is skipped. Clamped to 7–90. Enforced across every template — a contact who got yesterday's NPS will not get today's CSAT. | 14                           |
| **Conditions**       | Optional matcher list that narrows which closes fire the survey (below).                                                                                                                                       | Fire on every eligible close |
| **Detractor rescue** | Sliders for the detractor bands (CSAT 1–4, NPS 0–6 by default) plus an optional auto-reopen: a rating in the detractor band flips the conversation back to open so an operator can follow up the same day.     | Rescue off                   |

NPS has its own Settings → NPS page with the same knob set, so the two tracks carry independent templates, delays, and enable flags.

### Conditions: scope which closes fire

The conditions list lets you restrict auto-dispatch to the closes worth surveying. Each entry is an AND matcher — every field you set must match — and the list is an OR: any single matching entry fires the survey. Fields left empty are wildcards.

* **Channels** — only closes on these conversation channels (SMS, WhatsApp, email, web chat, and the rest of the channel list). To disable auto-CSAT for one channel, set conditions that cover every channel except that one.
* **Agents** — only conversations assigned to these users. Use it to pilot CSAT on a subgroup before rolling out, or to exclude a team. A conversation with no assignee (bot-only) never matches a non-empty agent list.
* **Dispositions** — only closes stamped with these disposition labels from your taxonomy.
* **Exclude bot-only** — skip conversations a human never touched; the bot's own confidence score already captures that signal.

Leave the list empty to fire on every eligible close.

## 2. What happens on close

The moment a conversation transitions to closed — by an operator's close action or by automated disposition — the platform reads your auto-CSAT settings. When enabled, a template is chosen, and the conditions pass, the close arms the survey: the due timestamp and the template are stamped on the conversation. A dispatcher sweep runs every minute, picks up conversations whose delay has elapsed, and sends the survey.

Per dispatch, the sweep:

1. Confirms the template still exists (a template deleted between close and dispatch clears the pending survey instead of retrying forever).
2. Applies the smart-trigger gates: negative-sentiment conversations and contacts inside the cooldown window are marked skipped, not sent.
3. Picks the channel — the conversation's last-used channel when the template allows it, else the first allowed channel the contact can be reached on (a phone-capable channel needs a contact phone number; email needs a contact email). Closes with no reachable channel are skipped and recorded as such.
4. Holds SMS-class sends outside the 08:00–21:00 TCPA quiet-hours window until the recipient's local morning; email is exempt.
5. Sends the survey through the same message routing, billing, and opt-out enforcement as a manual send. The message carries the question, a signed link to a hosted survey page, and a quick-rate link — so the customer can reply with a bare number, tap through to the full survey, or rate 1–5 directly.

Every dispatched answer attaches to the survey, the contact, and the conversation that triggered it.

## 3. Read the scorecards

Answered surveys aggregate into per-queue and per-agent scorecards over `GET /api/v1/surveys/scorecards`:

```bash theme={null}
curl "https://api.orbit.devotel.io/api/v1/surveys/scorecards?group_by=queue&from=2026-08-01T00:00:00Z" \
  -H "X-API-Key: $ORBIT_API_KEY"
```

**Response:**

```json theme={null}
{
  "data": {
    "scorecards": [
      {
        "key": "q_support_tier1",
        "responses": 213,
        "satisfied_count": 178,
        "satisfaction_pct": 83.57,
        "avg_score": 4.12,
        "csat_avg_score": 4.12,
        "nps": null,
        "nps_responses": 0
      }
    ]
  }
}
```

| Query knob                   | Effect                                                                                                      |
| ---------------------------- | ----------------------------------------------------------------------------------------------------------- |
| `group_by`                   | `queue` (default) buckets by the queue that handled the interaction; `agent` buckets by the handling agent. |
| `survey_type`                | `csat`, `nps`, or `all` (default). Restrict the rollup to one metric.                                       |
| `queue_id` / `agent_user_id` | Narrow to one bucket.                                                                                       |
| `from` / `to`                | Bound the window (ISO timestamps). Only answered responses count.                                           |
| `limit` / `offset`           | Page the bucket list. A bucket with zero answers drops out entirely.                                        |

Each row reports the response count, the top-2-box satisfaction percentage (score ≥ 4), the average score, the CSAT-only average, and the NPS (promoters minus detractors) over NPS rows. A row appears only once the bucket has at least one answered response, so sampled-off or unanswered sends never surface as zero-divide rows. Trend the same call over time — weekly snapshots with a moving `from`/`to` window — to see whether a queue's score is drifting or a coaching change is landing.

## 4. Troubleshooting

**The survey did not fire on a close.** Walk the gates in order: a template must be picked; the conditions list must match the close (an unmatched condition list skips silently); the smart trigger must not have suppressed it (a negative-sentiment conversation, or the contact inside the cooldown window — an explicit cooldown-skip leaves the cooldown config as the first thing to lower if you want more volume); and the customer must be reachable on a channel the template allows. Also confirm the delay has elapsed — nothing sends before it.

**Duplicate dispatches.** The sweep is idempotent: each fired close is stamped, and the sweep skips stamped rows. If a customer reports two surveys, the usual cause is the per-contact cooldown spanning both the CSAT and NPS tracks being misread as a duplicate, or the customer was also caught by a manual send outside the auto flow — check the cooldown and the manual sends before assuming the sweep double-fired. A conversation that reopens and closes again legitimately re-arms the survey.

**A channel never fires.** Two checks: the template's allowed channels must include it, and the customer must have an address on it. A dispatch with no reachable channel is skipped deliberately, not retried — the fix is on the contact record (a phone number or an email), not the settings page.

**SMS arrives at odd hours, then stops arriving overnight.** That is the quiet-hours hold doing its job: SMS-class sends wait for the 08:00–21:00 recipient-local window. Sends outside the window dispatch automatically the moment it opens; nothing is lost. Numbers with unknown timezone fail open, so if you need strict hold behavior, make sure contacts carry a timezone.

## 5. Auto-CSAT vs the manual flow

Use auto-CSAT/NPS when the question is "how are we doing" on a continuous, operational cadence — it needs no operator action, accumulates scorecard data per queue and per agent from day one, and the smart trigger + cooldown keep the volume honest. Use the manual flow in [surveys end to end](/guides/surveys-voc) when you need a targeted pulse — a post-campaign CSAT to one segment, a one-off NPS to a cohort, or a remind loop over non-responders. And use [post-call surveys](/guides/post-call-surveys) when the answer must be captured inside the voice call itself rather than by a follow-up message. The three feeds land in the same surveys analytics, so mixing them never splits your reporting.
