A shared inbox for customer email, with a help centre and live chat beside it. Several people work the same mailbox without answering the same message twice, and each conversation keeps its history, notes and assignment.
Build me a shared inbox that replaces Help Scout — and know what makes this ALMOST. Two things carry the verdict. **Email threading that survives every client's quoting style** is far harder than it looks, and getting it wrong splits one customer's conversation into five. And **collision detection**, so two agents do not answer the same person at once, which is the difference between a shared mailbox and a mess. Both are buildable; neither is a weekend. STACK - Node 20+ with Fastify, server-rendered HTML with a little vanilla JS - SQLite through better-sqlite3, WAL mode, with FTS5 - Caddy in front THE DATA MODEL - mailboxes: id, name, address, signature_md, auto_reply_md, business_hours_json - customers: id, email, name, traits_json, first_seen_at, last_seen_at - conversations: id, mailbox_id, customer_id, subject, status, assignee_id, priority, first_response_at, resolved_at, snooze_until, created_at - threads: id, conversation_id, kind, direction, author_kind, author_id, body_html, body_text, body_stripped, headers_json, message_id, in_reply_to, references_json, created_at — kind is a reply, a note, or a system event - attachments stored by hash with the type from content - viewers: conversation_id, user_id, at, is_typing — in memory, expired quickly - saved_replies, tags, workflows, and an append-only events table THREADING, WHICH IS THE FIRST HARD PART - Match on Message-ID, then In-Reply-To, then References. Only then fall back to subject plus participants, and never on subject alone — two customers writing 'Re: my order' must not become one conversation - Strip quoted history for display and keep the whole message. Every client quotes differently: some prefix with angle brackets, some wrap in a div with a known class, some prepend a header line in the sender's own language. Collect real examples and build a stripper against them, with a fixture per client - Show the stripped view with a control to expand the original, always. A stripper that eats part of a customer's actual message is worse than one that leaves quoting in - Detect automatic replies and bounces from their headers and never turn them into conversations, or the inbox starts talking to itself - Outbound sets the headers that keep the thread intact, and a per-recipient send cap so a loop cannot mail somebody four hundred times COLLISION DETECTION, THE SECOND - When somebody opens a conversation, that is recorded and shown to everybody else: who is looking, and who is typing - A warning before sending if another reply was sent while yours was being written - Assignment as the stronger form: an assigned conversation is somebody's, and the list makes that obvious - None of it needs a socket per user — a small polling endpoint is enough and far less to operate THE INBOX - One list with filters: unassigned, mine, by tag, by status, by mailbox - Keyboard driven, because this is used all day - Notes visibly different from replies and impossible to send to the customer by accident. That confusion is the failure a customer sees, and it is unrecoverable - Saved replies by shortcut with variable substitution - Snooze with a wake time, which is how a conversation waiting on somebody else stops cluttering the queue - Merge two conversations from the same person, keeping both histories DELIVERABILITY - Send from your own domain with SPF, DKIM and DMARC, documented in the README - Inbound by provider webhook or IMAP, with a retry and an alert if the feed stops. An inbox that silently stops receiving is the worst failure here, so monitor the age of the newest message THE HELP CENTRE - Collections and articles in Markdown, public, searchable, with its own sitemap and canonical URLs - Search from inside a reply, to insert an article - Failed searches recorded — an empty result is a request for an article MEASURING - First response time, resolution time, conversations per person, by day and hour, computed at query time from events. Never stored totals OPERATIONS - .env: DATABASE_PATH, STORAGE_PATH, BASE_URL, SMTP_URL, IMAP_URL, SESSION_SECRET, HASH_SALT - Migrations on boot, each once; nightly backup off the machine, restore script - Health endpoint checking both mail directions and the age of the newest inbound message WHAT MATTERS MOST Threading and never losing a message. Point a real address at it for a week and read everything that arrives — an inbox that drops or splits mail is unusable from the first day.
What you lose
- Email threading that survives every client's quoting style, which is far harder than it looks
- Collision detection, so two people do not answer the same customer at once
- Deliverability on replies sent from your support address
- Saved replies, workflows and reporting on response time that a growing team leans on
- A knowledge base and in-app widget that deflect tickets before they arrive
If you would rather not build
- Zammad — mature open-source helpdesk
What it costs
read from their page 15 Aug 2026
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| — | $25/mo | — | 15 Aug 2026 |
Their pricing page is where these came from. Seeing a different price? Tell us.
The escape hatch
open source · no votes, no paid placement
FreeScout
$0Shared inbox and help desk in the same shape, run on your own server.
freescout-help-desk/freescoutfree · open source
Chatwoot
$0Shared inbox across email, chat and social, with canned replies and teams.
chatwoot/chatwootfree · open source
Why this verdict
our own opinion · changed only by a person
50/100
Verdict kinda at 50: an inbox with threading and assignment is a solid weekend, but email threading edge cases and reply deliverability are where home-built helpdesks quietly fail. Below three or four agents, a shared mailbox and a rule may beat both options.
History
tracked since 6 Aug 2026 · nothing is ever overwritten
Questions about Help Scout
answered from the record above
Is Help Scout free?
No — the plan we track is $25 a month. Standard, $25 per user per month on monthly billing, around 16% less billed annually. Plus is $45 and Pro $75 per user per month.
Can you replace Help Scout by building your own?
ALMOST. A weekend of work, and real gaps remain. Replacement score 50 out of 100, build time a weekend. Read what you lose before you decide.
How much does Help Scout cost?
$25 a month on Standard — $300 a year. Recorded 6 Aug 2026.
What do you lose by replacing Help Scout?
Email threading that survives every client's quoting style, which is far harder than it looks; Collision detection, so two people do not answer the same customer at once; Deliverability on replies sent from your support address; Saved replies, workflows and reporting on response time that a growing team leans on; A knowledge base and in-app widget that deflect tickets before they arrive. If any of those carry weight for you, keep paying.
Is there an open-source alternative to Help Scout?
Yes: FreeScout, Chatwoot. The prompt on this page is for when you want it your way instead.
Related entries
same category first, most replaced first
Every week, something stops being worth paying for.
New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.
free forever · no tracking pixel · stored here, never passed to anyone

