Customer Support logo

Customer Support

Community
ericrisco
customer-support

Use when a live support ticket needs triage (intent, P1–P4 priority, SLA clock), an on-voice reply, not a raw template, de-escalation of an angry or churn-risk customer, or escalation with a handoff packet. NOT the help-center article it links to (that is `technical-writing`), a win-back program (`retention`), or the auto-answer bot (`chatbot`).

Overview

Publisherericrisco
Repositoryrsc-harness
Skill namecustomer-support
Stars
239
Forks
24
Bundled files
2
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 2 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by ericrisco on GitHub. Read the source before you install it.

Installation

Install the Customer Support AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/ericrisco/rsc-harness/tree/main/skills/customer-support
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/ericrisco/rsc-harness.git /tmp/rsc-harness
mkdir -p .claude/skills
cp -r /tmp/rsc-harness/skills/customer-support .claude/skills/customer-support
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Customer Support in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Customer Support on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Customer Support is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Customer Support — Run the Desk on a Live Ticket

You own the support desk as an operation: take an incoming ticket, assign priority and intent, start the SLA clock, draft the reply (macro or bespoke), enforce tone, and decide escalation with a clean handoff. The output is a triaged, answered ticket — human judgment, not a code artifact.

The triage-to-reply loop (the spine)

Run every ticket through these six steps in order. Skipping triage to "just reply fast" is how you send the wrong tone to a P1.

text
1 Classify intent   →  what does the customer actually want? (bug, how-to, refund, outage, rage)
2 Set priority      →  P1–P4 (impact × urgency × account tier)
3 Start SLA clock   →  pick the FRT target NOW, before drafting
4 Draft reply       →  macro skeleton or bespoke; one personalized line minimum
5 Tone / voice check →  on-brand, de-escalated, no banned phrases
6 Escalate or send  →  trigger met? hand off with the packet. else send + log.

Priority, SLA, and the escalation call

The branch is at step 6. This table sets priority, both SLA clocks, and whether the ticket leaves your hands:

Signal in the ticketPriorityFirst response (FRT)Resolution targetEscalate?
Production down / data loss / payments broken / many users blockedP1 critical15–30 minASAP, status updates every 30–60 minYes → tier-2/eng + the packet
Enterprise/VIP account, or "cancel / refund / lawyer / unacceptable"P1–P230 min – 1 hSame business dayYes → owner + tier-2
One user blocked, no workaroundP2 high1–2 hSame business dayOnly if unresolved past target
Question with a workaround, billing queryP3 medium4–8 h1–2 business daysNo, unless policy claim is unverifiable
FAQ, cosmetic, feature requestP4 low~1 business dayBest effortNo

Why pick the FRT target before drafting: the SLA decides your tone and length. A P1 gets a two-line acknowledgment in 20 minutes, not a polished essay in two hours.

Use 3–4 priority tiers, never a flat SLA. Too many tiers confuse the desk; too few don't differentiate the outage from the typo (Emailmeter / Hiver, 2026-06-02).

Acknowledge fast even when you cannot resolve fast. First-response and resolution are separate, linked SLAs: FRT sets the expectation, resolution is the outcome. 89% of customers feel valued by a fast first response even when the full fix takes longer (getMonetizely / Hiver, 2026-06-02). So: acknowledge inside the FRT window with an honest "here's what I know and when I'll update you," then resolve honestly. Never go silent to wait for a perfect answer.

Full P1–P4 matrix by channel (email/chat/phone) lives in references/macros-and-sla.md.

Macros done right

A macro with one genuinely personalized sentence raises CSAT; a verbatim template lowers it. Macros cut first-response time 30–50%, but sent raw they read as scripted (TextExpander / Gorgias, 2026-06-02). So every macro is a skeleton you finish, not a message you forward.

The 4-beat skeleton — every reply hits these in order:

text
1 Empathy / ack   →  name the problem in their words (1 line)
2 Answer          →  the fix, the status, or the next concrete step
3 Next step       →  what happens now + when they'll hear back
4 Close           →  human sign-off, door left open

Rules:

  • Fill dynamic fields, then add one bespoke line. Placeholders like {{first_name}}, {{order_id}}, {{ticket_id}}, {{date}} are table stakes — they are not personalization. The personalized line references this ticket's specifics.
  • Never send a macro with a visible {{placeholder}}. A leaked {{first_name}} is worse than no name.
  • One reply, one ask. If you need three things from the customer, you'll get one. Batch the request or sequence it.

Bad → Good (info-request macro):

text
Bad (verbatim template, robotic):
  Dear Customer, Thank you for contacting support. We have received your
  request. In order to assist you, please provide additional information.
  Your satisfaction is important to us. Regards, The Support Team.

Good (skeleton + one personalized line):
  Hi Marta — sorry the export keeps failing on you. To dig in I need one
  thing: the rough time you last hit "Export CSV" today (so I can pull the
  matching server log). I noticed your account is on the new billing plan,
  so this might be the same migration glitch we patched yesterday — I'll
  confirm and get back to you within 2 hours. — Eric

The Good version names the feature, gives a real next step + a time, and the "new billing plan / migration glitch" line proves a human read the ticket.

Full skeleton library (ack, info-request, resolved, refund, known-bug, outage, churn-save, escalation-handoff, feature-request decline, gentle-close) is in references/macros-and-sla.md.

Tone and de-escalation

Apply the brand voice; do not invent it here. The voice guide is authored by ../brand-voice/SKILL.md — this skill reads it and writes the reply against it.

For an angry or churn-risk ticket, de-escalation moves in order:

  1. Acknowledge the feeling before the facts. "Three days without a reply is not okay, and I get why you're frustrated" lands before any fix.
  2. Take ownership in the first person. "I dropped this" beats "the team was unable to." No passive voice to hide behind.
  3. One concrete next step with a time. Vague reassurance reads as a brush-off; "I'll have an answer by 3pm" is trust.
  4. Match their stakes, not their volume. Stay calm and specific. Do not argue, and never match anger with anger.

Banned phrases — they escalate, not de-escalate:

Never writeWhy it backfiresWrite instead
"Please calm down."Tells them their feeling is the problem."You're right to be frustrated — let's fix it."
"As I said / as previously mentioned"Scolds them for not reading.Just restate it plainly.
"Per our policy." (naked)Hides behind rules, no human.Explain the why, then the policy.
"Unfortunately, there's nothing we can do."Dead end, zero path.Offer the nearest thing you can do.
"This is a known issue." (alone)Sounds like "we knew and didn't care."Add the status + the ETA or the workaround.

Checklist before send: feeling acknowledged · first-person ownership · one timed next step · no banned phrase · no {{placeholder}} left.

De-escalating this ticket is the job here; running a win-back or renewal program is retention.

Escalation

Escalate on explicit conditions, not vibes. Standard tiers: T1 frontline/common, T2 specialist/complex, T3 engineering or exec/critical (Kapture / Hiver, 2026-06-02). Hand off when any trigger fires:

  • Negative-language signals: "unacceptable", "cancel", "refund", "lawyer", "chargeback".
  • SLA at risk: the FRT or resolution target is about to blow.
  • Account tier: enterprise / VIP.
  • Confidence below threshold: if an assisted/AI draft is below ~85% confidence on a policy or price claim, hand to a human — don't guess (swiftflutter / Kapture, 2026-06-02).

Context must travel with the escalation. 70% of customers expect the next agent to know their history; making them repeat themselves adds 90–180 seconds per ticket (Forrester via Fini Labs, 2026-06-02). Never escalate a bare ticket link. Attach the handoff packet:

text
HANDOFF PACKET
- Customer + account tier:  Marta R. — Enterprise (VIP)
- Ticket / priority:        #4821 — P1
- One-line summary:         CSV export 500s since ~09:00; blocking month-end close.
- Steps already tried:      Confirmed not browser/cache; reproduced on staging.
- Customer sentiment:       Angry, has mentioned "cancel" once.
- Collected variables:      plan=new-billing, last_export=09:14, region=eu-west
- What I need from you:      Confirm if the billing-migration patch covers this.

The full escalation matrix (trigger → tier → owner) is in references/macros-and-sla.md.

FAQ and KB answering

Quote the KB or escalate — never invent policy, price, or an ETA. Hallucinated support answers produced 150+ documented legal cases by mid-2025 (cmswire / swiftflutter, 2026-06-02). The guardrail:

  • If the answer is in the KB, quote it and link the article. Don't paraphrase a refund window or a price from memory.
  • If it is not in the KB, say "let me confirm" and escalate — do not fill the gap with a plausible guess.
  • Deflection is bounded by KB quality. Triage-only without a strong KB deflects ~20–30%; well-organized KBs push assisted/auto resolution to 50–80% (Zendesk / Intercom / Fini Labs, 2026-06-02). A bad answer fast is worse than a correct answer slightly slower.

This skill consumes the KB; it never writes it. If the article the customer needs does not exist, flag the gap — authoring it is a technical-writing job, and building the autonomous auto-answer bot on top of the KB is chatbot + rag.

Metrics — what to watch and when

No single metric is sufficient; track the trio plus resolution rate (Armatis / Giva, 2026-06-02):

MetricWhat it measuresWhen to optimize for it
CSATTransactional satisfaction; positive ÷ total × 100After any single ticket; the default health signal
CESCustomer effort, 1–7 scaleWhen tickets resolve but customers still churn — friction is the problem
NPSRelationship; promoters − detractorsQuarterly / relationship level, not per-ticket
FCR / one-touchResolved in one interactionWhen repeat contacts are climbing — optimize the first reply

Rule of thumb: optimize FRT for reassurance (the customer feeling handled), FCR for effort (fewer round-trips). They pull in different directions — don't chase both blindly.

Anti-patterns

Anti-patternWhy it failsDo instead
Send the macro verbatimReads as scripted, drops CSATSkeleton + one bespoke line + filled fields
Polish for an hour, send nothingMisses the FRT windowAcknowledge fast, resolve honestly later
One flat SLA for every ticketOutage waits behind a typo3–4 priority tiers with distinct FRT targets
Argue with an angry customerVolume escalates, churn risesAcknowledge feeling, own it, give a timed step
Invent a policy / price / ETAHallucinated answers create real liabilityQuote the KB or say "let me confirm" + escalate
Escalate a bare ticket linkNext agent restarts, +90–180s, angerAttach the handoff packet every time
Leave a {{placeholder}} in the replyWorse than no name; signals automationVerify all fields filled before send
"Please calm down" / "as I said"Tells them their feeling is the faultDe-escalation moves; banned-phrase swaps
Promise a fix you can't verifyBreaks trust when it slipsPromise the next update time, not the fix
Chase NPS off a single ticketWrong altitude metricCSAT/FCR per ticket; NPS at relationship level

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Customer Support AI skill do?

Use when a live support ticket needs triage (intent, P1–P4 priority, SLA clock), an on-voice reply, not a raw template, de-escalation of an angry or churn-risk customer, or escalation with a handoff packet. NOT the help-center article it links to (that is `technical-writing`), a win-back program (`retention`), or the auto-answer bot (`chatbot`).

Why use Customer Support on TypingMind?

Because you install it once and use it with any model. Customer Support is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Customer Support in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/ericrisco/rsc-harness/tree/main/skills/customer-support. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Customer Support?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Customer Support?

As many as you like. As long as a model supports skills, you can use Customer Support with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Customer Support AI skill free?

Yes. It is published on GitHub by ericrisco under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇