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
| 412 | 58% | |
| Widget | 186 | 26% |
| Discord | 74 | 10% |
| Portal | 29 | 4% |
| API | 14 | 2% |
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
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
- Stripe
- Supabase
- Postgres
- MongoDB
- RevenueCat
- Paddle
- Shopify
- Slack
- GitHub
- Linear
- Jira
- Convex
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.
- 01How much is it, and what happens to my bill if I add two people?
- 02I got charged twice.
- 03Your thing stopped talking to my other thing.
- 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.
01
Someone asks
A visitor types into the widget, or emails support@, or posts in your Discord. All three arrive the same way.
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.
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.
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.
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
- 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.
- 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.
- 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.
- 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.
Chronon · Inbox
Open 5 · Pending 12 · On hold 2 · Resolved 418
- UrgentEmailAssigned4mCheckout is down for all our usersPriya N.
Getting a 502 on /checkout since 9:40. Paying customers can't complete orders.
- HighEmailClosed by AI12mRefund for duplicate chargeMarcus L.
I was charged twice for order #48213 yesterday. Can you sort it out?
- MediumWidgetClosed by AI31mWhen does my plan renew?Aiko T.
Just want to know the renewal date before I add two more seats.
- MediumAPIDrafted1hExport to CSV missing columnsDevon R.
The export doesn't include the tags column that shows in the table view.
- LowDiscordNeeds you3hFeature request: dark modeSofia B.
Would love a dark theme for the dashboard. Happy to beta test.
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 --buildConsole 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
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
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
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.