Vibe code your own Help Scout

Vibe code your own Help Scout as inbound mail, assignment, and a reply. Collision detection, deliverability, and the knowledge base stay on the skip row.

  • teardown
  • vibe-coding
  • scope

You can vibe code your own Help Scout as inbound mail, assignment, and a reply. The catalog calls Help Scout that loop, not a helpdesk operating system.

You pay $25–$75 a person a month. The card says that price scales with the team. The verdict is “Great for one inbox”.

Last time I wrote about building a Kit alternative. That was a regular backlog post. This one is a teardown.

Vibe code your own Help Scout as an inbox

The Help Scout page splits the work into three rows.

The first row is 3 days. Inbound email threading, assignment, replies. That is one shared address, a list of conversations, and a composer. You can vibe-code this.

The second row is 2 weeks and up. Queues, collision warnings, saved replies, reports. Still one inbox.

The third row is 1 month and up. Deliverability infrastructure, live chat, a knowledge base, apps. Skip that row.

If you tell an agent to “clone Help Scout”, it aims at the third row. The useful v1 is the first one.

Here is the shape of one conversation. Nothing else has to exist at 3 days.

const conversation = {
  id: 'conv-1842',
  customerId: 'cus-ada',
  subject: 'Login after password reset',
  status: 'active',
  assigneeId: null,
}

const message = {
  conversationId: 'conv-1842',
  type: 'customer',
  body: 'The Slot login page 500s after a reset.',
}

A mailbox, a customer, a conversation, messages with a type. Notes and collision checks wait a week.

The audience on the page is a five-person support team sharing one email address. If that is you, one inbox is enough. If the company already lives in Beacon, Docs, and Workflows, keep paying.

The same v1 also replaces Zendesk, Freshdesk, and Chatwoot if what you wanted was shared mail. Intercom is the in-app cousin at $74–$139 a person a month. I already wrote that teardown. Gorgias is the store ticket at $10–$900.

How does Help Scout work

Help Scout publishes an Inbox API at https://api.helpscout.net/v2, plus Docs, Beacon, Chat, Apps, and webhooks. I am summarizing those pages, not reconstructing today’s mail cluster.

An inbox is the shared address. The inboxes article says the first one is [email protected]. A custom address is a second step. You prove you own it, then forward from your provider. Replies must leave Help Scout. Answer from the original mailbox and the thread splits.

Outbound mail can ride Help Scout’s servers, Google OAuth, Microsoft 365 OAuth, or custom SMTP. Send from their servers on your domain and they ask for DKIM. Without those records the message shows as “via helpscout.net”. That is the start of the skip-row deliverability product.

A conversation lives in one inbox. Create it with POST /v2/conversations. The create conversation docs want a subject, a mailboxId, a type (email, chat, or phone), a status, a customer, and at least one thread. Status is active, closed, or pending. The catalog’s v1 uses active and closed.

The customer is an id or an email. An unknown email creates a customer. A known email is a lookup. The rest of the profile is ignored on a match. That is their rule, not a guess.

A thread is one slice of the conversation. The list threads page names customer, message (a user reply), note, and lineitem, plus chat, phone, and forward types. A reply is POST /v2/conversations/{id}/reply. A note is POST /v2/conversations/{id}/notes. Those are two URLs. Copy that split. Do not store a boolean internal.

A lineitem records assignment, a status change, or a move. It has no body. A published reply without an explicit status reactivates the conversation. One conversation can hold 100 threads. The 101st returns HTTP 412.

Folders are views, not copies. The default folder page lists Unassigned, Mine, Assigned, Closed, and Spam. Unassigned is active or pending with no owner. Mine is assigned to you. Waiting is a sort, not a folder. It updates on a customer or user reply. Notes do not move it. A v1 can show Unassigned, Mine, and Closed.

Assignment is one field. Create and update use assignTo. The value is a user id or a team id. Same ID space. A dropdown that writes assigneeId is enough for 3 days.

Collision Detection is the other product. The collision article says it is on for every plan. No setting. Yellow means a teammate is viewing. Red means they are typing a reply or a note. A send pauses if another reply, note, or inbound message landed while you were writing. The API marks that thread underreview. You send, edit, or discard. Treat “they keep presence on a socket per conversation” as an educated guess. The public contract is the color, the pause, and the thread state.

Presence also drives routing. The status page and the users statuses endpoint expose active or away. The source can be presence_detection. Away users skip automatic assignment. Skip that on the 3-day row.

Inbound mail is forwarded or received on the Help Scout address. Their delivery article says a missing message may already sit on another conversation. Show Original keeps headers for two years. Treat matching on Message-ID and In-Reply-To as an educated guess. The public fact is that a reply can land on an existing conversation.

Saved replies, seven reports, Workflows, and signed webhooks sit on later rows. You verify X-HelpScout-Signature. Beacon and Docs are separate APIs.

I would not claim I know their database. A mailbox table, conversations, threads, and a search index is an educated guess. The public picture is the inbox, the conversation, and the thread types.

INBOUND MAIL Forward or helpscoutapp.com One shared address WORKER PARSES THE MAIL Customer lookup by email New conversation or a reply D1 HOLDS THE ROWS Mailbox, Customer, Conversation Message type is the split ASTRO APP ON THE REQUEST Folders, assign, compose Notes never hit the provider WORKER SENDS THE REPLY One message, one provider call Sanitize HTML first SKIP THIS HALF Collision, presence, routing Beacon, Docs, Workflows DKIM, OAuth SMTP, reports
Mail lands on a worker. The app reads the same rows. Beacon and Docs sit on the skip row.

A v1 can skip multiple inboxes. One mailbox, one From address, one team. The card’s stack is Workers, Astro, and D1. Node.js plus Astro is the catalog default. Use TanStack Start if React is your weekday language.

Screens of a Help Scout alternative

Three surfaces for v1. If the agent starts a Beacon or a Docs site, send it back.

The folder is home. Unassigned, Mine, Closed. A row is a subject, a customer, and how long they have waited. Open a row to the conversation.

WIREFRAME · FOLDER Unassigned · 2 active Login after password reset Ada · waiting 14 min Invoice PDF missing Marco · waiting 2 hr Mine · 0 Closed · 18
Home is Unassigned. Mine and Closed are the same rows with a different filter.

The conversation is the thread. Customer mail on the left. Your replies on the right. A note is a third shape, never mailed. Assignment and status sit in the header.

WIREFRAME · THREAD Login after password reset Ada · unassigned · active Ada · customer Login 500s after reset Lea · note Check the Slot reset job Reply to Ada Type the fix, then send Notes stay off this path
One conversation. Customer mail, a private note, a reply. Notes use a different write.

The composer is the send. Body, optional attachment, a status after send. Saved replies wait for the 2-week row. The guardrail on the card is the useful sentence: separate private notes from outbound replies, and sanitize inbound HTML and attachments.

WIREFRAME · REPLY Assign to Lea · then close The reset job was stuck. Try Slot again in a minute. Attachment waits if empty SEND
Assign, write, send. Closing is a status on the same write.

How a Help Scout alternative inbox works

The loop is receive, assign, reply.

Ada mails support. The worker sanitizes the HTML and looks up her email. No match, so it creates a customer and an active conversation with one customer thread. Unassigned picks it up.

Lea assigns herself. That is one write and a lineitem. The row moves to Mine. She adds a note about the Slot reset job. That write must not call the email provider.

She sends a reply and closes. The app writes a message thread, queues one provider send, and sets status to closed. A later reply from Ada reopens it. Help Scout’s API does the same unless you mark the thread imported.

MAIL ARRIVES Parse, sanitize, look up LAND IN UNASSIGNED New row or an old thread ASSIGN AND NOTE Note skips the provider SEND AND CLOSE One reply, one status write ADA REPLIES AGAIN Same conversation reopens Folders reread the row
The 3-day v1 is receive, assign, reply, reopen. Folders stay honest because they share the row.

Two people grabbing Unassigned is the collision you skip this week. Assignment is the cheap lock. Add the yellow and red presence on the 2-week row.

The hard half of a Help Scout alternative

The skip row starts when the inbox grows a second product.

Collision Detection is the first tax. Live viewers, typing state, a paused send, and a thread your UI has to resume. Presence that flips people to Away so routing stays honest. A 3-day v1 has assignment and one owner.

Deliverability is the second. Forwarding quirks, DKIM, OAuth send, custom SMTP, bounced threads, and a two-year source archive. I already wrote the Mailchimp teardown for reputation. Rent that part if the shared address is public.

Beacon is live chat plus Docs search, with web and mobile SDKs. Docs is a second API at docsapi.helpscout.net. Workflows are a rule engine you can run by id. Apps are a sidebar. Reports are seven products. Chat and phone sit next to email.

Treat their exact mail-matching rules as an educated guess. The public docs show headers, folders, and thread types. They do not publish the parser.

3-DAY V1 Inbound mail and threads Assignment and a reply One mailbox, two statuses SKIP THIS HALF Collision and presence Deliverability and bounces Beacon, Docs, Workflows
Ship the inbox. Leave collision, the mail platform, and the three extra products on the skip row.

I would rebuild Help Scout for five people and one support address. Unassigned. Mine. A reply that cannot leak a note.

I would not turn on chat. I would not invent a knowledge base so the same login can search articles.

Host it next to the product, on Node.js and Astro, with Workers on inbound and outbound mail, because that is the stack on the card. Use TanStack Start if React is your weekday language. The hosting post already covers D1. Persist mailbox, customers, conversations, and messages in D1. Attachments wait for object storage on the 2-week row.

If the rent is an in-app bubble, that is Intercom, 4 days. If it is a ticket beside an order, that is Gorgias, 3 days. If the questions are already in a FAQ, that is Chatbase, $40–$150.

Start with the first row

Go to Build your own Help Scout. Copy the Astro prompt, or TanStack Start if that is what you write.

Tell the agent the first estimate only: inbound email threading, assignment, replies. Three days.

If twelve coworkers already live in Beacon, Docs, and Workflows, keep paying.

Keep reading

Read all articles →