SEO Portal

SEO Portal is the organization’s backlink workspace: a shared domain inventory, SEO clients, monthly (or campaign) worksheets of posted links, opportunities, assigned posting tasks, and Google index checks. It is a tenant plugin — enable it once per organization, then assign permissions so each team only sees the screens they need.

How the pieces fit together

  1. Enable the plugin and save Moz / DataForSEO credentials in Settings.
  2. Build or import a global inventory of domains (manually, Excel, Fetcher, or Search Console).
  3. Create clients and worksheets. Reviewers allow which inventory domains that sheet may use.
  4. Link builders post URLs on the worksheet (themselves or via a Project Management backlink task).
  5. Someone with an index-check permission runs Check Indexing on selected rows.
  6. Managers watch output on Reporting and client Analytics.

Who may do each step is controlled on Roles. Checking the parent SEO Portal box ticks every child — uncheck what that team should not have. Every permission label and Spatie name is listed on SEO Portal Permissions.

Enable the plugin

  1. Go to SEO Portal → Settings.
  2. Click Enable SEO Portal. Tables, lookups, and permissions are created for this organization only.
  3. Save API credentials and map team roles (below).
  4. Give each role the SEO Portal children it needs.

New permissions appear after you re-enable the plugin or run the SEO Portal permission seeder for that tenant. Sidebar items stay hidden until the matching permission is granted.

Settings

SEO Portal → Settings needs Manage SEO Portal Settings. Do not give this to posting teams.

Moz API

Optional. Used to refresh Domain Authority, Spam Score, and referring root domains on inventory domains. Generate a token at moz.com/products/api — Moz Pro does not include API access. Paste the token and Test & save. The page shows a masked token, remaining rows, and when quota was last checked. One domain refresh uses one Moz API row. Disconnect removes the saved token.

DataForSEO

Used by Backlink Fetcher and worksheet Check Indexing. Paste the API login and API password from app.dataforseo.com/api-access — not the password you use to open the DataForSEO dashboard. You can paste the dashboard’s Base64 token into the login field. An active DataForSEO MCP server is used only when these fields are empty. Test & save or disconnect like Moz.

Worksheet flashcard mode

When enabled, allowing domains on a worksheet shows one domain card at a time instead of the full list. Reviewers can allow, reject, or mark Multiple before the timer advances. Default timer is 15 seconds (range 5–120). If nobody acts, the next domain appears.

Team role mapping

Tenant roles can be named anything. Map each of these SEO Portal roles to one of your existing roles:

  • SEO Manager — top tier. Can open Reporting (with Admins).
  • SEO Team Lead — middle tier on Reporting.
  • Link Builder — posting tier on Reporting.

Hierarchy is Manager, then Team Lead, then Link Builder. People tables on Reporting sort by that rank.

Menu

After the plugin is enabled, SEO Portal in the sidebar can show: Dashboard, Reporting, Backlinks, Backlink Fetcher, Worksheet, Import, Clients, Niches, Categories, Settings. Each item appears only if that person has the matching permission (Reporting also requires Admin or mapped SEO Manager).

Dashboard

SEO Portal → Dashboard needs the parent module permission or View Dashboard. It shows counts, recent activity, and shortcuts. It does not by itself allow editing inventory or worksheets.

Quick actions (when permitted):

  • Add Domain — create a global inventory domain (URL, link type, DA, spam, TLD, remarks).
  • Add Client — name, email, project, description, niche (creating a new niche also needs Manage Niches).
  • Add Niche — name and description.

Reporting

SEO Portal → Reporting is titled “SEO Manager reporting.” Only Admins and the mapped SEO Manager can open it. Choose a period: 7 days, 30 days, 90 days, or All time.

Summary cards: Posted, Unable to post, Time on tasks, Allowed domains, Worksheets created, Incomplete sheets.

Who is working lists each person with their mapped role, posted / unable / in-progress counts, time on backlink tasks, allowed domains they approved, and worksheets they created.

The page also lists incomplete worksheets (not yet at their backlink limit) and worksheets grouped by creator. Opening a sheet from here needs List / Open Worksheet Editor.

Backlinks inventory

SEO Portal → Backlinks is the global domain list. You need List Backlinks plus at least one tab, or the tab set looks empty or locked.

Tabs

  • Active — domains in use.
  • Inactive — turned off, not assignable to posting tasks.
  • Under review — waiting for approval. Approving still needs Edit (single) or Bulk Approve.
  • Suggestions — field changes suggested by task workers. Accept or reject needs Review Suggestions.
  • Trash — soft-deleted domains. Restore needs Edit; permanent delete needs Delete; empty all needs Empty Trash.
  • All — every record on one list.

What you store on a domain

URL, link type (Guest Post, Profile, and other seeded types), Domain Authority, spam score, TLD, niches, tags, countries, categories, remarks, login credentials, and status (Active / Inactive / Under review). High priority can be set from client inventory. Check DNS and refresh Moz on a single domain use Edit Backlink Domain (or Edit Client Inventory on the client page).

Bulk actions

Select rows, then: bulk edit (link type, niches, tags, countries, status, remarks), trash or permanently delete, restore, DNS check, Moz refresh, or approve under-review. Prefer the specific bulk permissions instead of the Bulk Actions master shortcut if teams should not have every tool.

Backlink Fetcher

SEO Portal → Backlink Fetcher pulls referring domains from DataForSEO for a target URL and stores a snapshot. View Backlink Fetcher opens the page and filters. Fetching, moving, deleting a saved target, and seeing report cost are separate permissions. Admins see cost by default.

  1. Enter a target URL and fetch (needs Fetch Referring Domains). A queue worker must be running.
  2. Open a saved fetch from the list. Tabs: Referring domains, Moved, Overview, Countries, TLDs, Platforms, Link types.
  3. Filter by search, country, TLD, platform, spam score, and whether the domain is already in inventory. Sort and change rows per page.
  4. Select domains and Move them into global inventory (creates missing domains, updates existing ones). In the move modal you can set niche, link type, and type new category names. Creating a new niche or link type there also needs those manage permissions.
  5. Delete a saved target file when you no longer need that snapshot.

Import (Excel / CSV)

SEO Portal → Import loads domains into the global inventory (not posted worksheet rows). Upload .xlsx, .xls, or .csv (up to 50 MB). Map columns per sheet, enable the sheets you want, then run the import. Progress and skipped-row summaries appear when the batch finishes. A queue worker processes large files.

This is separate from Import Worksheet Entries (posted links on a sheet) and from Import Google Search Console Links (client page).

Clients

SEO Portal → Clients lists SEO clients. Search, filter by niche, “has worksheets”, and Active vs Trashed. Sort and change page size. Fields: name, email, project, description, niche.

  • Create / edit / delete need those client permissions. Creating a niche from the form also needs Manage Niches.
  • Opening a client needs View Client Dashboard (or equivalent tab access). Tabs on that page stay hidden until their tab permissions are assigned.

Client dashboard

Open a client from the list. Header actions (when permitted): back to Clients, Add Domain, New Worksheet, and Import Google Search Console Links.

Analytics / Overview

Cards: worksheets, posted links, unique domains, and blacklist count.

Worksheets

List this client’s sheets with link counts. Create, rename, set a backlink limit, delete, open the posted-links editor, or open Allowed domains. Creating / renaming / deleting still need those worksheet permissions.

Inventory

Domains this client has already used. Edit a domain, set high priority, and manage client-specific login credentials with Edit Client Inventory. Blacklist is a different permission and is not granted by edit. There is no “remove from client inventory” button; a domain leaves this list when its worksheet rows are deleted.

Opportunities

Unused inventory domains that may fit this client (not yet posted, not blacklisted). Filter and blacklist bad fits (single or bulk). The standalone SEO Portal → Opportunities page is the same idea with its own permission.

Blacklist

Domains this client must not use. Unblacklist one or many when permitted.

Activity

Log of posts, edits, imports, assignments, and blacklist events for this client.

Google Search Console import

On the client header, import a Search Console export. Map the domain column per sheet. The import can attach the client niche, create or update inventory domains, and optionally create a worksheet and add posted rows. Needs Import Google Search Console Links — not the Excel inventory import permission.

Worksheets and posted links

Open a sheet from the client page or SEO Portal → Worksheet (pick client, then sheet). You need List / Open Worksheet Editor to see entries.

Create and edit a sheet

Give it a title and optional backlink limit (how many posted links this sheet should reach). Rename or change the limit with Edit / Rename Worksheet. Delete Worksheet removes the sheet.

Posted rows

Each row is a posted URL: posted date, URL, link type, keywords / anchor, remarks, and index status. Create, edit, or delete a single row with the matching entry permissions. Edit also allows a single DNS check on that entry. Open a row to see activity (assigned, posted, unable, released, metrics updated) and time spent when it came from a task.

Filter by search, link type, index status, and posted-date range. Sort by posted date, URL, or keywords. Rows that were marked unable to post on a task are called out on the sheet.

Import posted links

On the worksheet, upload Excel/CSV of posted URLs. Map columns (URL, date, keywords, and similar headers are guessed). Needs Import Worksheet Entries.

Bulk delete

Select rows (or select all matching filters) and Bulk Delete. Needs Bulk Delete Entries (or the Worksheet Bulk master shortcut).

Google index check

Check whether posted URLs appear in Google using DataForSEO Standard SERP site: queries. DataForSEO bills per URL (each URL is its own SERP task). There is no cheaper “batch of 500” and no multi-sheet picker — send only the rows you selected on this sheet.

  1. Open one worksheet.
  2. Select rows, or select all matching the current filters (for example only Not indexed).
  3. Click Check Indexing on the selection bar.
  4. Confirm. Only rows your permission allows are queued. Already-queued rows are skipped.

Markers

  • — never checked (unchecked).
  • Checking… — queued. A queue worker must be running or the marker stays here.
  • Indexed — Google returned the URL.
  • Not indexed — not found, and it was never Indexed before.
  • Lost — was Indexed (or already Lost), then a later check did not find it. If it is found again, it becomes Indexed.

Who may send which rows

Unchecked rows are allowed for all three permissions. The Admin role is treated as “any status.”

  • Check Not Indexed Links — first pass: unchecked and Not indexed. Cannot send Indexed or Lost.
  • Check Not Indexed and Lost Links — re-check missing and Lost. Cannot send Indexed.
  • Check Any Index Status — QA / admin: Indexed, Not indexed, Lost, and unchecked.

Checks use DataForSEO Standard queue, normal priority — the cheapest option (about $0.0006 × 5 for a site: keyword = ~$0.003 per URL). Live and high-priority queues are not used. Admins can open SEO Portal → Reporting to see DataForSEO costing: totals, index-check vs fetcher breakdown, cost by person, and an activity log (who ran the call, what they sent, and the USD). That block is hidden from everyone else. Each tenant has one encrypted JSON file per month (dataforseo-costs-YYYY-MM.json). Switch months and filter by date on that panel.

Each selected URL is its own queue job and its own DataForSEO task. Rows finish independently — you do not wait for a batch of 50 to complete together. The worker may print several RUNNING / DONE lines about one minute apart for one URL; that is polling the same task until the SERP result is ready, not extra billed posts. DataForSEO codes: 20000 is a finished SERP (Indexed or not from the items); 40102 is finished with zero hits (Not indexed / Lost); 20100 / 40601 / 40602 stay Checking…; rate limits and 5xx keep polling; other 4xxxx (task not found, payment, invalid field, Google SE error) stop Checking so the row is not stuck. Restart the queue worker after deploys so retries collect instead of posting again.

Allowed domains

Each worksheet can limit which inventory domains posters (and tasks) may use. Open Allowed domains from the client worksheets table or the sheet. View Allowed Domains only opens the screen; Manage Allowed Domains can change the list.

Browse inventory with search, link type, niche, tag, category, TLD, country, DA, and source. Compare against other clients’ used domains. Sort (including priority). Select domains and allow, reject, or mark Multiple (the domain can be used more than once; you can set how many slots / cost it consumes).

List filter can show available domains versus already decided ones. If flashcard mode is on in Settings, reviewers see one card at a time with a timer instead of the full table.

Niches

SEO Portal → Niches — create, edit, or delete niche labels used on clients and domains. Needs Manage Niches. You can also create a niche from the Add Client form when you have this permission.

Categories

SEO Portal → Categories — create, edit, or delete category labels on inventory domains. Needs Manage Categories. Fetcher move can type a new category name without this screen; renaming or deleting still needs Manage Categories.

Link types

Link types (Guest Post, Profile, and similar) are a seeded lookup used when editing domains and posting. Manage Link Types is reserved — there is no separate Link Types screen yet. Assign it to admins. Creating a new type from the Fetcher move modal also needs this permission.

Opportunities (standalone page)

SEO Portal → Opportunities needs View Opportunities Page. It is the unused-domain finder outside a single client tab. Blacklisting still needs the client blacklist permissions. The client-page Opportunities tab is a different permission.

Backlink tasks

Posting work can be assigned as a Project Management task tied to a worksheet domain. Create Backlink Tasks assigns that work. Work Backlink Tasks opens the employee workspace for people who should work any assigned backlink task. An employee who already has a task can open it even without the Work permission so they can finish what was given to them.

Only Active inventory domains are eligible to assign. In the workspace the assignee can:

  • Post — URL, date, link type, keywords, remarks, optional DA / spam. This writes the worksheet row.
  • Unable to post — reason; can blacklist the domain for that client when permitted. The sheet shows unable-to-post assignments.
  • Credentials — view or update client-specific login for that domain.
  • Suggest field changes — DA, spam, link type, tags, niches, countries, credentials. Suggestions appear on the inventory Suggestions tab for review.

Time spent on the assignment is stored and rolls into Reporting and the worksheet row activity.

Background jobs

Keep php artisan queue:work (or your process manager) running. These wait on the queue:

  • Google index checks (and their 20-second polls until DataForSEO finishes)
  • Backlink Fetcher DataForSEO runs
  • Bulk or single Moz refreshes
  • Large Excel inventory imports
  • Bulk DNS checks

If index markers stay on Checking…, or a fetch/import never finishes, the worker is not processing jobs.

Permissions and team bundles

Full checkbox list, Spatie names, and suggested bundles (inventory editors, posters, index first-pass / lost / QA, client managers, task workers, and more) are on SEO Portal Permissions. Also see Roles & Permissions.

What is reserved or not on screen

  • Delete Client Inventory — reserved. Domains leave a client’s used list when worksheet rows are deleted.
  • Manage Link Types — reserved; no dedicated screen yet.
  • Old index-check permissions (minimum batch, recheck, bypass batch) are removed when the seeder runs. There is no multi-sheet index picker.