DigitalM Inside SEO Agency

Description

DigitalM Inside SEO Agency lets an SEO agency follow all its client websites from its own WordPress, without logging in to each client’s dashboard.

Each client installs the free DigitalM Inside SEO plugin and accepts your invitation. From then on, their SEO data comes to your site every night, and you work on it here. The client picker sits in the top bar, and every screen shows the selected client’s data.

Who it is for

  • SEO agencies and freelancers who look after several WordPress or WooCommerce websites.
  • In-house teams that run more than one website.

How the connection works

  1. You create an invitation for the client in Settings.
  2. The client installs the free DigitalM Inside SEO plugin and opens the invitation link. A page on their own site shows your agency’s name and exactly what you will see and be able to do.
  3. The client confirms, and you approve the connection. Their data starts downloading the same night.

The client can end the connection at any time. Every change you make on their site goes through a signed request and is written to a log on their site.

The same screens, for every client

  • Mirror – the most important facts about the client’s site on one screen: sales, traffic, errors, keywords and fix priorities.
  • Conversions and traffic – revenue, orders and visits by product, channel, device, country and city, against the previous period.
  • Rankings – impressions, clicks, CTR and positions for every keyword and page, winners and losers.
  • SEO audit – over 120 checks for indexing, titles and meta, links, images, structure, speed and structured data, each with an explanation and a fix.
  • GEO / AEO – whether AI assistants such as ChatGPT, Gemini and Perplexity can reach and quote the site.
  • Removed pages – addresses the client removed, with their Google clicks and impressions, ready to redirect or mark as gone.
  • System information – the client’s SEO plugin, cache plugin, PHP and WordPress versions.

Built for the agency’s daily work

  • All clients in one list – the state of each connection, the plugin version on the client’s site and when the data was last refreshed.
  • Nightly refresh, only what changed – one client and one request at a time, with a pause between requests, so client websites are not slowed down. You can also refresh a client by hand.
  • Your own website without a slot – with one button, the agency follows its own website too. It does not take a client slot.
  • Fixes with one approval – titles, descriptions, images and texts are prepared on your side and written to the client’s site only when you approve them, through a signed request.

Help and support

A built-in Guide answers “where do I do X” and takes you to the right screen. If something does not work, a form on the Guide screen sends us a short description together with the plugin, WordPress and PHP versions, only when you press the button. If you leave the email from your account with us and tick the consent box, the message becomes a support ticket, and you see our reply in your account.

More of our plugins

A quiet page in the menu lists our other free plugins from the WordPress.org directory, with a short description. Nothing is installed unless you press the Install button, which opens the standard WordPress installer.

Interface languages

The interface is available in Bulgarian and English. A BG/EN switch sits in the top right corner of every screen.

Free and paid

The plugin is free and every screen works without a licence. Client connections are managed by our service at seo.digitalmseo.com. The free service plan covers up to 3 client websites at a time. More client websites are available as a paid service plan from our own site. A separate Pro add-on, also offered from our own site, adds AI-prepared fixes and deeper analyses. This plugin works completely on its own without it.

Requirements

  • WordPress 6.2 or newer
  • PHP 8.1 or newer
  • The free DigitalM Inside SEO plugin on each client website

External Services

DigitalM Inside SEO Agency communicates with the following external services.

seo.digitalmseo.com (our service)

  • What: creates and checks client invitations, keeps track of connected clients and slots, and verifies that requests between your site and a client’s site are genuine.
  • When: when you create an invitation, approve or end a connection, refresh the list of clients, or enter a licence key.
  • What is sent: your site URL, plugin version, agency name, licence key if you enter one, a public verification key, and the client site URL you invite.
  • Summary numbers: for the clients list, our service may ask connected client sites for a few summary numbers they have already calculated and keep them for up to 15 minutes.
  • Privacy Policy: https://seo.digitalmseo.com/en/privacy-policy/
  • Terms of Use: https://seo.digitalmseo.com/en/terms/

Your clients’ websites

  • What: the free DigitalM Inside SEO plugin on each connected client site.
  • When: only after the client has confirmed your invitation and you have approved it; data is downloaded at night or when you refresh by hand, and change requests are sent when you approve a fix.
  • What is sent: signed requests for the client’s SEO data (findings, Google Search Console and GA4 history, rankings, the change log and daily visit figures) and signed change requests that you approve.

seo.digitalmseo.com – problem report form (optional)

  • What: the “Something not working?” form on the Guide screen.
  • When: only when you press the send button.
  • What is sent: your message, the plugin, WordPress and PHP versions, the active SEO plugin, your site URL, and your email only if you tick the consent box.

Google PageSpeed Insights API (optional)

  • What: the PageSpeed Insights API.
  • When: only when you run a speed test.
  • What is sent: the public URL of the page being tested.
  • Policy: https://policies.google.com/privacy

IndexNow (optional, off by default)

  • What: api.indexnow.org, shared by Bing, Yandex and other search engines.
  • When: only after you turn it on, each time a page on your own site is published or updated.
  • What is sent: the public URL of the changed page and a key file address on your site.
  • Policy: https://www.indexnow.org/terms

WordPress.org plugin directory

  • What: the “More of our plugins” page reads the list of our plugins from the WordPress.org directory through the standard WordPress function.
  • When: when you open that page; the list is kept for 12 hours.
  • What is sent: the author name used for the search; nothing about your site.

Credits

Built by Digital M SEO Ltd (digitalmseo.com).

Installation

  1. Upload the plugin folder to /wp-content/plugins/, or install it directly from the WordPress admin.
  2. Activate the plugin through the Plugins menu in WordPress.
  3. Open Inside SEO Agency Settings and enter your agency name.
  4. Create an invitation for your first client and send them the link.

FAQ

Do I need access to my clients’ dashboards?

No. The client installs the free DigitalM Inside SEO plugin and confirms your invitation. You never need their password.

What does the client see?

Before confirming, the client sees your agency’s name and the list of data you will receive. After that, every change you make is written to a log on their site, and they can end the connection at any time.

Will it slow down my clients’ websites?

No. Data is downloaded at night, only what changed, one client and one request at a time, with a pause between requests.

Where is the client data stored?

On your own WordPress site, in the plugin’s tables. Our service checks invitations and slots. For the clients list it may keep a few summary numbers for up to 15 minutes, so client sites are not asked on every page load. It does not keep the client’s SEO data.

Can I use it with the client plugin on the same site?

Yes. The agency plugin and the free DigitalM Inside SEO plugin can run on the same site. Use “Your site” in Settings to follow your own website without taking a slot.

How do I report a problem?

Use the form at the bottom of the Guide screen. It is sent only when you press the button. Leave the email from your account with us to get the reply as a support ticket.

Reviews

There are no reviews for this plugin.

Contributors & Developers

“DigitalM Inside SEO Agency” is open source software. The following people have contributed to this plugin.

Contributors

Changelog

1.35.121

  • Own AI account: one failed request (time-out, a refused prompt) no longer marks the account as unavailable for 10 minutes. Only “no model found” does. The last error is kept so it can be shown.

1.35.120

  • Near-duplicates: the finding is called “Series of near-duplicate products” and counts series. The make-unique list shows products and series.

1.35.119

  • Own AI account: requests can carry images (image analysis) and ask for web search (fact checks), through the AI connection in WordPress (Settings Connectors).

1.35.118

  • Ads: a budget or export saved at the agency is no longer lost. If the client does not answer, the record waits and is sent again with the next check of the link; the next pull does not overwrite it. The uploaded export file stays linked. The screen says when the client did not answer.

1.35.117

  • System info: how much data comes from Google per day at each client, and on how many days the limit was reached (needs DigitalM Inside SEO 0.294.91 at the client).

1.35.116

  • Agency link: every write, queue and command request to the client is signed with the agency key. One-time number and 5-minute window – a copied request does not work twice.
  • Make unique: the list shows analyses and proposals kept at the agency. New filter by state.
  • Background work keeps its client: GEO steps, Asset Lab steps, the night queue and speed measurements run for the client they were started for, not for the last chosen one.

1.35.115

  • Client queue: the counts on the screen refresh right after work is done. Before they could stay old for up to 15 minutes.

1.35.114

  • Client queue: “Run” now works in the background, like at the client. It also runs series analysis (it showed 0 of 0 before) and writes each product with its series.
  • Client queue: client and agency are in sync. When the client presses “Run”, the agency takes the tasks at its next check (about 30 minutes). The night run follows the client’s checkbox – one checkbox, at the client.
  • Client queue: when the AI provider is out of credits or the limit is reached, the run stops and the tasks go back to waiting. The last run and its reason are shown above the queue.
  • Series analysis from the agency screen is reported to the client, so the rewrite can be added to the queue.

1.35.113

  • Make unique list: the column now shows how many products the series has (with the product itself), not how many others are similar.

1.35.112

  • Actions on the client site: when the client refuses an action, the agency screen now shows the client’s own reason (for example that the text was changed after the check) instead of a bare “refused”.

1.35.111

  • Change log: paging with First, Back, a page number box, Next and Last. Paging and filters now keep working past the first page.
  • Change log: new filter “Effect in Google” – improved, worse, no difference, waiting (under 30 days), no Google data.
  • Change log: shows its size. Rows older than 24 months are removed for each client during the daily pull.

1.35.110

  • Each user of the agency site now keeps their own selected client. Two people no longer switch the client for each other. Background work still uses the last selected client.
  • Uninstall also removes the agency signing keys, the agency notes on posts, the ads folder and each user’s selected client.

1.35.109

  • The check for an AI model no longer sends a paid request. It only asks WordPress whether a text model is set up. If a real request fails, the plugin remembers this for 10 minutes.
  • Questions on the audit screen are shown in the page with clear buttons, instead of the browser’s OK / Cancel window.
  • The text-check screen shows each note on separate lines: the mistake, the sentence it is in, the kind and the reason, then the fix.
  • The script data for the in-page questions has its own name (SEOHA_ASK_L10N), so it does not clash with the free plugin.
  • The text-check screen loads the notes already found on the client site right away.
  • Audit: “Only one internal link” and “Broken internal links” moved to “Slowing down ranking”.
  • Index check: images, documents and theme or page-builder templates (for example Flatsome blocks under /blocks/) are no longer shown as pages.
  • The agency’s public key is sent to the hub again (wrong class name), so the hub can pass it to approved clients.

1.35.108

  • Speed test (PageSpeed): works without Action Scheduler, through WP-Cron.
  • Screen scripts are passed straight to wp_add_inline_script(), with every value escaped in that call (esc_js() or wp_json_encode()). The helpers that took a ready-made string are removed.
  • The print styles and the client status table styles moved into admin/css/seoh-admin.css.
  • Removed the Author URI header. The Plugin URI stays.

1.35.107

  • Table updates now go through dbDelta on each version change, for every client. No more manual ALTER TABLE, and no old-table cleanups.
  • Uninstall deletes options through delete_option(), so the WordPress cache is cleared too.
  • Every prepared query now passes its values one by one, so the number of placeholders can be checked.
  • Queue items are saved one by one instead of one large multi-row query.
  • The plugin no longer defines WordPress core file-permission constants; file writes give the permissions themselves.

1.35.106

  • Removed code that no longer has any user: the multi-language helper for the agency’s own site and an unused hook for sending changes.

1.35.105

  • New read-only helpers over the client data that was already pulled (one image, image search, page rows, titles by type, duplicate meta), for the paid add-on.
  • Removed the old box that resent the agency’s own sales to the hub. The agency does not send its own data.
  • Missing English translations added.

1.35.104

  • Removed the old code that read or changed the agency’s own site. Every screen and action now reads from and sends to the selected client. The agency’s own site is followed as a client through the free plugin.
  • FAQ blocks, saved schema, image texts, image renames and the menu tree now go to the client site.
  • Uninstall no longer touches data that belongs to the free plugin on the same site.
  • Faster cache clearing for client views (works with persistent object caches).

1.35.103

  • Faster screens: reads from the plugin’s own tables go through the WordPress object cache. Any write to these tables clears it at once, so the screens always show the current data.

1.35.102

  • Removed the unused background audit runner and the helpers only it used. The audit runs on the client’s site.

1.35.101

  • File rules: the “keep only on chosen pages” list now shows the client’s own pages and finds where each form is used on the client’s site. It was not shown before.
  • Removed an unused /llms.txt output and own-site page lookups (the client’s site serves its own llms.txt).

1.35.100

  • File-rule preview links for a client carry the client’s own public nonce, so they keep working with the free plugin 0.294.72 or newer.

1.35.99

  • Clean-up: removed the old copies of the screen actions that now always run on the client’s site, the front-end test load and the slowdown tool (the agency does not measure its own site), and several unused classes. About 12,700 lines less; screens work as before.

1.35.98

  • What you set for a client is saved on the client’s site: the file rules in Speed (and their preview links use the client’s own key), the llms.txt selection, and the ads figures. Needs the free plugin 0.294.71 or newer on the client site.
  • Suggested questions and schema: the agency’s AI writes the suggestion from the client’s page, and it waits for approval on the client’s site.
  • “Search Console reasons” in Errors are shown again, from the client’s data.

1.35.97

  • A client is always selected while the agency has clients: with none chosen yet, or after the chosen one is removed, the first client in the list is picked — the same one the menu shows.
  • The agency no longer measures or changes its own website: the monthly speed check and its email, the admin load timing, the file rules and the test load on the front end are off. The agency’s own website is followed as a client, with the free plugin.
  • Addresses on the screens (content, structure, links, PageSpeed suggestions, page inspector) are built from the selected client’s site.
  • The “Check in Search Console” and “Rewrite breakdowns back” buttons are back; they run on the client.

1.35.96

  • Removed the agency’s own Google connection. Search Console and Analytics figures always come from the selected client’s site, where Google is connected. The agency’s own website is followed as a client, with the free plugin.
  • Removed the unused set-up wizard and the key check address that only the Google connection needed.
  • A short address in the page report now opens on the selected client’s site.

1.35.95

  • Fixed a fatal error when another plugin reads the time zone or builds an admin address while plugins are still loading.

1.35.94

  • No output buffering anywhere: ob_start() is gone. Screen parts are built as strings and returned.
  • Every screen address that carries a choice (month, page, sort, search, tab) now carries a nonce for the logged-in user, checked with wp_verify_nonce() before any of it is read. Without a valid nonce the screen opens with its defaults.
  • Front-end requests for the speed probe and the asset rules preview carry a nonce checked with wp_verify_nonce(), in addition to the short-lived secret key.
  • The Google connection return is posted as a nonce-protected form to admin-post.php, with a capability check.
  • No change in behaviour.

1.35.93

  • All file operations go through WP_Filesystem (moving, deleting folders, write checks, writing and reading files) or wp_delete_file(). The ads CSV is read through WP_Filesystem and parsed in PHP.
  • The HTTP/2 check no longer touches cURL: it reads the protocol agreed during the TLS handshake (ALPN), with the WordPress HTTP API response as fallback.
  • Removed every phpcs:ignore / phpcs:disable comment from the code.
  • No change in behaviour.

1.35.92

  • Review follow-up: every table and column name in SQL now goes through the %i placeholder, including names returned by a method and schema queries (SHOW COLUMNS, ALTER, DROP, TRUNCATE, CREATE). IN lists and bulk inserts use placeholders built with array_fill(); filters are fixed SQL with placeholders instead of strings assembled in PHP.
  • Request input is sanitised where it is read with WordPress functions (sanitize_text_field, sanitize_textarea_field, esc_url_raw, map_deep, absint). Data from json_decode() is cleaned value by value.
  • The standalone consent page loads its CSS from a file through wp_register_style() / wp_print_styles() instead of a style tag.
  • Every output buffer is closed in a finally block in the same function, so nothing can skip the close.
  • No change in behaviour.

1.35.91

  • Review follow-up: added a nonce to the client picker; the HTTP protocol check now uses the WordPress HTTP API instead of a direct call; passed all the plugin’s own table names through prepared queries (the %i placeholder). No change in behaviour.

1.35.89

  • New: a “Status by client” table in Settings. For every client it shows four checks — structure, crawl, speed and console/analytics — each with a word (current/stale) in the right gender and the client’s own last-run date. A per-check refresh arrow starts the check on the client (crawl/structure as a command, both speed tests like the Speed tab) and the cell shows “refreshing” until the client’s timestamp moves, then downloads only what changed; the wait continues in a 5-minute background task. Name search, pagination of 25, a “Refresh all stale” button and a per-client download arrow. The clients list is merged into this table.
  • Fixes: freshness dates now come from the client’s handshake (so speed no longer shows a stale date); the print layout of the overview report no longer overlaps on a narrow page; removed an unused minified script; speed reads past days from the downloaded data and asks live only for today.

1.35.73

  • Review follow-up: the wp-config helper no longer keeps a copy of wp-config.php on disk and uses WP_Filesystem; moved “Tested up to” to the readme only; sanitised a few request keys and the request URI; moved all inline admin scripts and styles to wp_add_inline_script / wp_add_inline_style. No change in behaviour.

1.35.71

  • Code quality: cleared all Plugin Check findings — removed a few no-op translation wrappers, used a literal text domain in the menu, passed a LIKE pattern through a parameter, annotated the internal database queries in the data layers, and noted that the agency REST endpoints verify a signed key inside their guard. No change in behaviour.

1.35.69

  • New: “Your site” – follow the agency’s own website with one button, without taking a client slot.
  • New: a “More of our plugins” page that lists our other free plugins from WordPress.org; nothing is installed without your click.
  • New: “Something not working?” form on the Guide screen, sent only on click; with your account email and consent it becomes a support ticket.
  • Fixed: connecting Google for the agency’s own website when the client plugin is on the same site.
  • Improved: clearer texts, full English interface, and all browser pop-up dialogs replaced with on-page messages.