Skip to content

Integration  ·  Customer success

How to build an NPS and survey to CRM sync

A detractor writes a paragraph explaining exactly why they are leaving, and it sits in a survey tool nobody opens. This is the design behind responses reaching the account team, the prompts that build it, and what production adds.

Built with Tray Headless

  1. System Qualtrics
  2. Step Match to person
  3. Step Fatigue check
  4. Step Route detractors
  5. System Salesforce
Also Slack

A detractor is routed within the hour with the verbatim attached, and fatigue rules stop the same person being asked twice.

The short answer

What is a survey to CRM sync?

A survey to CRM sync breaks into four parts: matching a response to both the person and the account instead of one of them, routing detractors within the hour instead of in a monthly report, fatigue rules that stop the same people being surveyed repeatedly, and the verbatim travelling with the score. The mistake that costs most is the verbatim. A number tells you there is a problem and the sentence tells you what it is, and the sentence is what almost never reaches the account team.

What matters here

  • Send the verbatim, not just the score. The number says there is a problem and the sentence says what it is.
  • Route a detractor within the hour. A complaint answered the same day is a save; the same complaint in a monthly report is a churn post-mortem.
  • Match to the person as well as the account. Who said it changes what it means, especially if it was the champion.
  • Enforce fatigue rules. Surveying somebody three times a quarter reduces your response rate and annoys the people who reply.
  • Track whether detractor follow-up actually happened. The routing is worthless if nobody acts on it.

Who this is for

You run customer success or marketing operations. Surveys go out, scores get reported quarterly, and the individual responses that would have changed something are read by nobody.

How it works in practice

What happens between somebody answering a survey and anybody acting on it.

  1. 1

    Fatigue is checked before the invitation goes

    Recently surveyed, recently responded, or in an open escalation. Asking then is worse than not asking.

  2. 2

    The response is matched to a person and an account

    Both, because a detractor who is the champion is a different situation from one who is an occasional user.

  3. 3

    The verbatim travels with the score

    A paragraph explaining why is worth more than the number it accompanies.

  4. 4

    Detractors route within the hour

    To the account owner with the response attached, not into a monthly summary.

  5. 5

    Promoters route somewhere useful too

    A reference request or a review, which is the return most survey programmes never collect.

  6. 6

    Follow-up is tracked to an outcome

    Whether somebody actually responded to the detractor, because routing without follow-up is theatre.

What the sync is made of

Four parts, and the second is where the value actually is.

Person and account matching

Both, keyed on an id instead of an email, so a job change does not orphan the history.

Verbatim with the score

The free text carried onto the record, because that is the part somebody can act on.

Fast detractor routing

Within the hour, to a named person. The half life of a useful response to a complaint is about a day.

Fatigue rules

Who was asked, when, and what else is happening on their account. Over-surveying is how a programme dies quietly.

The Tray Headless prompts

Paste these into Claude Code or Codex with the Tray Headless plugin installed. Each stage runs on its own. The systems named in them are the worked example rather than a requirement, and every prompt says so.

Once per project, run /tray-workflows:set-workspace to pick the workspace these build in. Point it at a sandbox first.

  1. 1

    Set up, then decide who should not be asked

    Fatigue rules protect the response rate, which protects everything else.

    Headless skills build-workflow

    Use build-workflow. The systems in play are Qualtrics and Salesforce,
    or whatever we run in those seats.
    
    I need the survey and response model with the contact identifier used,
    and from Salesforce the contact, account, open cases and any escalation.
    
    Then build the suppression list before anything else: anybody surveyed in
    the last quarter, anybody who responded in the last two, anybody on an
    account with an open severity one, and anybody who asked not to be
    contacted.
    
    Over-surveying is how a programme quietly dies. The response rate falls,
    the sample skews to the annoyed, and the score stops meaning anything.
  2. 2

    Match to the person and the account

    Who said it changes what it means.

    Headless skills build-workflow

    Use build-workflow. Match every response to both a contact and an account.
    
    Key on the contact id carried in the invitation, not on the email
    address. People change email and an email-keyed match silently breaks the
    history for exactly the long-tenured contacts you most want to track.
    
    Where a response arrives anonymous or unmatched, keep it, count it in the
    aggregate, and flag it as unattributed rather than discarding it.
    
    Write to the contact: score, date, verbatim. Write to the account: latest
    score, trend across the last three, and the count of detractors among its
    contacts. That last field is the one worth looking at, because one
    detractor is a person and four is an account.
  3. 3

    Route detractors within the hour, with the words

    The half life of a useful response to a complaint is about a day.

    Route any detractor immediately, not in a digest.
    
    Send the account owner and the customer success manager: the score, the
    full verbatim, who said it and their role, the account context, and any
    open support tickets.
    
    Include the verbatim in the message itself. Not a link to a dashboard.
    The paragraph is the reason to act and putting it behind a click means it
    does not get read.
    
    Create a follow-up task with a due date. Then track whether it was
    actually completed, because routing without follow-up is a workflow that
    makes everybody feel efficient and changes nothing.

    If the detractor is the named champion on a renewing account, that should page somebody instead of create a task.

  4. 4

    Do something with promoters too

    The return most survey programmes never collect.

    Headless skills tray-gotchas

    Use tray-gotchas, then handle promoters deliberately:
    
      Promoters on accounts with no reference on file go to a reference
      request, throttled so the same person is never asked twice a year
      Promoters after a support interaction go to a review request
      A promoter who is a new champion on an account whose previous champion
      left is worth telling the account team about
    
    Handle the awkward cases: a promoter on an account that is churning
    anyway, which usually means you surveyed the wrong person, and a
    detractor whose complaint is about pricing, which is a commercial
    conversation instead of a support one and should route accordingly.
  5. 5

    Report the things that change behaviour

    A quarterly average changes nothing on its own.

    Report: score and trend by segment, product area and tenure; response
    rate and whether it is falling, which is the health of the programme
    itself; detractor follow-up completion rate; and churn among detractors
    against churn among everybody else.
    
    That last comparison is what tells you whether the survey predicts
    anything. If detractors churn at the same rate as everybody else, the
    question is wrong or the sample is.
    
    Do not report the company-wide average as the headline. It moves slowly,
    it hides every segment that is struggling, and nobody has ever acted on
    it.
  6. 6

    Validate, then hand the rules over

    Because who gets asked and how often is a relationship decision.

    Run the per-step schema checks and the whole-workflow audit before this
    touches production.
    
    Then open the same workflow in Tray Build so customer success operations
    can adjust the fatigue windows, the detractor routing and the promoter
    paths in the visual canvas.

What it connects to

Responses arrive in one tool and have to reach the people who own the relationship.

Qualtrics

Read responses with their scores and verbatims, and write back suppression so the same person is not re-invited.

Reads and writes

Salesforce

Match to contact and account, write the score, trend, verbatim and detractor count, and create the follow-up task.

Reads and writes

Slack

Route a detractor within the hour with the verbatim in the message, not behind a dashboard link.

Writes

Zendesk

Read open tickets, because a detractor with a live support case is one story and a detractor with none is another.

Reads

Snowflake

Land responses with their outcomes, so churn among detractors is measurable against everybody else.

Writes

Same build, other stacks

The design does not change if you run something else in one of these seats. The same prompts build it against Microsoft Dynamics 365, Google BigQuery, Microsoft Teams, Jira, HubSpot or Databricks.

Named systems are the ones most teams run, not the only ones that work. Each is an authentication in your Tray workspace, referenced by name, so the workflow never holds a credential. Where we have a connector page, the name links to it.

Running it in production

This carries customer words to the people who can act on them. Speed and attribution both matter.

It runs where production runs, not on a laptop

Responses arrive unpredictably, including at weekends, and detractor routing runs on the same engine rather than a job somebody scheduled.

Every response keeps its attribution

Person, account, survey and timestamp, with the verbatim intact. A quoted complaint that cannot be traced to a person is not usable.

Credentials are managed, never in code

The survey credential exposes unedited customer opinion about your company. Held in your workspace and scoped to the surveys involved.

Customer success owns the fatigue rules

Send windows, detractor routing and promoter follow-up open in Tray Build, tuned by customer success as response patterns change.

Follow-up is tracked, not assumed

Completion rate on detractor tasks reported. Routing without follow-up is a workflow that changes nothing and looks busy.

Questions people ask

Why send the verbatim rather than the score?

Because the number says there is a problem and the sentence says what it is. The paragraph a detractor wrote is the actionable part, and it is the part that almost never leaves the survey tool.

How fast should a detractor be routed?

Within the hour. A complaint answered the same day is often a save; the same complaint surfacing in a monthly report is material for a churn post-mortem.

Why match on contact id instead of email?

Because people change email addresses, and an email-keyed match silently breaks the history for exactly the long-tenured contacts whose trend you most want to see.

Why do fatigue rules matter?

Because over-surveying drops the response rate and skews the sample toward people who are annoyed. At that point the score stops measuring satisfaction and starts measuring irritation.

What should be reported?

Churn among detractors against churn among everybody else. If they are the same, the survey predicts nothing, and no amount of reporting the company average will reveal that.

Vibe-coding app guides

Vibe-code an entire app with Helix

This moves the data between systems. It does not give anybody a screen to work in. Build that app in Claude Code, Codex or Cursor, then deploy and run it governed on Tray Helix. Same kind of guide, same kind of prompts.

How to build a support performance dashboard (opens helix.tray.ai in a new tab)

Further reading

Background on the same subject, for the case rather than the build.

Last reviewed September 2026.