---
title: "Dock for SEO: link acquisition tracking with attributed agent outreach"
excerpt: "Ahrefs and Semrush hold the backlink data. Dock is the outreach table where the agent's target list, drafted pitches, send status, and reply tracking live, with reviewer approval before any outbound email is sent."
author: mei
category: Use Cases
date: "2026-05-30"
---

Link acquisition tracking in Dock means this: Ahrefs and Semrush keep the backlink graph, the referring-domain metrics, the anchor-text distribution. Dock keeps the outreach table. Every prospect the agent surfaces becomes a row. The drafted pitch, the reviewer who approved it, the send timestamp, the reply status, the eventual live link, all of it persists in one table that the SEO lead can scan on a Tuesday morning without opening a single other tab. The agent does the digging and drafting. The human approves the send. The row is the audit trail.

The split is deliberate. Ahrefs, Semrush, Screaming Frog, Google Search Console, and Clearscope remain the system of record for raw SEO data: rankings, backlink graphs, crawl output, keyword corpora. Dock is the system of record for what the agent interprets from that data. The prioritized fix list, the redirect map, the keyword brief, the outreach decision. Each Dock row carries a pointer back to the platform record (`ahrefs_backlink_id`, `semrush_domain_id`, `gsc_query_id`), plus the agent's identity, the decision it made, the reviewer who approved it, and a timestamp. When the agent needs current state, it re-reads the platform via fresh API calls. Dock holds the persistent interpretive layer that survives across sessions.

## The outreach table

| row_id | prospect_domain | ahrefs_backlink_id | target_url | pitch_angle | pitch_draft | drafted_by | reviewer | send_status | reply_status | live_link |
|---|---|---|---|---|---|---|---|---|---|---|
| OUT-0412 | smashingmagazine.com | ahrefs:bl_88231 | /guides/agent-identity | guest contribution on agent-IAM | "Hi Vitaly, your piece on..." | agent:mei | govind | approved, sent 2026-05-28 | replied, interested | pending |
| OUT-0413 | css-tricks.com | ahrefs:bl_88412 | /guides/consent-gates | broken-link replacement | "Your 2024 piece links to a 404..." | agent:mei | govind | approved, sent 2026-05-28 | no reply, follow-up due | n/a |
| OUT-0414 | a16z.com/futureproof | ahrefs:bl_91002 | /thesis/cloud-2-0 | unlinked brand mention | "You cited Dock in episode 42..." | agent:mei | pending | hold | n/a | n/a |

Three rows, three distinct outreach motions, one schema. The agent populates everything left of `reviewer`. The human fills `reviewer` and toggles `send_status` from `hold` to `approved`. The mailer reads only rows where `send_status = approved` and the reviewer column is non-null. There is no path from draft to send that skips a human.

## The workflow

The agent runs a Monday pull. It queries Ahrefs for new referring domains to three target competitors, cross-checks the [keyword brief from last week's Ahrefs run](/blog/dock-ahrefs-keyword-research), and pulls the [competitive content gaps Semrush flagged](/blog/dock-semrush-competitive). It deduplicates against the existing outreach table, scores the remaining prospects by domain rating and topical fit, and writes the top fifteen into Dock as new rows with `send_status = hold`.

For each row, the agent drafts a pitch. Pitches reference a specific piece the prospect has published, name the link target, and explain the swap or contribution on offer. The agent signs each draft with its identity, `agent:mei`, recorded in `drafted_by`. The SEO lead reviews the table on Tuesday. Approving a row flips `send_status` to `approved` and stamps `reviewer = govind`. The mailer picks up approved rows on its next sweep, sends, and writes back `sent_at`. The agent then watches the inbox via the events API and updates `reply_status` as replies arrive. When a link goes live, the agent confirms it via a fresh Ahrefs read and writes the URL into `live_link`.

## Why it matters

Attribution. Every outbound email carries an `agent:mei` stamp on `drafted_by` and a human stamp on `reviewer`. If a prospect complains, the row tells you who wrote the pitch and who let it go out. The [agent audit trail](/blog/agent-audit-and-compliance) makes the chain queryable. The [agent identity lifecycle](/blog/agent-identity-lifecycle) makes the stamp unforgeable.

Daily-driver experience. The SEO lead opens one table on Tuesday, sorts by `send_status = hold`, and approves or edits in place. They are not switching between Ahrefs, a spreadsheet, a Gmail draft folder, and a Notion tracker. The table is the workflow.

Safety. Outbound email is a [two-key irreversible operation](/blog/two-key-handshakes-irreversible). The agent drafts. The human approves. No exception.

Start with [the Dock-for-SEO pillar](/blog/dock-for-seo) for the full surface map.

## FAQ

**Does the agent ever send email without human approval?**
No. The mailer reads only rows where `send_status = approved` and `reviewer` is non-null. The agent can draft, edit, and re-queue, but it cannot flip the approval bit on its own row.

**How does Dock avoid duplicating Ahrefs and Semrush?**
It does not store backlink graphs or referring-domain metrics. It stores pointers (`ahrefs_backlink_id`, `semrush_domain_id`) and the agent's interpretation: prospect priority, pitch angle, send decision. Fresh metric reads happen against the platform API on demand.

**What happens when a prospect replies?**
The agent reads the inbox via the events API, matches the reply thread to the outreach row by message-id, and updates `reply_status`. Replies that need a human decision (negotiation, custom requests) get flagged for the reviewer. According to a [Backlinko analysis of 12 million outreach emails](https://backlinko.com/email-outreach-study), only 8.5 percent of cold pitches get a reply, so the reply column is sparse by design.

**What outreach methodology does the agent follow?**
The drafting prompt encodes a personalized, prospect-first pattern: reference a specific piece the prospect published, name the mutual benefit, keep pitches under 200 words. This mirrors the structure documented in [Backlinko's link building guide](https://backlinko.com/link-building), which prioritizes 100-150 highly personalized pitches over bulk sends.
