Skip to Content

Missing Feature: Backlink Outreach Reply Tracking

Priority: 🟡 Nice-to-have (post-launch) Area: SEO / Backlinks / Outreach


What Exists

  • Outreach emails are drafted by the backlink-writer agent, edited in the DM portal (/seo/link-building/[id]), and sent via Resend through the notification infrastructure.
  • The CampaignEmail model records status (draft/approved/sent) and sentAt.
  • The Backlink model tracks outreachStatus (prospecting → outreach_sent → responded → agreed → published) and timestamps per stage.
  • DMs manually advance the status via the backlink detail page when they receive a reply.

What’s Missing

1. Automated Reply Detection

When a prospect replies to an outreach email, there is currently no mechanism to automatically detect it. The DM has to:

  1. Check their inbox manually.
  2. Come back to the backlink detail page.
  3. Manually change outreachStatus to responded and paste the reply content into Notes.

2. Reply Content Storage

There is no BacklinkReply model. Reply subject, body, sender, and timestamp have nowhere to live. The timeline on the detail page shows “Responded” as a status but no reply text.

3. No-Response Follow-up Tracking

There is no way to flag a prospect as no_response automatically after N days without a reply.


Implementation Options

Resend fires webhook events for email.replied (when a reply comes in to a Resend-tracked thread).

What to build:

  • POST /webhook/resend route in the Fastify API (verify Resend signature).
  • On email.replied event: look up the CampaignEmail by messageId (store Resend’s message ID on send), advance Backlink.outreachStatus to responded, set respondedAt, create a BacklinkReply record.
  • New BacklinkReply model: { id, backlinkId, campaignEmailId, from, subject, body, receivedAt }.
  • Reply thread card on the backlink detail page (both DM and dashboard portals).

Limitation: Only works for replies that come back to the Resend-tracked thread (i.e., if the prospect replies to the exact sent address). Does not work if the DM uses a personal inbox.

Effort: ~1 day.

Option B — Gmail / Outlook Polling

A scheduled BullMQ job polls a connected Gmail/Outlook account for replies matching sent subjects.

What to build:

  • OAuth flow per DM user (Google/Microsoft).
  • ConnectedMailbox model storing refresh tokens.
  • email-reply-poller BullMQ worker (runs every 15 min per connected mailbox).
  • Thread-matching logic: match by In-Reply-To or subject prefix.
  • Same BacklinkReply model + detail page display.

Effort: ~3–4 days. Requires OAuth setup per email provider.

Option C — Forward-to-Inbox (Cheapest Hack)

DM forwards replies to a dedicated replies@leadmetrics.ai address. A webhook parser (e.g., Cloudmailin, Postmark inbound) parses them and routes to the right backlink by matching a unique tag in the reply subject/footer.

Effort: ~2 days. Requires a dedicated inbound email address.


Auto No-Response Flagging

Regardless of which option above is chosen, a separate backlink-followup-checker BullMQ cron job (daily) should:

  1. Find all backlinks with outreachStatus = "outreach_sent" and outreachSentAt < now - 14 days.
  2. Mark them no_response.
  3. Optionally notify the DM.

Effort: ~2 hours once the status model is in place.


  • packages/db/prisma/schema.prisma — Add BacklinkReply model; add messageId field on CampaignEmail.
  • apps/api/src/routers/ — New webhook route + reply router.
  • apps/dm/src/app/(dm)/seo/backlinks/[id]/BacklinkDetailDMClient.tsx — Reply thread card.
  • apps/dashboard/src/app/(dashboard)/seo/backlinks/[id]/BacklinkDetailClient.tsx — Read-only reply view for clients.
  • packages/agents/src/workers/backlink-followup-checker.worker.ts.

© 2026 Leadmetrics — Internal use only