Documentation

Everything the plugin does, what it costs and how to control it. No account needed to read any of this.

Install

Unstale needs WordPress 7.0 or newer and PHP 8.1 or newer. WordPress 7.0 is the floor because the plugin runs on the AI Client that ships with it. Unstale works with Gutenberg and the Classic editor, on posts, pages and public custom post types.

  1. In your WordPress admin, go to Plugins → Add New, search for Unstale and install it. You can also download the zip from wordpress.org and upload it.
  2. Activate the plugin. A new Unstale menu appears with four screens: Review queue, Content health, Journal and Settings. See In the admin.
  3. Go to Settings → Connectors and connect an AI provider if you have not already. Unstale uses whatever you set up there and stores no key of its own. See API keys below.
  4. Open Unstale → Settings and pick a default model and a default refresh level. Balanced is the default and is available on the free plugin.
  5. Open any post list. The Unstale column shows the status of the last refresh and its age, coloured by how far it has drifted, with a one-click action to queue a new one.
  6. The job lands in the Review queue. Read the side-by-side diff, then approve or reject. Nothing is published before you approve.

Prefer the command line? Unstale ships a WP-CLI command and a REST namespace.

# Refresh one post at the Balanced level
wp unstale refresh 1234 --level=balanced

# Queue the whole archive
wp unstale refresh --all --level=balanced

The REST namespace is unstale/v1, with routes for jobs, run, approve and estimate. Every step runs through Action Scheduler with a budget under 90 seconds per API call, so a long article can never hit a PHP timeout: the job resumes where it stopped.

Install Pro

Unstale Pro is an add-on, not a separate plugin: it hooks into the free plugin and needs it installed and active first, in version 1.15.0 or newer. It is not distributed on wordpress.org, so you install it by uploading a zip once, and WordPress updates it on its own from then on.

  1. Get the zip. Your purchase email carries a direct download link valid for 30 days. Once it expires, go to unstale.ai/download and enter your license key to get a fresh one.
  2. In your WordPress admin, go to Plugins → Add New → Upload Plugin, pick the zip and install it.
  3. Activate it. A Licence entry appears under the Unstale menu.
  4. Open Unstale → Settings, paste your license key into the licence field and click Activate. The same field is available under Unstale → Licence, which also shows your plan and renewal date.
  5. Strong and Maximal appear in the level slider straight away, along with scheduled automation, bulk refresh from the Posts list and per-category rules.

Pro does not change how a refresh is billed. It uses the same provider you connected in Settings → Connectors, on your own account, so API keys and costs below apply to Pro exactly as they do to the free plugin.

Updates

Once the licence is active, Unstale Pro updates through the normal WordPress updates screen, like any plugin from the directory. Nothing to re-download. If the licence lapses or is refunded, updates stop; the version you have keeps working.

Moving Pro to another site

Plans are counted in sites: 1, 5 or unlimited. Activating uses one slot, and a plan that is full refuses a new site rather than silently deactivating an old one. To move a site off a plan, open Unstale → Licence on that site and click Deactivate this site, which frees the slot immediately. You can also switch plans at any time from the pricing page.

If the key is refused and the licence is neither refunded nor lapsed, write to support@unstale.ai from the address you paid with.

Compatibility

Unstale fits the stack you already run instead of asking you to change it. Everything below is detected at runtime, with no setting to switch on: if the plugin is active, Unstale uses it; if it is not, Unstale falls back to WordPress core.

Plugins and editors Unstale integrates with
Works with What Unstale does about it
Page builders
Elementor, Divi, SeedProd
The refresh reads the text out of the builder’s own data, rewrites only that text and writes it back where it came from, so your layout, styling, images and builder settings come back exactly as they were. Unstale never re-serialises the page: it replaces the text where it found it and leaves every other byte alone. On a SeedProd page using SeedProd Pro blocks, the new text lands in the builder and the live page waits for you to reopen it and save; the job log says so.
SEO plugins
Yoast SEO, Rank Math, All in One SEO, SEOPress
The rewritten meta title and description are written into that plugin’s own fields, and Unstale stops emitting its own JSON-LD while one of them is active, so a refreshed post never carries two Article schemas. With no SEO plugin installed, Unstale writes the metas and the structured data itself.
Cache plugins
WP Rocket, W3 Total Cache, LiteSpeed Cache, WP Super Cache, WP Fastest Cache, SG Optimizer
After publishing, the refreshed post is purged through that plugin’s own public purge API. The purge is always aimed at the post, never a full-site flush, so the rest of your cache stays warm. Anything outside this list, a CDN for instance, hooks onto the unstale_purged action.
Editors and content types
Gutenberg, Classic editor
Posts, pages and public custom post types. A job is scoped to what you can already edit, so a user only ever sees and refreshes content they have rights on.

A builder outside this list has no adapter. When Unstale recognises one, it warns you first and goes ahead only if you choose Refresh anyway, which rewrites the standard WordPress content rather than the page your visitors see. A builder it does not recognise at all gets no warning, and its page is refreshed the same way. Adding an adapter takes two filters, unstale_builder_detectors to recognise the page and unstale_pipeline_steps to swap in your own extract and publish steps.

In the admin

Unstale adds one menu with four screens, a column in your post lists and a block under the editor. Everything on this page is in the free plugin unless it says otherwise.

Review queue

Every refresh waits here with its side-by-side diff until you approve or reject it. When something is waiting, a notice says so from wherever you are in the admin: with one refresh pending it opens that diff directly, with several it opens the queue. So a refresh that finishes while you work on something else no longer waits unnoticed.

Content health

Your published content sorted by how long it has gone without an update, in three bands derived from the staleness threshold you set in Settings. Pick up to 50 posts, 20 to a page, and queue them.

Journal

Every refresh with its tokens, its searches and its real cost, filterable by post, with running totals for all time and for the current month. Export CSV gives you the same rows as plain numbers a spreadsheet can add up, and it carries whatever filter you are looking at.

Settings

Default model, default refresh level, staleness threshold and the publishing options. The level slider shows what each level costs per 1,000 words, and the figure follows both the slider and the model you pick, so you can compare the two decisions together. The levels reserved for Pro show their cost as well, so you can see what they would cost before deciding.

The Unstale column and the editor block

In any post list, the Unstale column carries the status of the last refresh and its age, coloured on the same bands as Content health, so one glance down the list shows what has drifted. Under the editor, the Unstale block starts a refresh, follows it step by step and then lists everything it changed.

Once a refresh is published, a Restore button puts the post back as it was before it: the text, the publish date the refresh moved, and the SEO title and description it wrote. Field by field, and only what the refresh itself changed, so anything you edited since stays yours. The confirmation screen names exactly what will go back before you commit to it.

API keys

Unstale is strictly bring-your-own-key on every plan, free and Pro: you need a key from at least one AI provider, and that provider bills you directly, on your own account, with no markup and no credit system in between.

What changed in WordPress 7.0 is where the key lives. Providers and their credentials are now managed by WordPress itself, in Settings → Connectors, so Unstale stores no key of its own: it hands its prompts to the WordPress AI Client, which routes them to the provider you connected there. The plugin never sees, proxies or logs your key, and neither your key nor your content ever reaches an Unstale server.

Unstale → Settings shows which provider WordPress reports as connected, and lets you pick the default model. Connect more than one provider and you can switch model per run. Upgrading from a version of Unstale that stored its own keys deletes them automatically.

Anthropic default

Create a key at console.anthropic.com, then connect it in Settings → Connectors. It stays with WordPress; Unstale only reads that the provider is ready. Model ID: claude-sonnet-5 (Claude Sonnet 5).

Default model. Writing quality close to Opus, follows SEO instructions literally, 1M token context and 128k output. Best choice when the rewrite quality matters more than the bill.

OpenAI

Create a key at platform.openai.com, then connect it in Settings → Connectors. It stays with WordPress; Unstale only reads that the provider is ready. Model ID: gpt-5.6-terra (GPT-5.6 Terra).

Balanced quality and price in the GPT-5.6 family, and generally available: the model you pick is the model that runs. It costs less per token than the GPT-5.5 it succeeds, and the catalogue keeps gpt-5.4 ($2.50 / $15 per MTok) as its declared fallback.

Google

Create a key at aistudio.google.com, then connect it in Settings → Connectors. It stays with WordPress; Unstale only reads that the provider is ready. Model ID: gemini-3.8-flash (Gemini 3.8 Flash).

Fastest of the three and now the cheapest by a wide margin, at less than half the Claude Sonnet 5 input rate. Multimodal, and the first 5,000 grounded searches each month are free. The default worth trying first on a large archive.

Model IDs and rates are not hardcoded in the plugin. Unstale fetches a remote catalogue at https://unstale.ai/api/v1/models.json once a day, keeps it cached for 48 hours and falls back to the bundled copy if the fetch fails. When a provider ships a new model or changes a price, your estimates follow without a plugin update.

Refresh levels

One slider, four presets. Every level fixes errors, fact-checks figures against live web results, adds internal links and republishes safely; the higher levels progressively take more editorial liberty with your copy.

Minimal and Balanced ship in the free plugin. Strong and Maximal require Unstale Pro.

What each refresh level does
Action Minimal Balanced Strong Maximal
Spelling and grammar fixes Yes Yes Yes Yes
Fact-check of figures, dates and prices (live web) Yes Yes Yes Yes
Internal linking (up to 15 links, one link per target page) Yes Yes Yes Yes
Em dashes removed Yes Yes Yes Yes
Date bump and SEO-safe republish Yes Yes Yes Yes
Original structure and tone Kept Kept Adapted to persona Rewritten
SEO and business optimisations, missing sections added Not included Yes Yes Yes
Meta title (50-60 chars) and description (145-160 chars) Not included Yes Yes Yes
Key takeaway boxes Not included Yes Yes Yes
JSON-LD (Article, plus FAQ or HowTo when relevant) Not included Yes Yes Yes
Key sentence per paragraph in bold, scannability pass Not included Yes Yes Yes
Tighter, more human copy written for the persona Not included Not included Yes Yes
Secondary queries all covered Not included Not included Yes Yes
TL;DR at the top Not included Not included Yes Yes
CTAs (in-text, visual, closing) to your products Not included Not included Yes Yes
Interactive quiz when relevant Not included Not included Yes Yes
Slide structure and first-person E-E-A-T signals Not included Not included Yes Foundation
Full rewrite from the best available sources Not included Not included Not included Yes

Internal linking is best-effort: Unstale never forces a link. If it finds no relevant target, the refresh still succeeds with fewer links, or none.

Before you pick a level for a post that still ranks, check what it is told to do with the outline: Minimal and Balanced are told to keep your heading structure, Strong to keep your sections in order while it may reword a heading, and only Maximal is told to rebuild the plan. The evidence on AI rewriting and rankings has its own page.

What happens during a refresh

  1. Analysis: main keyword, language, and the products or services the article mentions.
  2. Research: live web search for the top results, search intent, expected format, secondary queries, persona and gaps against competitors. Skipped at Minimal, which keeps only the fact-check search.
  3. Fact-check: figures, prices, dates and feature claims verified against official sources.
  4. Rewrite: per the level you picked, section by section on long articles.
  5. Enrichment: metas, JSON-LD, takeaway boxes, TL;DR, CTAs and quiz, depending on the level.
  6. Internal linking: up to 15 links to your own published content, varied anchors, one link per target page.
  7. Cleanup: em dashes removed, key sentences bolded, HTML and blocks normalised.
  8. Review: the job waits in the queue with a side-by-side diff. Approve or reject. Automatic publishing, which skips this step, is off by default and switched on in the settings.
  9. Publish: URL, slug and revision history preserved, optional date bump, targeted cache purge (the URL, the home page and the feeds, never a full flush), and a complete log of steps, tokens, costs, searches and links.

Costs

Two separate bills, and only one of them is ours. The Unstale licence is a flat annual fee with no rewrite quota. The AI usage is billed to you by your provider at their published rates.

Published provider rates, USD per million tokens
Model ID Provider Input / MTok Output / MTok Web search
claude-sonnet-5 Anthropic $2.00 $10.00 $10 / 1k
Standard rate. Anthropic made this price permanent on 2026-08-10, cancelling the $3.00 / $15.00 that was due on 1 September.
gpt-5.6-terra OpenAI $2.00 $12.00 $10 / 1k
Generally available; declared fallback is gpt-5.4 ($2.50 / $15.00)
gemini-3.8-flash Google $0.75 $3.75 $14 / 1k
First 5,000 grounded searches per month are free

Provider rates as published on 2026-08-22. The plugin always estimates from the live catalogue, not from this table.

How the estimate is calculated

Unstale shows the estimate before the run, per article and per batch:

estimated cost = estimated tokens (article length x level)
                 x model rate
               + estimated searches
                 x search rate

Article length and the level set the token estimate; the level also sets how many web searches the pipeline expects to run. Minimal searches least, Maximal most. Once the job finishes, the log records the tokens and the cost actually spent, so you can compare the estimate against reality on your own archive rather than trusting a number on a marketing page.

Two levers if a bill runs higher than you want: switch the model (Gemini 3.8 Flash bills input at less than half the Claude Sonnet 5 rate, and its first 5,000 grounded searches each month are free), or drop a level. Neither is a subscription change, because Unstale never meters rewrites.

For any length, level and number of posts, the cost calculator runs the same estimate.

FAQ

Do I need a paid plan to use AI rewrites?

No. The free plugin on wordpress.org performs real AI rewrites at the Minimal and Balanced levels using your own API key, on one post at a time or on a batch of up to 50 picked from its content health screen, 20 to a page. Unstale Pro adds the Strong and Maximal levels, scheduled automation, bulk refresh from the Posts list at any level with a 100-post batch, and per-category rules. See the pricing page.

Where is my API key stored?

In WordPress, not in Unstale. You still bring your own key, but since WordPress 7.0 providers and their credentials are managed by the core, in Settings > Connectors. Unstale hands its prompts to the WordPress AI Client, which routes them to the provider you connected there, so the plugin never sees, stores or transmits your key. If you used an older version of Unstale, the keys it had stored are deleted automatically when you update.

Who pays for the AI usage?

You do, directly to Anthropic, OpenAI or Google on your own account. Unstale charges a licence fee only, so there are no credits, no rewrite quota and no markup on tokens.

Will a refresh break my URLs or my rankings?

A refresh does not change the slug, and it skips the date bump when your permalinks use the core date tags. On default settings it waits for your approval with its diff. In the WordPress editor, block or classic, and on Divi, with revisions turned on, the version before it stays in the native revision history; Restore puts it back as long as the post content has not been edited since. No tool can promise rankings, and Unstale does not.

Can I see the cost before a refresh runs?

Yes. Unstale shows an estimate before a refresh you confirm from the editor, the posts list or Content health, per article and per batch, based on article length, the level you picked, the current rates for your model and the expected number of web searches. The job log then records the tokens and the actual cost.

What are the requirements?

WordPress 7.0 or newer and PHP 8.1 or newer. WordPress 7.0 is the floor because Unstale runs on the AI Client that ships with it. Unstale works with both Gutenberg and the Classic editor, on posts, pages and public custom post types.

The free plugin runs the full pipeline on your own key, up to the Balanced level. Install it, refresh one stale post and read the diff before deciding anything.