> ## Documentation Index
> Fetch the complete documentation index at: https://docs.visibility.so/llms.txt
> Use this file to discover all available pages before exploring further.

# Link building

> Run outreach campaigns as activity spreadsheets, import prospects from a file, and let the Backlink Building and SEO Outreach agents fill them in.

Every project has a **Link building** page for prospecting, outreach and backlinks. Open a project and click **Link building** in the sidebar; the header reads "Outreach, prospecting, and backlinks for" your project name.

The page has three sub-tabs:

| Sub-tab        | What it holds                                                                                            |
| -------------- | -------------------------------------------------------------------------------------------------------- |
| **Activities** | One spreadsheet per campaign: prospects, contacts, metrics and status. This is where agents write.       |
| **Tasks**      | This project's tasks whose category is **Link building**, newest first, with a **New link task** button. |
| **Database**   | The same tasks once they reach **Done** — a record of finished link work.                                |

<Note>
  **Database** means completed Link building tasks. Visibility does not keep an automatic list of acquired backlinks. For prospects to chase, look at the **Backlink gaps** tab in [Opportunities](/opportunities), which lists sites linking to your competitors but not to you.
</Note>

## Activities

An activity is one campaign — Guest Posting, Resource Pages, a niche push — kept as a small spreadsheet inside the project. It has a name, an optional owner, a set of columns you choose, and as many rows as you need.

The **Activities** gallery shows a card per activity with its name, its owner (or **Unassigned**), how many rows and columns it has, and a preview of the first few. The last tile is a dashed **+ New activity**. With nothing created yet you see "No activities yet — create one to track outreach (prospect URL, email, status, …)".

<Frame caption="An open activity: the toolbar, the starter columns with their AI badges, and the Add row footer.">
  <img src="https://mintcdn.com/doableteam-a944c448/-1GTvD6OGO5y12MA/images/link-building-activity.jpg?fit=max&auto=format&n=-1GTvD6OGO5y12MA&q=85&s=47ea73004ce96ebbc0e2676c3a51d6d9" alt="An activity spreadsheet with columns for prospect URL, title, contact name, domain, assignee and status" width="1568" height="782" data-path="images/link-building-activity.jpg" />
</Frame>

### Create an activity

<Steps>
  <Step title="Open the dialog">
    On **Link building → Activities**, click the dashed **+ New activity** tile (or the **New activity** button in the empty state).
  </Step>

  <Step title="Name the campaign">
    Type a **Name** — it is required. The placeholder suggests "e.g. Guest Posting, Resource Pages".
  </Step>

  <Step title="Choose who it belongs to">
    Optionally set **Assign to**: **Unassigned (everyone)**, a teammate, or an agent (listed as "Name (agent)").
  </Step>

  <Step title="Create it">
    Click **Create activity**. The sheet opens with seven starter columns: **Prospect URL**, **Meta Description**, **Title**, **Contact Name**, **Domain**, **Assignee** and **Status**.
  </Step>
</Steps>

Click a card to open its sheet. The address updates as you go, so a refresh or a shared link reopens the same activity. Click **← Activities** to go back.

### Rename, re-assign or delete an activity

Click the name in the toolbar, type, then press Enter or click away; a blank name is ignored and Escape reverts. Use the owner select beside it to change **Assign to** at any time.

To remove one, click the red **Delete activity**, type the activity's name exactly into the confirmation field, then click **Delete forever**. This deletes every row, including anything your agents filled in, and cannot be undone.

### Who sees which activity

| Assigned to               | Who can see it                                    | Which agent may fill it                                |
| ------------------------- | ------------------------------------------------- | ------------------------------------------------------ |
| **Unassigned (everyone)** | Everyone with access to the project               | Any agent working a Link building task on this project |
| A teammate                | That person, plus members with **Manage company** | No agent                                               |
| An agent                  | Everyone with access to the project               | Only that agent                                        |

Assigning an activity to an agent tells agents which sheet is theirs. It does not create a task or start a Run — the agent only touches the sheet while working a Link building task, so you still assign it work in the usual way. See [Tasks](/tasks).

## Columns and their AI purpose

Every column carries a one-line **AI purpose**: what belongs in that cell. The purpose is handed to whichever agent works a Link building task on this project, so editing purposes — not rewriting task descriptions — is how you steer what an agent puts where. Hover the **AI** badge in a header to read the current purpose.

### Add ready-made columns

<Steps>
  <Step title="Open the picker">
    In the open activity, click the **+** at the far right of the header row (**Add columns**).
  </Step>

  <Step title="Pick the columns you want">
    The dialog reads "Pick preset columns or add your own. Each column's purpose is given to the agent working this activity, so it knows what to fill in." Click a preset to add it; each shows its name and its purpose. Clicking one you already added removes it, along with its data.
  </Step>

  <Step title="Close the dialog">
    Changes save as you click.
  </Step>
</Steps>

The ready-made columns cover the whole workflow:

| Group           | Columns                                                                                                                               |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| The target      | **Domain**, **Prospect URL**, **Published URL**, **Link From**, **Link To**, **Available Domains**                                    |
| The placement   | **Title**, **Meta Description**, **Topic**, **Keywords**, **Anchor Text**, **Doc URL**, **Link Type**, **Cost**                       |
| Quality signals | **DA**, **Page Authority**, **Trust Flow**, **Spam**, **Traffic**, **US Traffic**, **Domain Traffic**, **Domain Age**, **IP Address** |
| Contacts        | **Contact Name**, **Prospect Email**, **Login Email**, **Login Password**                                                             |
| Workflow        | **Publishing Status**, **Indexing Status**, **Assignee**, **Status**, **Notes**, **Tags**                                             |

Several carry judgement calls in their purpose, which is what the agent reads too:

* **DA** — Domain Authority, 0 to 100; good is 30 or above, premium 50 or above.
* **Spam** — keep spam under 6% and toxicity under 45.
* **Traffic** — a high DA with no traffic points at a link farm.
* **IP Address** — the same address across several sites is a red flag.
* **Publishing Status** — Prospecting, Outreach Sent, Negotiating, Content Submitted, Published, Rejected.
* **Indexing Status** — Indexed, Not Indexed, De-indexed.
* **Link Type** — Guest Post, Niche Edit, Resource Page, Press Release, Sponsored, HARO, Outreach.

**Assignee** and **Status** are operational columns for your team rather than fields an agent fills. Assignee is a picker of teammates and agents; Status is free text.

<Warning>
  Do not type real credentials into the **Login Email** and **Login Password** columns. Cell values are plain text that anyone who can see the activity can read. For work behind a login, save the sign-in once under **Project settings → Sign-ins**, where you sign in yourself and the agent never sees the password. See [Projects](/projects).
</Warning>

### Add a column of your own

<Steps>
  <Step title="Scroll to the custom block">
    In the **Add columns** dialog, go to **Add a custom column**.
  </Step>

  <Step title="Name it">
    Type a column name, for example "Content Gap Score".
  </Step>

  <Step title="Say what the agent should put there">
    Fill **What should the agent put here?** — it is required, because it is what the agent reads to know what belongs in the column.
  </Step>

  <Step title="Add it">
    Click **Add column**. The button stays disabled until both fields have text.
  </Step>
</Steps>

### Rename, re-order or delete a column

* **Rename**: click the column name in the header, type, press Enter. Blank names are ignored.
* **Change its purpose**: hover the header, click the pencil (**Edit column + its AI purpose**), edit **AI purpose** and click **Save**. A custom column cannot be saved with an empty purpose.
* **Re-order**: drag a header onto another header's position.
* **Delete**: hover the header, click the **×**, then confirm with **Delete column and its data**. The value is removed from every row and cannot be restored.

## Rows

Click **+ Add row** at the bottom of the table, then click into a cell and type. The value saves when you press Enter or click elsewhere; Escape discards the edit. In the **Assignee** column, pick a teammate or an agent from the dropdown. Click the **×** at the end of a row to remove it — that happens immediately, with no confirmation.

Rows update live while an agent works. If an agent writes to the sheet while you are typing, your open cell keeps your draft and the rest of the table refreshes around it.

## Import prospects from a spreadsheet

Bring a prospect list in from a `.xlsx` or `.csv` file. Rows are always added to the end of the table: an import never replaces, merges or de-duplicates what is already there.

<Steps>
  <Step title="Match your headers to the table">
    The first row of your file must name the activity's columns. Capitalisation and extra spaces are forgiven and the order is free, but every column in the table needs a header — leave the cells blank where you have no value yet — and no header may be unknown or repeated. Only the first sheet of a workbook is read.
  </Step>

  <Step title="Open the dialog">
    In the activity, click **Import from Excel**. The dialog lists **Columns this table expects** as chips; copy those into your header row.
  </Step>

  <Step title="Choose the file">
    Click **Choose a spreadsheet** and pick it. Your file is checked in the browser straight away, and nothing is sent until it fits.
  </Step>

  <Step title="Import">
    When it fits you see a green "Ready to import N rows · M blank rows skipped. They'll be added to the end of the table." Click **Import N**.
  </Step>
</Steps>

<Frame caption="The import dialog listing the columns the table expects before you choose a file.">
  <img src="https://mintcdn.com/doableteam-a944c448/-1GTvD6OGO5y12MA/images/link-building-import.jpg?fit=max&auto=format&n=-1GTvD6OGO5y12MA&q=85&s=23abbb3d2244cad09a22e1e579d6fbf2" alt="The import rows dialog showing expected column chips and the choose a spreadsheet button" width="1568" height="782" data-path="images/link-building-import.jpg" />
</Frame>

If something is off, a red box titled **This file needs a change** (or "N things need changing") names every problem and shows what it found in your file. Fix the file, click **Clear** or pick another one, and try again.

| What you see                                                             | What to do                                                           |
| ------------------------------------------------------------------------ | -------------------------------------------------------------------- |
| "Missing column(s)" — the sheet needs a column for each one in the table | Add the named headers, leaving cells blank if you have no value yet. |
| "This column is not in the table" / "These columns are not in the table" | Rename the named headers to match the table, or remove them.         |
| "The same column appears more than once"                                 | Delete the duplicate header.                                         |
| "The first row has no headers."                                          | Put the column names in row 1.                                       |
| "That file has more than 2,000 rows. Split it and import in batches."    | Split the list; 2,000 rows is the most one file may carry.           |
| "The headers match, but there are no rows with any data in them."        | Add data below the header row.                                       |
| "That file could not be read as a spreadsheet."                          | Save it as `.xlsx` or `.csv` and try again.                          |

Completely blank rows are skipped and counted in the summary. Every value arrives as text, so numbers and dates keep the formatting they had in your file.

## Tasks and Database

The **Tasks** sub-tab lists this project's tasks with the category **Link building**, showing each task's ID, title, labels, priority and status. Click **New link task** to open the New task dialog with the category and project already set. Tasks created anywhere else appear here too, as long as they belong to this project and use that category. Once a task reaches **Done** it moves to the **Database** sub-tab.

The category matters for more than filtering: an agent is only shown the project's activities and column purposes while it works a task whose category is **Link building**.

## Agents that work on link building

Two presets do this work. Hire them from **Agents → Hire agent**; see [Agents](/agents) for the hiring flow and for the Approval that appears in your [Inbox](/inbox-and-approvals) when someone without the **Manage agents** permission requests a hire.

### Backlink Building Agent

"Analyze, strategize & build links." It needs at least one **Assigned project** at hire. Working a Link building task, it opens the project's activity, researches prospects, records them as new rows and fills the cells your columns ask for.

* It checks each domain's rating against **Minimum domain rating (0–100)** on the agent's **Config → Behavior settings** card, 40 by default, and skips anything below it. Ratings are fetched rather than guessed, an unrated domain is reported as unrated rather than 0, and a reported rating is credited as "Domain Rating by Ahrefs".
* Before logging a prospect it checks how the target page can be reached: a direct submission form, an editorial email pitch, a login wall, a captcha or a paid placement.
* It can hand a gated placement to an SEO Outreach Agent, but only if that agent is listed on its **Peers** card. Delegated work appears as a subtask under the parent task.
* Any disavow list it produces is handed to you as text to review. Visibility never applies it for you.

The task's run timeline shows the work as it happens, with steps such as "Checking domain authority", "Checking link-building access" and "Recording a prospect".

### SEO Outreach Agent

"Find contacts, email & follow up." This preset must be hired with an email account: **Gmail** (your address plus a 16-character app password, which needs 2-Step Verification on the Google account) or **SMTP** (host, port, username and password, with optional inbound IMAP details). Without one, the hire is refused with "This preset needs a configured email account at hire — add the mail details to the draft."

Given an outreach task — or a placement delegated by the Backlink Building Agent — it researches a real contact from the site's own contact, about or team pages, writes the email for that recipient and sends it from its own mailbox. There are no templates.

After the first email it starts a follow-up sequence. Set the cadence under **Config → Behavior settings → Follow-up intervals (hours, comma-separated)**; the default `72, 168, 336` follows up after 3 days, then 7, then 14. Each follow-up is written fresh when it falls due, and follow-ups only go out while the agent is active — pause the agent and they wait.

If a submission is blocked by a captcha, a login wall or a paid gate, the agent does not work around it. It reports what it tried, marks the subtask blocked, and hands it back to you.

### The Mail tab

Each agent's **Mail** tab lists the accounts it can send from and, below them, **Sent (N)** — every email it has sent with a **Sent** or **Failed** badge, the subject, the recipients and the time. Use **Test** on an account card to check sending and inbound access, the switch to disable an account without deleting it, and **Edit** to change details. Only members with **Manage agents** can change accounts; everyone else sees the tab read-only, and credentials are never shown again after they are saved.

<Note>
  Replies are detected only when the account has inbound (IMAP) details. With them, a reply stops the follow-up sequence and wakes the agent to answer. Without them the account card reads "No IMAP — replies won't be detected" and follow-ups run to the end of the plan. The Mail tab is a record of what was sent; it is not an inbox you read replies in.
</Note>

If a mail account's sign-in is refused, it disables itself, its running sequences stop and you are notified. Fix the credentials and switch it back on.

### Put an agent to work on an activity

<Steps>
  <Step title="Hire the agent">
    **Agents → Hire agent**, pick **Backlink Building Agent**, assign the project it may work on, and hire.
  </Step>

  <Step title="Tune its settings">
    On the agent's **Config** tab, set **Minimum domain rating** if 40 is not right for you, and add an SEO Outreach Agent to **Peers** if you want gated placements delegated.
  </Step>

  <Step title="Prepare the sheet">
    Create the activity and its columns first. Agents fill activities that already exist — they never create, rename or delete one, nor its columns.
  </Step>

  <Step title="Give it a task">
    Create a task on that project with the category **Link building**, assign it to the agent, and describe the campaign: the niche, the target pages and what you want placed.
  </Step>

  <Step title="Follow the work">
    Watch the run timeline on the task and the rows appearing in the activity. See [Agents](/agents) for reading a run.
  </Step>
</Steps>

## Turn the page or a sub-tab off

<Steps>
  <Step title="Open the project's features">
    Go to the project's **Settings** and open the **Features** tab.
  </Step>

  <Step title="Flip the switches">
    Under **Workflows**, the **Link building** switch controls the whole page. With it on, the indented **Activities**, **Tasks** and **Database** switches choose which sub-tabs appear.
  </Step>
</Steps>

New projects start with Link building and all three sub-tabs on. Changing a switch takes effect immediately and deletes nothing — every activity and row is still there when you turn it back on. You need the **Manage company** permission; other members see the switches read-only. See [Projects](/projects) and [Team management](/team-management).
