Reply Inbox¶
The reply inbox monitors your outreach mailbox via IMAP, automatically classifies replies, and deduplicates incoming messages.
How It Works¶
flowchart TD
A[Poll IMAP Inbox] --> B[Search for New Messages]
B --> C[Fetch Message Headers + Body]
C --> D{Already Processed?}
D -->|Yes| E[Skip Duplicate]
D -->|No| F[Find Matching Attempt]
F --> G[Classify Reply]
G --> H[Store Reply Record]
H --> I[Update Lead Status if Interested]
style A fill:#e3f2fd
style G fill:#e8f5e8
style E fill:#ffebee
IMAP Configuration¶
| Setting | Env Var | Default |
|---|---|---|
| IMAP host | IMAP_HOST |
— (required) |
| IMAP port | IMAP_PORT |
993 |
| IMAP username | IMAP_USER |
— (required) |
| IMAP password | IMAP_PASS |
— (required) |
| Fetch limit | IMAP_FETCH_LIMIT |
50 |
Fetch limit
IMAP_FETCH_LIMIT controls how many messages are processed per poll cycle. Increase for high-volume mailboxes, decrease to reduce IMAP load. Default is 50.
Polling for Replies¶
API: POST /api/v1/backlink-outreach/replies/poll
The reply monitor:
- Connects to IMAP over SSL.
- Sanitizes the
sent_from_emailbefore searching (prevents IMAP injection). - Searches for messages sent to your outreach address.
- Fetches up to
IMAP_FETCH_LIMITrecent messages. - For each message, checks if it's already been processed (deduplication).
- Matches the reply to an existing outreach attempt by sender email.
- Classifies the reply and stores it.
Reply Matching¶
Replies are matched to outreach attempts using the from_email field:
- The system looks up
find_attempt_by_from_email(from_email)to find the most recent outreach attempt sent to that email address. - If no match is found, the reply is still stored but not linked to an attempt.
Deduplication¶
The system checks reply_exists(from_email, subject) before storing a new reply. This prevents duplicate entries when the same message appears in multiple IMAP folders or is fetched in overlapping poll cycles.
Auto-Classification¶
Replies are automatically classified based on content analysis:
| Classification | Signals |
|---|---|
| Interested | "sounds good", "tell me more", "interested", "let's do it", "I'd love to" |
| Not interested | "not interested", "no thanks", "unsubscribe", "remove me", "stop sending" |
| Out of office | "out of office", "auto-reply", "automated response", "on vacation" |
| Replied | General reply that doesn't match other categories |
Manual override
Auto-classification is a best-effort guess. You can manually reclassify any reply in the UI by clicking the classification tag and selecting a different one.
Auto-Suppression on "Not Interested"¶
When a reply is classified as "not interested", the sender's email is automatically added to the suppression list to prevent future outreach.
Reply Inbox UI¶
The inbox shows:
- From: Sender name and email.
- Subject: Email subject line.
- Classification tag: Color-coded auto-classification badge.
- Date: When the reply was received.
- Linked attempt: The outreach attempt this reply matches (if any).
- Lead status: Current status of the associated lead.
Actions¶
| Action | Description |
|---|---|
| View | Read the full reply body. |
| Reclassify | Change the auto-classification. |
| Update lead status | Move the lead to "replied" or "placed". |
| Compose follow-up | Open the email composer pre-filled with a follow-up draft. |
Monitoring Best Practices¶
- Poll regularly: Set up a scheduled job to call the poll endpoint every 5-15 minutes.
- Review unclassified: Check "Replied" (generic) classifications and manually tag them.
- Act on interested leads quickly: Respond within 24 hours for best conversion.
- Check out-of-office dates: Schedule follow-ups for after the return date.
- Review suppression entries: Periodically audit the suppression list for accidental additions.
Next: Analytics — campaign performance tracking and exports.