Reply Box
Reply Box is ForgeSend's unified inbox for replies to campaign emails, at /dashboard/replies — its own sidebar item, not grouped under Infrastructure or Reporting. It pulls messages from every connected inbox into one list, automatically classifies each reply's intent, and lets you read a full thread and send a reply back from the original inbox without leaving ForgeSend.
On this page
Reply Box layout
The page is a two-panel view: a list panel on the left, a thread and compose panel on the right. There are no tabs.
Reply Box
3 unreadWe did just bring on four new AEs — can we grab 15 minutes next week?
Please take me off this list.
Select a reply
Choose a conversation from the list to read and respond
How replies get here
Reply Box doesn't depend on you checking a mailbox — three independent pollers each check every connected inbox roughly every two minutes: one for Google inboxes, one for Microsoft 365 inboxes, and one for SMTP/IMAP inboxes. Whichever provider an inbox uses, its replies land here the same way.
Each inbound message is matched to its thread using the subject and reference chain. Keeping the original subject line intact — rather than substantially editing it — helps a reply thread reliably back to its original conversation.
Filters and search
The left panel has a search box (matches sender name, sender email, subject, and body) and a row of filter pills: All, Unread, Interested, Not Interested, OOO, Unsubscribe.
Each row in the list shows an unread dot when unmatched, sender name and a relative timestamp, a colored badge if the reply has a manual tag or an AI classification, and a truncated body snippet.
Every reply across every campaign shows in the same list, filtered only by search, read state, and tag — there's no per-campaign filter.
Reading a thread
Selecting a reply marks it read and loads the full thread — every message tied to the same lead enrollment, inbound and outbound alike, oldest to newest.
Priya Nair priya@meridian.co
Noticed Meridian is scaling the sales team · Step 2
Priya Nair · 2h ago
We did just bring on four new AEs — can we grab 15 minutes next week?
You · via ops@forgesend-client.com · 2h ago
Great — does Tuesday at 2pm work?
Quoted history in a reply (> lines, an "On ... wrote:" line, or an Outlook-style header block) is collapsed behind Show quoted thread, so the fresh text is what you read first. Plain http(s):// links become clickable; nothing else in a message body is rendered as HTML.
AI classification and manual tagging
Every inbound reply is classified automatically the moment it arrives — this isn't something you trigger. A colored badge with a one-line reasoning tooltip shows the result, both in the list and in the thread header.
| AI classification | Badge color |
|---|---|
| Interested | Green |
| Not Interested | Red |
| Out of Office | Amber |
| Objection | Purple |
| Question | Blue |
| Meeting Requested | Blue |
Question and Meeting Requested render as the exact same shade of blue (#60A5FA) — the app doesn't give Meeting Requested a visually distinct badge color from Question. The label text is what actually tells them apart; the reasoning tooltip does too.
Separately, you can also apply your own manual tag from the Tag this reply dropdown — Interested, Not Interested, OOO, Unsubscribe, or Meeting Requested. The AI badge and your manual tag are two different fields and can disagree; the manual tag is what actually drives auto-pause behavior, not the AI classification.
Applying Interested, Unsubscribe, or Meeting Requested pauses the lead's sequence; Not Interested and OOO are informational labels only. See Auto-pause and bounce handling for exactly what each one does.
Meeting Requested
Meeting Requested classifies a reply that clearly asks to book a call, demo, or meeting — not just plain positive interest with no scheduling ask (that stays Interested). It works exactly like the other classifications above: the AI classifier evaluates every inbound reply automatically, and you can also apply it yourself as a manual tag, independently — either one is enough on its own to trigger the behavior below, and they don't need to agree.
Tag this reply
Whichever way it's classified, Meeting Requested queues an evaluation for that lead's pipeline record — if one already exists, it's moved forward to the Meeting Requested stage (never backward, and never past a stage it's already reached). If the lead has no pipeline record yet, this is a silent no-op; nothing gets created.
Manually applying the tag also fires a Meeting requested webhook event, the same way tagging Interested or Unsubscribe does — the AI classification alone doesn't fire that webhook, only your own manual tag does.
Sequence Canvas branch-outcome routing still recognizes only the classifications it supported before Meeting Requested was added. Meeting Requested itself isn't one of the branchable outcomes yet — you can't build an "if the reply was Meeting Requested, do X" branch today.
Sending a reply
The compose area sits below the thread: a From inbox picker, merge-tag quick-insert buttons, a saved-reply macros drawer, a live email-score badge, and Send Reply.
The From inbox defaults to whichever inbox received the reply, falling back to the first connected inbox. Cmd/Ctrl+Enter sends. Preview opens the same Gmail/Outlook desktop and mobile rendering used in Campaign Builder. Each quick-insert button is disabled (dimmed) if the lead is missing that field — First name, Last name, Company, and Email are always offered, plus one more button per workspace custom field that has a value on this lead. Clicking one inserts the bare tag (e.g. {firstName}) at your cursor, with no fallback text — add a |fallback yourself if you want one.
Merge tags in a reply
Reply compose recognizes {firstName}, {lastName}, {company}, {email}, and {name} — plus any workspace custom field by its own key — each resolving from the lead attached to this thread, with the same {field|fallback} syntax used in campaign sequence steps: the field's real value is used if it isn't blank, otherwise the literal fallback text after the | is used (or nothing, if you left the | off entirely). {name} is a convenience field, not a raw contact column — it resolves to the lead's first name if there is one, and falls back to their email address otherwise, so it's never blank.
Unlike campaign sequence steps, reply compose does not support spintax. A single-brace {...} block only ever resolves as a merge tag if the word before any | is a field ForgeSend actually recognizes for this lead — anything else, including a double-brace spintax group like {{Hi|Hey}}, is left completely untouched and sent exactly as typed, literal braces and all.
Clicking Macros opens a drawer of saved reply snippets you can create, insert, edit, and delete.
Macros
✕Book a call
Happy to grab time — here's my calendar link…
Send case study
Thought this might be relevant — a recent…
Edit macro
Clicking a macro's name inserts its saved text at your cursor and closes the drawer. A pencil and trash icon appear on hover for each row, separate from that insert action: the pencil loads the macro into the same form used to create one — its heading swaps to Edit macro, the submit button becomes Update macro, a Cancel button appears, and the row being edited gets a highlighted border. There's no separate edit modal; creating and editing share one form, one field at a time.
The reply appears in the thread immediately and is replaced with the confirmed message once the send succeeds. If it fails, your draft text is restored to the compose box so nothing is lost.
A Draft with AI button also sits in this compose area — see Reply Copilot. It writes a suggested reply into this same compose box using the full thread as context; nothing sends until you review it and click Send Reply yourself.