---
title: "Reviews in n8n"
description: "Send each finished review into your own n8n every 15 minutes."
---

> Documentation Index
> Fetch the complete documentation index at: https://guides.channelautomations.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Reviews in n8n

[Open original guide with interactive examples →](/originals/sales-coach-n8n/)

When a review finishes, n8n picks it up within 15 minutes: the summary, the scorecard with every sales step, the coaching and the full transcript. From there it goes wherever your team works: your CRM, a sheet, a report.

**Sales Coach**rep records the visit, the review finishes

↓ every 15 minutes

**Sales Coach API**read-only, with your Sales Coach key

↓

**Your n8n**the ready-made workflow on this page

↓

**Your system**CRM record, sheet, database

<span id="what"></span>

## What you get

| Part | What's in it |
| --- | --- |
| **Review** | Title, when it was recorded, length, the customer, the rep (a person or an AI assistant), the linked appointment, and whether it was an in-person visit, an uploaded file or a phone call |
| **Score** | Points out of the maximum, and how many of your sales steps were followed |
| **Summary** | What happened, the outcome, sentiment, next steps, commitments, customer needs, products, budget, timeline, objections, competitors and buying intent |
| **Scorecard** | Each section's score and reason, and each sales step marked _done_, _partly_ or _skipped_, with the second it happened |
| **Coaching** | The coaching points, each tied to a moment in the conversation |
| **Transcript** | Every line in order, with who spoke and when |

**Read-only by design.** The key can read finished reviews and nothing else. It can't see contacts, send messages, or change or delete anything. Recordings, audio links, QA flags and internal notes are never sent.

<span id="before"></span>

## Before you start

-   **An owner or admin** of your Channel Automation workspace. Only they can create a Sales Coach key.
-   **n8n**, either n8n Cloud or your own server, and someone who can build a workflow in it.
-   **Somewhere to send reviews**, and a way to match records there: each review has a stable `id`, so your destination can update the same record when a review changes.
-   **At least one finished review** in Sales Coach, so your first test has something to show.

<span id="setup"></span>

## Set it up

This takes about 15 minutes.

1.  ### Create your Sales Coach key

    In Channel Automation, open Settings → API Keys → Generate New Key. Under **Key type**, choose **Sales Coach key (read-only, for integrations)**, name it something like _n8n reviews_, and press **Generate API Key**.

    **Copy the key now.** It is shown once and is not stored anywhere, not even for you. If you lose it, deactivate it and create a new one. Never paste it into an email or a ticket.

2.  ### Add the workflow to n8n

    In n8n, create a new workflow. Press **Copy workflow** below, click the empty canvas and paste (Ctrl/⌘ + V).

    Prefer a file? Paste the copied text into a file named `sales-coach-reviews.json`, then use the workflow's **⋯** menu → **Import from File**.

     **Copy workflow**

3.  ### Add your key as a credential

    Open the step **List changed reviews**. In its credential field (authentication is already set to _Header Auth_), create a new credential:

    | Field | Value |
    | --- | --- |
    | Name | `X-API-Key` |
    | Value | your Sales Coach key (starts with `crm_live_`) |

    Then open **Get the full review** and pick the same credential. The key lives only in n8n's credential store, never in the workflow itself.

4.  ### Point it at your system

    Replace the placeholder step **Send to your system** with the step that saves a review: for example your CRM's node, _Google Sheets → Append or update row_, or an HTTP request. Match on the review's `id` so a re-analysed review updates the same record. Keep the new step connected to **Wait for every review**.

    Useful fields to map: `summary.summary`, `summary.next_steps`, `scorecard.percent`, `process.percent`, `coaching` and `transcript`. The [field guide](#fields) below lists them all.

    The **processing**, **unavailable** and **deleted** branches are placeholders too. At minimum, connect **Deleted: remove your copy** to a step that deletes the record, so a review deleted at a customer's request disappears from your system as well.

5.  ### Test it

    Run the workflow once with **Execute workflow** (called _Test workflow_ in older n8n versions). It starts from the **Run now (for testing)** step. The first run collects every finished review, so it can take a few minutes if you already have many. Open each step to check what came through.

    Test runs never move the bookmark, so you can run a test as often as you like; each one starts from the same place.

6.  ### Turn it on

    Turn the workflow on (**Active**, or **Publish** in the newest n8n versions). From then on it runs every 15 minutes and only picks up what changed since the last successful run.


<span id="try"></span>

## Try it in Postman

Before building anything, check your key works. Two ways, both tested against the live API.

### Option A: the ready-made collection

1.  Press **Copy collection**.
2.  In Postman, choose **Import** → **Raw text**, paste, and import.
3.  Open the collection's **Variables**, set `apiKey` to your Sales Coach key, and save.
4.  Send the requests in order. Request 1 saves a review id and the next-page cursor, so requests 2–5 work without editing anything. For request 6, set `phone` to a customer's number first.

 **Copy collection**

### Option B: curl commands

Paste them into a terminal, or into Postman's **Import** box one at a time. Replace `PASTE_YOUR_SALES_COACH_KEY` with your key. Take `PASTE_NEXT_CURSOR` and `PASTE_REVIEW_ID` from the first response's `next_cursor` and a review's `id`.

curl "https://api.channelautomation.com/api/v1/sales-coach/reviews?limit=5" \\
  -H "X-API-Key: PASTE\_YOUR\_SALES\_COACH\_KEY"

curl "https://api.channelautomation.com/api/v1/sales-coach/reviews?limit=5&cursor=PASTE\_NEXT\_CURSOR" \\
  -H "X-API-Key: PASTE\_YOUR\_SALES\_COACH\_KEY"

curl "https://api.channelautomation.com/api/v1/sales-coach/reviews?limit=5&updated\_since=2026-09-01T00:00:00Z" \\
  -H "X-API-Key: PASTE\_YOUR\_SALES\_COACH\_KEY"

curl "https://api.channelautomation.com/api/v1/sales-coach/reviews/PASTE\_REVIEW\_ID" \\
  -H "X-API-Key: PASTE\_YOUR\_SALES\_COACH\_KEY"

curl "https://api.channelautomation.com/api/v1/sales-coach/reviews/PASTE\_REVIEW\_ID?include=summary,scorecard" \\
  -H "X-API-Key: PASTE\_YOUR\_SALES\_COACH\_KEY"

curl "https://api.channelautomation.com/api/v1/sales-coach/reviews?phone=%2B15551234567&limit=5" \\
  -H "X-API-Key: PASTE\_YOUR\_SALES\_COACH\_KEY"

 **Copy curl commands**

A `401` means the key is wrong or deactivated; a `403` means it isn't a Sales Coach key. See [Troubleshooting](#trouble).

<span id="follow"></span>

## Follow one review

Pick what happens to the review, then step through its trip into your system.

 **A new review**   **It is re-analysed**   **It is deleted**   **Your system is down**

 **Next step**   **Play all**   **Start over**

Record

<span id="pRecord"></span>

nothing yet

Analysis version

<span id="pVersion"></span>

none

Bookmark

<span id="pBookmark"></span>

previous run

<span id="fields"></span>

## What a review contains

Every run first lists the reviews that changed. Each one looks like this (example values):

{
  "id": "0b6f0c1e-7c1a-4b8e-9d0f-2f4f6b9e3a10",
  "state": "ready",
  "title": "Bathroom remodel consult",
  "source": "recorded\_visit",
  "recorded\_at": "2026-09-30T14:02:11.482913+00:00",
  "duration\_seconds": 2710,
  "completed\_at": "2026-09-30T14:51:40.120331+00:00",
  "updated\_at": "2026-09-30T14:51:40.120331+00:00",
  "contact": { "id": "5d1e…", "name": "Jordan Rivera", "phone": "+15551234567" },
  "rep": { "type": "person", "name": "Sam Ortiz" },
  "appointment\_id": "c2a9…",
  "score": { "points": 82, "max": 100, "percent": 82 },
  "process": { "followed": 5.5, "total": 7, "percent": 79 },
  "analysis\_version": 1,
  "consent": { "status": "confirmed", "method": "rep\_confirmation", "provenance": "rep\_confirmation" }
}

For each `ready` review the workflow then fetches the full review, which adds four sections:

{
  "summary": {
    "summary": "Homeowner wants the tub replaced with a walk-in shower before the holidays…",
    "outcome": "Quote requested",
    "customer\_sentiment": "positive",
    "next\_steps": \["Send the quote by Friday"\],
    "customer\_needs": \["Walk-in shower", "Grab bars"\],
    "budget": "$12k–15k",
    "timeline": "Before December",
    "objections": \[{ "text": "Worried about the price", "category": "price", "response": "Offered financing", "at\_seconds": 1340 }\],
    "competitors": \[{ "name": "Another remodeler", "sentiment": "neutral", "at\_seconds": 1610 }\],
    "buying\_intent": { "level": "high", "reasoning": "Asked for install dates" },
    "deal\_probability\_estimate": 65
  },
  "scorecard": {
    "points": 82, "max": 100, "percent": 82,
    "sections": \[{ "key": "rapport", "label": "Rapport", "score": 18, "max": 20, "reason": "Warm open", "at\_seconds": 40 }\],
    "process": {
      "followed": 5.5, "total": 7, "percent": 79,
      "steps": \[{ "key": "agenda", "label": "Set the agenda", "verdict": "done", "reason": "Walked through the visit plan", "at\_seconds": 95 }\]
    }
  },
  "coaching": \[{ "title": "Ask about budget earlier", "detail": "Budget came up in the last five minutes", "at\_seconds": 2400 }\],
  "transcript": \[{ "index": 0, "at\_seconds": 0, "end\_seconds": 4.2, "speaker": "agent", "text": "Thanks for having me over…" }\]
}

| Field | Meaning |
| --- | --- |
| `state` | ready finished · processing being re-analysed · unavailable the latest analysis failed · deleted removed (only `id` and `deleted_at` are sent) |
| `source` | `recorded_visit` (recorded in the app), `uploaded_file`, or `phone_call` (a call analysed from your call recordings) |
| `contact.phone` | The customer's phone number, so you can match the review to your records by phone |
| `analysis_version` | Goes up when a review is re-analysed. Replace your copy when it changes |
| `process` | Your sales steps followed. A step done partly counts as half |
| `consent` | How recording consent was captured. Phone calls analysed from your existing call recordings show `existing_platform_recording` |
| `deal_probability_estimate` | An AI estimate from this conversation alone (0–100). It is not a forecast |
| `at_seconds` | Where in the conversation it happened. Some imported phone calls have no timings, so this can be empty |

<span id="rules"></span>

## Rules worth knowing

-   **The bookmark only moves when a whole run succeeds.** If anything fails partway, even your own system being down, the next run repeats from the same place. Match on `id`, and a repeat is harmless.
-   **Changes appear after about two minutes.** A brand-new change is held back briefly, so a change that is still being saved is never skipped.
-   **"Not found" or "changed" on a single review is normal.** It means the review was deleted or updated while n8n was reading it. The workflow skips it, and it comes back in a later run with its new state.
-   **Phone calls are included.** Calls analysed from the Calls tab come through with their consent details. Filter on `source` if you only want in-person visits.
-   **The key belongs to the person who created it.** If they stop being an owner or admin, or leave the workspace, the key stops working. Create the key under an account that will stay.
-   **Revoking is final.** To stop the connection, open the key's menu in Settings → API Keys and choose **Deactivate**. A deactivated Sales Coach key can't be switched back on.
-   **Limits:** 120 requests a minute per key. The workflow paces itself to stay well under that, even on its first run.

<span id="trouble"></span>

## Troubleshooting

| What you see | Why | Fix |
| --- | --- | --- |
| **401** | The key is missing, mistyped, expired or deactivated | Check the credential's name is exactly `X-API-Key` and the value has no spaces. If it was deactivated, create a new key |
| **403** | It isn't a Sales Coach key, or its creator is no longer an owner or admin | An owner or admin creates a new Sales Coach key |
| **429** | More than 120 requests a minute | Check the schedule isn't set to seconds, and that nothing else uses the same key |
| **503** | A short interruption on our side | Nothing to do: the run stops, keeps its bookmark, and the next run retries |
| **Nothing arrives** | No review has finished since the last run | Finish a review in Sales Coach, wait two minutes, run a test |
| **The same reviews every run** | The last steps never ran, so the bookmark never moved | Make sure your destination step is connected to **Wait for every review**, and the workflow is turned on (test runs don't move the bookmark) |
| **A contact reads "Deleted contact"** | The customer record was deleted after the visit | The review is still valid. Match it by review `id` |

<span id="api"></span>

## API reference

The workflow above uses these two endpoints. Use them directly if you build your own integration. Send the key in the `X-API-Key` header.

### `GET https://api.channelautomation.com/api/v1/sales-coach/reviews`

| Query | Meaning |
| --- | --- |
| `cursor` | The `next_cursor` from your last response. Store it, and send it next time |
| `updated_since` | First poll only: reviews changed at or after this time (ISO 8601 with a time zone). Leave out to start from the beginning |
| `limit` | 1–100, default 50 |
| `phone` | Look up one customer's reviews by phone number, newest first. Any format works (`(555) 123-4567`, `+15551234567`). This is a lookup, not the change feed: it can't be combined with `cursor` or `updated_since`, it leaves out deleted reviews, and `next_cursor` is empty |

Returns `{ data, next_cursor, has_more, as_of }`, oldest change first. Keep requesting with the new `next_cursor` until `has_more` is false. Save the cursor only after you've handled everything.

### Look up a customer by phone

To see one customer's reviews, for example while they're on the phone, call the list with their number, then fetch the review you want:

curl "https://api.channelautomation.com/api/v1/sales-coach/reviews?phone=%2B15551234567&limit=1" \\
  -H "X-API-Key: PASTE\_YOUR\_SALES\_COACH\_KEY"

The newest review comes first. Take its `id` and fetch it below for the summary, scorecard and transcript. (`%2B` is the `+` sign written for a web address.)

### `GET https://api.channelautomation.com/api/v1/sales-coach/reviews/{id}`

The full review, for items whose state is `ready`. Add `?include=summary,scorecard` to fetch only some of `summary`, `scorecard`, `coaching`, `transcript` (all by default).

| Status | Meaning |
| --- | --- |
| `200` | The review |
| `400` | A bad `cursor`, `limit`, `updated_since` or `include` |
| `401` / `403` | Missing or invalid key / not allowed (see Troubleshooting) |
| `404` | Not in your workspace, or deleted |
| `409` | `not_ready` (being re-analysed) or `changed` while being read. Skip it; it returns in a later poll |
| `413` | The transcript has more than 10,000 lines. Fetch without `transcript` |
| `429` | Over 120 requests a minute. Wait for the `Retry-After` header |
| `503` | Temporary. Retry later |

Channel Automation · Help · Last updated 2026-09-30.
Questions? Ask your account manager, or open **Help Docs** inside the app — the same guidance lives there.

Source: https://guides.channelautomations.com/coach/sales-coach-n8n/index.mdx
