What it does: Connects Google Search Console and Analytics, reads what this site already gets shown for, and scores every search against what the site is for — people who would buy what you sell, or the readers your blog is written for. Then it writes the pages the good searches have nowhere to land (on a site that sells, with a section on what you sell and links to your own pages) and rewrites the titles of posts aiming at searches nobody types.
Antradus AI Publisher v2.13.1 · Last updated 2026-09-20
Why this is not a keyword tool
Every other SEO plugin answers "what should I write about" with search volume bought from a third party. This one answers it with your own impression data — the only source that knows what Google already thinks your site is about.
That is a smaller question than "what is popular", and a far more useful one. If Google is already putting you in front of people for a search, and you have no page for them to land on, that is a gap you can close this afternoon.
And the limit, stated plainly: Search Console can only show demand you already touch. It cannot show searches you never appear for at all. A brand-new site with no impressions gets no answers here, and this screen will tell you so rather than inventing some.
Setting it up
Google gives no API keys for Search Console or Analytics — both are OAuth-only. Rather than making you approve a third-party app, Antradus uses a service account: a Google identity that belongs to you, which you give read-only access to your own data. Nothing is shared with anyone.
1. Create the service account
- Open Google Cloud → IAM & Admin → Service Accounts.
- Pick a project (or make one), then Create service account. Any name will do.
- Open the account you just made → Keys → Add key → Create new key → JSON.
- A
.jsonfile downloads. That is the credential.
2. Paste it in
Antradus AI → Settings → Search Demand. Paste the whole file, from the opening { to the closing }.
Once saved, the screen shows the account’s email address — something like antradus@your-project.iam.gserviceaccount.com. That address is not secret. It is what you hand permission to next.
3. Give it permission to read
- Search Console → Settings → Users and permissions → Add user → paste that address. Restricted is enough.
- Google Analytics (optional) → Admin → Property access management → add it as a Viewer.
4. Switch on the APIs
In the same Cloud project, enable:
- Search Console API — required.
- Google Analytics Data API — only if you connected Analytics.
- Google Analytics Admin API — optional. It only fills the property dropdown; without it you type the property number by hand.
If you miss one, the screen tells you which and links straight to it.
Using it
Open Bulk Publishing → 🔎 Demand.
How the screen is laid out
Setting this up is a sequence, so the top of the tab is three numbered steps with one open at a time:
| 1 Connect Google | Which Search Console property, which Analytics property, how long a window | Chosen once |
| 2 What this site is for | Sell or blog, the description, and the pages to link to | Changed when the business does |
| 3 The work | The verdict, the charts, the brief, the scoring run and every list | Where you live day to day |
A finished step collapses to a single line saying what it was set to — antradusai.com · last 28 days · pulled 2 min ago, I sell something · 2 pages to link to — so a shut step is never a hidden one. Click any step to reopen it. The screen opens on the first step you have not finished, and moves itself to The work the moment a pull or a scoring run finishes.
🔄 Refresh data sits in its own bar under the steps, because it belongs to none of them and is wanted from all three.
Inside The work, the six result lists share one space behind tabs that each carry their own count — ✍️ Write these 12, 🔧 Fix these 5. A list with nothing in it gets no tab. That count is the point: it says where the work is without you scrolling to find out.
Tell it what the site is for
The first choice on the screen decides what every score means and what every article does:
| I sell something | I run a blog | |
|---|---|---|
| For | A product, a service or a subscription | Growing a readership |
| You describe | What you sell, and to whom | What the site covers, and who reads it |
| Each search is scored for | Whether that person would buy | Whether that person is the reader the site is written for |
| The model’s own suggestions are | Searches a buyer types before they know you exist | The next subjects to cover, beside what already works |
| A queued article | Has one section on what you sell, links to your own pages, and ends with your closing line | Sells nothing |
Then write one plain paragraph. Not a keyword list — a sentence a person would say. It saves itself the moment you click out of the box; there is no Save button to miss.
We turn podcast episodes into SEO articles for B2B publishers and podcast studios. Buyers are marketing leads and editors at companies that already publish.
A weekly blog about home coffee: gear reviews, brewing guides and beans. Readers are home brewers who already own a grinder and want better espresso.
This matters more than anything else on the screen. Most of what Search Console reports is irrelevant to what the site is for, and without this the tool would cheerfully recommend writing more of the wrong thing.
Scores are remembered separately for each choice, so switching never shows a buyer score under a reader heading — the searches just need scoring once for the other choice. A site that sold something before this choice existed keeps every score it already had.
If you sell something: the pages to send readers to
Under the description, pick the pages articles may link to — your pricing page, a product or service page, or the article that explains what you sell — with a few words on what is on each. Up to six.
Every article queued from this screen then gets:
- One section on what you sell, placed where the article has just raised the problem it solves. It may say only what your description says: no invented features, prices, plans, discounts or results, never "the best", and never a comparison with a named competitor.
- Up to three links to your chosen pages, each at most once, with anchor text that says what is on the page. Those are the only pages on your own site an article may link to. Any other link into your site that the AI writes is removed and its words kept — the AI was never shown any other address here, so it would be a guess, and a guessed address is a broken link in a published article. Links to other websites are left alone.
- A closing line in your words, pointing at the chosen page closest to what the article is about. Leave the closing line empty and the note beside that page is used instead.
The section is written by the AI. The link check and the closing line are done by the plugin after the AI has finished, so they cannot be skipped or invented.
With no pages chosen, articles still describe what you sell but link to none of your pages — and the screen says so beside both queue buttons.
Press Refresh, then Score
Refresh pulls five slices of data and scans your posts.
Scoring lives on step 3, directly above the Write these list — the list it changes. It names what it is about to read: 🎯 Score for buyer intent — 118 searches, with the real count. The line under it says the part that makes the answer worth anything — the model is shown each search on its own and is never shown how many impressions it has, so a popular search cannot talk it into calling itself relevant. It rates each 0–3:
| Score | Means |
|---|---|
| 3 | This person has the problem you solve and is looking for a solution. They would buy. |
| 2 | Right field, right kind of person, not buying yet. Worth a page. |
| 1 | Adjacent. Same subject, wrong audience or wrong stage. Traffic, not customers. |
| 0 | Unrelated to what you sell. |
On a blog the same four scores mean:
| Score | Means |
|---|---|
| 3 | Squarely what your readers come for. The person typing it is exactly the reader you described. |
| 2 | The right readers, on a subject beside your own. Worth a page. |
| 1 | Loosely related. Someone passing through who will not read a second article. |
| 0 | Off-topic for this site, whatever words it shares with it. |
When there is nothing left to score the button says so — All 118 searches are scored — and greys out, rather than sitting there as a verb with no object.
A score is remembered against the description you wrote, so changing a word in that box un-scores every search. Edit it and the screen tells you how many need scoring again; it does not leave you to notice.
The rejects stay visible behind a toggle under the write list, with the reason each was rejected. Read them. Seeing what the filter threw away is how you know whether to trust it — and on a site pulling traffic from the wrong audience, that list is the diagnosis.
The two charts
Folded away under 📈 The two pictures on step 3. Open them once and they stay open — on most sites they answer the question before you read a single row.
How much Google showed this site — impressions per day across the window, with clicks in their own panel underneath. Two panels rather than one chart with two scales: clicks are usually a hundredth of impressions, so on a shared axis they draw as a flat line along the floor.
Who those people are — the same impressions, split by the buyer score (on a blog, by reader fit). This is the chart worth staring at. A tall bar under Not a buyer — or Off-topic on a blog — means the traffic you have is not the traffic you want, and no amount of writing more of the same will change that. Not scored yet is drawn hollow and kept separate from zero on purpose: nobody has decided those are worthless.
The trend needs one extra pull, so it fills in after the next Refresh data.
What it makes of this
One button, below the paragraph describing what you sell. It reads everything on the screen — the searches, the scores, your existing page titles, any addresses that have gone missing — and answers in two parts.
First, two short paragraphs: what it saw, and what it makes of it. It is allowed to tell you the data has little to offer, and on a young site it usually should.
Then articles to write, in two lists that are deliberately kept apart:
| List | What it is | How far to trust it |
|---|---|---|
| Backed by your own data | Each row quotes a search Google really shows you for, with the measured impressions beside it, biggest first | The numbers are real. Every row is checked against the actual list in code before you see it — a proposal quoting a search you do not have is discarded, not corrected |
| The model’s own suggestions | Searches this site has never appeared for, reasoned from what you sell, in the order the model wrote them – there is no measured number to sort them by | Judgement, not measurement. Nothing here has a number behind it, and nothing can — Search Console only knows the demand you already touch |
Anything in either list can be ticked and queued, using the settings behind ⚙ Publishing options on the write tab — folded away, with a summary of what they are set to printed on the fold itself. A queued suggestion records no impressions in its provenance, because it has none.
Articles this screen already wrote
On a site that sells something, the 🔗 Add my links tab lists the articles queued from this screen, each showing how many links to your chosen pages it has and whether it ends with your closing line. Articles written before version 2.12.0 were never told what you sell, so they usually show none.
Tick them and press Add my page links to the ticked ones. For each article the AI picks words already in it that are about what one of your pages offers, and the plugin links them — the same engine internal linking uses, so a link only ever goes around existing words and never into a heading, a quotation or another link. Then the closing line is added. No sentence is rewritten. An article that says nothing close to what you sell may only get the closing line; to give it a section on what you sell, queue its search again.
↩ Undo this run puts every article back as it was — except one somebody has edited since the run, which is left alone rather than losing that edit. Use that post’s Revisions for it.
Only articles written from this screen appear here. A post you wrote by hand is never touched.
Searches served by pages that no longer exist
If Google still shows an address that is not a post here any more, it appears in its own list rather than silently becoming part of "no page aims at this".
The distinction matters because the two need opposite work. A search with no page never had one — write something. A search whose page you deleted had one and lost it — put it back, redirect it, or let the impressions fall away. Without this list, a delete-then-regenerate loop is very easy to walk into: the screen offers to write the exact articles you just removed.
The tabs
✍️ Write these
Searches you already get impressions for, where no page of yours aims at them. Tick the ones you want and press Queue — they become ordinary bulk articles, and the focus keyphrase of each finished post is set to the exact search it was written for.
Notes on the defaults:
- Live web search is off. Unlike the Trends tab, a commercial search does not postdate the AI’s training data, so paying for a web search would be spending money for nothing. Turn it on if the subject genuinely moves week to week.
- Articles go to drafts. A trending news piece is worth publishing raw; a page meant to sell something is not.
- On a site that sells something, each article also gets the section on what you sell, links to your chosen pages and your closing line — see If you sell something above.
🛠 Fix these
Posts that are indexed and being seen, but where one of two things is wrong:
- "Ranks well, earns few clicks" — it sits between positions 5 and 20 and gets far fewer clicks than that position normally earns. A better title genuinely moves this.
- "Its keyphrase has no searches behind it" — the page is getting impressions, but its title aims at something nobody types. This is the common one on sites whose posts are named after internal features.
A row marked ★ is the strongest kind of finding: the page is being seen, for a search its title never mentions — and that search is shown to you, already filled in as the new target.
What a fix changes, and what it never touches. Press Draft new titles and the AI proposes a new SEO title, description and focus keyphrase for each ticked post. Nothing is saved yet. Read them, untick any you dislike, then Apply.
Only the two lines Google shows are written — into Yoast or Rank Math, whichever you use. The article, its heading on the page, and its web address are never touched. And ↩ Undo this run puts every one of them back exactly as it was.
If the AI proposes a keyphrase your page does not actually get impressions for, it is refused, not quietly corrected — inventing a plausible-sounding phrase nobody searches is the exact fault this feature exists to fix.
📉 Losing ground
Pages earning materially fewer clicks than the period before, split by cause:
- Impressions fell too → you are losing positions. No new title fixes that; the article needs updating. No fix is offered here on purpose.
- Impressions held, clicks fell → the position survived and the click went elsewhere, usually to an AI Overview. A better title genuinely can win it back, so those rows join the Fix list.
Needs six months of history to compare against.
🚫 Not appearing at all
Posts that have never been shown in Google in the whole window. No fix is offered, deliberately — this is an indexing problem, not a title problem, and recommending a rewrite would be confidently wrong advice. Check Search Console → Pages for why they are excluded.
Numbers you should know
- Search Console runs 2–3 days behind. The newest day it can see is printed on the screen.
- Google hides rare searches. Searches too infrequent to name are dropped from the list entirely, so the per-search impressions never quite add up to the site total. The gap is shown rather than hidden.
- Comparing periods needs 180 days. With less, the decay card says so and names the date it becomes available.
- Analytics groups small pages into "(other)". Those are excluded from matching and counted separately.
When something is wrong
| What you see | What it means |
|---|---|
| "That key works — it just cannot see any property yet" | The commonest one. The key is fine; you have not added the service account in Search Console yet. Step 3 above. |
| "The Search Console API is switched off" | Step 4. The message links straight to the right page with your project already filled in. |
| "Your server’s clock is N minutes off" | Google refuses a request signed at the wrong time. Ask your host to enable time sync (NTP). Nothing is wrong with your key. |
| "Neither Yoast nor Rank Math is active" | Those are what store the title and description Google shows. Without one, a rewrite would change nothing anybody could see, so it is refused rather than pretended. |
| "Your database refused to store the data" | A large property in one write. Ask your host to raise MySQL’s max_allowed_packet, or pick a shorter window. |
| "This Search Console property is a different site" | The property you picked is not this WordPress install — commonly a local or staging copy pointed at the live property. Searches still arrive, but everything needing a page address (Fix these, Losing ground, the Currently ranking column) is reporting zero because every row belongs to another site. Pick the matching property, or open the screen on the site it belongs to. |
| "Choose at least one page to send readers to first" | You pressed Add my page links on a site that sells something with no pages chosen. Pick them under the description of what you sell. |
| "…had been edited since and were left alone" | Undo will not put back an article somebody changed after the run, because that would throw the change away. Open the post and use its Revisions. |
What this is not
Rank Math ships its own Analytics module that also connects Search Console, and if you use it you already have the numbers. This is not a better Search Console client and does not claim to be. Rank Math shows you the data. This queues the work.
Antradus also never touches what your SEO plugin owns — sitemaps, schema, canonicals, redirects, robots. It writes into the same meta fields you would have typed into by hand, and nothing else.