Gmail quits at forty tickets a week

You know the week it happens. Two people reply to the same customer. A three-day-old email turns up under a thread about lunch.

Forward one address. Paste one script tag. About ten minutes.

Tickets by channel

Email41258%
Widget18626%
Discord7410%
Portal294%
API142%

Chronon Support

Do you charge per seat? We’re adding two more people this week.

No. Relaydesk bills on resolved tickets, not on seats, so adding teammates costs nothing.[1] Everyone in the workspace gets a login on every plan.[2]

  • [1]Pricing and billing/help/billing/pricing
  • [2]Inviting your team/help/workspace/team
Ask anything…

No article covers it? It says so, and opens a ticket with the transcript already attached.

Median first response

4m 20s

Down from 11m 05s

The agent reaches into the systems you already run

The problem

It is the same four questions

Not a figure of speech. Open your sent folder and read the last fifty replies. It will be some version of these four, and you have already answered all of them this month.

  1. 01How much is it, and what happens to my bill if I add two people?
  2. 02I got charged twice.
  3. 03Your thing stopped talking to my other thing.
  4. 04How do I do the one feature nobody can find?

Every AI support tool will offer to fix this

Most of them answer out of a model’s memory of the internet. That is how you end up with a bot cheerfully inventing a 30-day refund window you have never offered, to a customer who now has it in writing.

The demo is always great. The first real week is the tell.

What we did instead

It can only read what you published

Retrieval runs before the model does, and that order is the whole product. Scroll through one answer.

  1. 01

    Someone asks

    A visitor types into the widget, or emails support@, or posts in your Discord. All three arrive the same way.

  2. 02

    Retrieval runs first

    Before the model sees anything, Relaydesk searches your published articles and numbers what came back. This is the step that decides whether there is an answer at all.

  3. 03

    The answer cites its sources

    The model writes the reply and the markers. The server maps those markers back to the articles it actually retrieved, so an invented reference resolves to nothing.

  4. 04

    Or it admits it cannot

    Nothing matched, so it does not guess. The conversation becomes a ticket with the whole transcript attached, and you pick it up knowing what was already asked.

Chronon Support

Do you charge per seat? We’re adding two more people this week.

Ask anything…

Arrived from the widget · 0.0s

Chronon Support

Searching 14 published articles…

  • [1]Pricing and billing
  • [2]Inviting your team
  • [3]Plans and limits

Two above threshold · the model is handed these and nothing else

Chronon Support

No. Relaydesk bills on resolved tickets, not on seats, so adding teammates costs nothing.[1] Everyone in the workspace gets a login on every plan.[2]

  • [1]Pricing and billing/help/billing/pricing
  • [2]Inviting your team/help/workspace/team

Recorded as answered · 1.8s

Chronon Support

I don’t have an article covering that one. I’ve passed it to the team with everything you’ve told me.

Ticket #4812 · opened

SAML login loops on the callback

Transcript attached · 4 messages · priority set to High

Recorded as escalated · no guess made

Two more, neither of which you have to switch on. Addresses and card numbers a customer pastes in a panic are stripped before the message reaches a provider. And every workspace has a daily token ceiling, with an hourly one per embed key, because the widget is an anonymous endpoint and anyone who views source on your site is holding the key that reaches it.

Refund for duplicate charge · Marcus L.

Marcus L. · 12m

I was charged twice for order #48213 yesterday. Can you sort it out?

lookup_subscription()

→ Growth · renews 14 Sep · 2 charges on 3 Sep

refund_order(order_id: "48213", amount: 4900)

→ refund re_3Q9x issued

Relaydesk · 11m

Sorry about that, Marcus. I can see the duplicate charge on order #48213 and have refunded $49.00 to your card. It should land in 3 to 5 business days.

Closed without a human. Sara was notified in Slack.

When an answer is not enough

Some tickets need something done

An article cannot refund anybody. Give Relaydesk a webhook with typed parameters, or point it at an MCP server you already run, and it looks up the subscription, issues the refund, and says so on the thread. Every call it makes is written to the conversation where a human can read it and disagree.

Settings · Tools

  • lookup_subscriptionwebhook
  • refund_orderwebhook
  • search_ordersmcp
  • cancel_planwebhook

Setup

In the order you will actually do it

  1. 01

    Forward support@yourdomain to the address we give you.

    No DNS records and no IMAP password. Relaydesk stores no mailbox credentials at all, which is also why a stolen copy of the database gets an attacker nowhere near your mail.

  2. 02

    Paste one script tag above </body>.

    That is the widget. It reads your published articles and nothing else. Restrict it to your own domains from the settings page.

  3. 03

    Write four articles.

    Yes, those four. This is the part everyone skips and it is the only part that matters, because the answers come out of these and nowhere else.

  4. 04

    Connect Discord, the API, or neither.

    Discord threads and POSTs to the tickets API land in the same queue as the email. Most people turn this on in month two.

The part that is not AI

Everything lands in one queue

A Discord thread, a forwarded email, a widget escalation and a POST to the tickets API all produce the same object: same statuses, same priorities, same labels, same assignment, same saved views. Turn every automation off and what is left is still a help desk you would use. Triage rules are written in plain language, not a builder with eleven dropdowns, and you can edit one and re-run it across the open queue.

Settings · Triage · priority

Set @URGENT for outages, security issues, or any message containing "down"
Set @HIGH for paying customers reporting a broken feature
Set @MEDIUM for general product questions
Set @LOW for feature requests and feedback

Check our homework

One row per answer attempt

Not one row per successful answer. Per attempt, including the ones that refused, the ones that fell back to the ticket form when a provider timed out, and the ones that ended because the visitor closed the tab mid-sentence. Those get written before the model is called, so a visitor hanging up cannot quietly delete the evidence.

Everyone publishes a resolution rate. Almost nobody hands you the table it came out of.

answered
cited an article and finished
escalated
became a ticket, transcript attached
refused
nothing matched, so it did not guess
degraded
provider failed, visitor saw the form

Answered without a human on the thread

38%

Up 9 points since the articles went live

Open backlog

23 of 41

Median first response

4m 20s

Down from 11m 05s

Figures from one demo workspace, not an average.

Or do not pay us at all

Run the whole thing yourself

AGPL-3.0, top to bottom. A Next.js console, a FastAPI backend and Postgres come up from one Compose file. Bring your own model keys and nothing leaves your network. The hosted version runs this same code, so moving between them is a database dump, not a migration project.

Terminal

git clone https://github.com/openfoundry/relaydesk
cd relaydesk
cp .env.example .env
docker compose up --build

Console localhost:3000 · API localhost:8000

AGPL-3.0
Licence, top to bottom
1
Compose file to stand it up
0
Mailbox credentials in the database

Priced on tickets, not seats

Adding the person you just hired to the queue is not a budget conversation. Every plan includes the widget, the help centre and the AI. Running it yourself costs nothing, forever, and we would rather you did that than bounced off a paywall.

Starter

$50

per month

For teams taking support seriously for the first time.

  • 3 seats
  • 300 tickets / month
  • Connect your database and Stripe
  • One unified inbox across channels
Choose Starter

Growth

Most picked

$200

per month

For teams where support volume is climbing fast.

  • 10 seats
  • 1,000 tickets / month
  • Every channel and integration
  • Priority support
Choose Growth

Enterprise

Let's talk

For teams with procurement, and a security review.

  • Custom seats
  • 3,000+ tickets / month
  • SSO and SAML
  • A named account manager
Contact sales

Go write the four articles

Forward your support address, paste the script tag, and write up the questions you are tired of answering. If it is not pulling its weight in a fortnight, export everything and walk away.