AI SEO content automation

A month of SEO articles, written in your voice.

Rankli learns how you write from your own pages, then plans a 30-day calendar you can edit before a word is written. It writes, checks every draft against twelve rules, and publishes to your CMS.

  • $1 once, not a subscription
  • 3 finished articles
  • 1 measurement round
  • No CMS is touched until you connect one
The Rankli overview screen for a demo project called Fieldstack: counters reading 27 planned, 3 drafts waiting to be read and 3 of 30 articles generated this month; then four pieces due next, each a card with a content-type chip, a headline and a Write button.The Rankli overview screen for a demo project called Fieldstack: counters reading 27 planned, 3 drafts waiting to be read and 3 of 30 articles generated this month; then four pieces due next, each a card with a content-type chip, a headline and a Write button.
SEO score95

12 checks · 11 passed · 1 advisory

emergency hvac callout costtransactionalVol KD
6mon
commercial
field service scheduling software
Vol KD
7tue
informational
how to cut technician drive time
Vol KD
Published to WordPress
Voice profile learned

A real screen of a staged demo projectfieldstack.example is a reserved example domain, not a customer; we have none to show. Volume and difficulty read “—” throughout because they are NULL until you connect a DataForSEO account, and the score in the corner is the scorecard’s own arithmetic, not a measurement of anyone’s article.

1,500–3,000words per article

MIN_WORDS / MAX_WORDS

2.5%keyword-density ceiling

MAX_KEYWORD_DENSITY

2–5internal links to your own pages

MIN/MAX_INTERNAL_LINKS

0.35relevance floor on every exchanged link

MIN_RELEVANCE

These are not usage statistics. They are constants in src/content/seo.ts and src/content/links.ts, enforced on every draft — the first three can fail an article outright. We have no customer counts because we have no customers yet.

The problem

Content automation is easy. Content automation you can leave alone is not.

Everything here is about what happens on the bad day.

What usually happens

  • “SEO-optimised” is asserted and never defined.
  • A missing search volume renders as 0, and the zero reorders the month.
  • The model invents a statistic and it publishes under your byline.
  • A retried publish leaves a duplicate and splits the ranking signal.
  • Nobody ever finds out whether it worked.

What happens here

  • Twelve named checks with numbers in them. Nine can fail a draft and stop it reaching your domain.
  • A missing measurement renders as “—”; ranking uses intent and relevance instead.
  • Sentences shaped like sourced facts fail the draft for review.
  • Publishing is idempotent: a retry updates the existing post.
  • Half your tracked questions are held out as a control, so the readout can say inconclusive when it must.
How it works

Five stages. You can stop it at any of them.

Each stage is a separate job, so a failure is retried on its own rather than redoing — and re-billing — everything before it. The monospace chips are the real job kinds.

What an article contains
The content calendar for September 2026: a seven-column month grid, each day a white card with a large day number, holding a tinted piece card with a content-type chip such as Pricing or Buyer's guide and a headline. Three pieces are marked Drafted; empty days read “Drag a piece here, or research keywords”. A footnote says volume and difficulty are not measured.The content calendar for September 2026: a seven-column month grid, each day a white card with a large day number, holding a tinted piece card with a content-type chip such as Pricing or Buyer's guide and a headline. Three pieces are marked Drafted; empty days read “Drag a piece here, or research keywords”. A footnote says volume and difficulty are not measured.

Plan: a month you can see before a word is written

Sequenced like an editor would — intents alternate, cluster-mates share a week. Drag a piece to another day or bin it before generation spends anything.

The article workbench: an editing assistant panel on the left with the instruction “Make the intro tighter”, its plan, and a report that two passages were tightened; on the right the article in Review mode, with the meta description, a 147 of 160 character counter, and a violet Rewritten block holding the proposed opening with Accept and Reject buttons.The article workbench: an editing assistant panel on the left with the instruction “Make the intro tighter”, its plan, and a report that two passages were tightened; on the right the article in Review mode, with the meta description, a 147 of 160 character counter, and a violet Rewritten block holding the proposed opening with Accept and Reject buttons.

Write: it proposes, you accept

Written in stages and run through twelve SEO checks, nine of which can hold a draft back. The assistant’s edits land as proposals in the text, never silently.

The publishing screen: four platform cards — WordPress marked Verified 2 Sept 2026 with its site URL, “Finished articles: arrive as drafts — your team publishes them”, zero published through it and two credential keys named as configured; Webflow, Shopify and Webhook marked Not connected, each with a Connect button.The publishing screen: four platform cards — WordPress marked Verified 2 Sept 2026 with its site URL, “Finished articles: arrive as drafts — your team publishes them”, zero published through it and two credential keys named as configured; Webflow, Shopify and Webhook marked Not connected, each with a Connect button.

Publish: to your CMS, once you say so

WordPress, Webflow, Shopify or a signed webhook, as a draft or live — your choice. Nothing reaches your site until a connection verifies.

analyze_site reads your site
Pages and sitemap become an editable voice profile. Needs a publicly reachable site — a login wall or a pure-JavaScript render gives it nothing to read.
research_keywords ranks what it can see
Intent, cluster and a reason for each keyword. Volume and difficulty only exist in a paid index: without a DataForSEO account they render as “—”, never as 0.
build_calendar plans 30 days
The first three pieces generate immediately so you see finished work in minutes; the rest are written on their day.
generate_article writes, then checks
Outline, sections, intro, FAQ, meta — then every hard rule. Regenerating writes a new version beside the old one, never over it.
publish_article posts once
Credentials are verified two ways on connect, and a retry after a timeout updates the existing post rather than duplicating it.
Where we behave differently

Three places we do not do what the category does.

Each one is a decision you would only notice on the day it mattered — a missing number, a silent overwrite, a publish that ran twice.

Straight answers
Keyword research

It will tell you it does not know.

Volume and difficulty are a paid index, not a fact of the web. Without a DataForSEO account they stay NULL and render as an em dash, because a fabricated volume silently reorders which thirty articles get written.

How research is ranked

no provider, no number — and it says so

Keyword research mid-conversation. Left, the Research chat: the assistant's summary ends “Tick the ones you want and press Schedule”, then a batch of keyword cards about dispatch scheduling, each showing Vol —, KD —, an intent chip and CPC —; three are ticked and a bar reads “3 selected” beside a Schedule button. Right, the keyword table grouped by topic cluster with Score bars and em dashes in the Vol, KD and CPC columns, under a line saying those are not measured — shown as “—”, never as 0.Keyword research mid-conversation. Left, the Research chat: the assistant's summary ends “Tick the ones you want and press Schedule”, then a batch of keyword cards about dispatch scheduling, each showing Vol —, KD —, an intent chip and CPC —; three are ticked and a bar reads “3 selected” beside a Schedule button. Right, the keyword table grouped by topic cluster with Score bars and em dashes in the Vol, KD and CPC columns, under a line saying those are not measured — shown as “—”, never as 0.
IntentVolume unknown

No SEO data provider configured. Every em dash is the product’s actual rendering. The batch is labelled Simulated because the capture environment has no model key either — the label is the product’s, not ours.

Drafts

It proposes. You dispose.

Every change is shown in place with accept and reject — never applied silently. Regeneration writes a new version beside the old one, so the draft you preferred survives.

The twelve checks

nothing lands in your article without a yes

A proposed change in the article editor: under the heading Content and a note reading “2 proposed changes”, a violet-bordered block labelled Rewritten holds the tightened opening paragraph with Accept and Reject buttons, a disclosure “Show the 76 words this replaces”, and the assistant's reason: cuts the opening from 76 words to 39, keeping the sentence that carries the target phrase. Beside it, the assistant panel reports two changes waiting and is labelled Simulated.A proposed change in the article editor: under the heading Content and a note reading “2 proposed changes”, a violet-bordered block labelled Rewritten holds the tightened opening paragraph with Accept and Reject buttons, a disclosure “Show the 76 words this replaces”, and the assistant's reason: cuts the opening from 76 words to 39, keeping the sentence that carries the target phrase. Beside it, the assistant panel reports two changes waiting and is labelled Simulated.
Accept or rejectVersion kept

The assistant’s own proposal, where it would land. Accept applies it; Reject leaves the draft byte-identical. What it replaces is one click away.

Publishing

It names the destination before anything moves.

Which site, which platform, and whether the post lands as a draft or goes live — stated before you confirm. And a job that timed out after the CMS created the post updates that post on retry, so a retry cannot split your ranking signal across two URLs.

Where it publishes

which site, which platform, draft or live

The publish confirmation under the article's toolbar: “This publishes The Real Cost of Field Service Software to your live website, fieldstack.example, over wordpress. It lands as a draft in your CMS, so nothing is public until you press publish there.” with Cancel and “Yes, publish to fieldstack.example” buttons.The publish confirmation under the article's toolbar: “This publishes The Real Cost of Field Service Software to your live website, fieldstack.example, over wordpress. It lands as a draft in your CMS, so nothing is public until you press publish there.” with Cancel and “Yes, publish to fieldstack.example” buttons.
Your CMSDraft or live

A staged connection to the demo’s own example domain. Nothing was published anywhere. A 4xx from the CMS is misconfiguration rather than a blip, so the job stops and says so instead of retrying bad credentials against your site.

What you actually get

“SEO-optimised” is not a specification. This is.

Twelve rules with numbers in them, split into the nine that can fail a draft and the three that only cost it points.

And then, did it work?
H1 · one, first, ≤60 chars
meta description
hero image + alt text
keyword in first 100 words
H2 · ≥2, one holds the keyword
2–5 internal links
H3 · no skipped levels
in-body image
H2 · FAQ
1,500–3,000 words

nine of these twelve stop a draft dead

12 checks · 9 of them hardhard = the draft is held
word-counthard1,500–3,000 words
keyword-densityhard2.5% of words
heading-hierarchyhard1 H1 · ≥2 H2 · no jumps
keyword-in-title / -opening / -h2hardtitle, first 100 words, one H2
internal-linkshard2–5 to your own pages

Downgraded to advisory when we know fewer than two URLs on your site — a rule that cannot be satisfied should not fail every article.

no-fabricated-specificshard0 unsourced claims

We cannot verify a claim, so we refuse to publish the shape of one: a percentage beside “according to”, a Name (2021) citation, an attributed quote.

banned-phraseshardyour list, case-insensitive
meta-description-lengthadvisory130–160 chars
title-lengthadvisory60 chars
readabilityadvisorygrade ≤ 12

Advisory on purpose: some brands legitimately write dense. An advisory costs 5 points; a hard failure costs 15 and stops the draft.

  • Images. A hero and one or two in-body, with alt text. Photographic images need an image provider (Replicate); without one you get a deterministic abstract SVG — drawn, and called drawn.
  • Your voice, at every stage. Voice instructions, tone examples and your banned list go into every call, not just the first — the final third is where voice drifts.
  • Simulated output is labelled simulated. With no model API key the pipeline still produces a coherent article, marked in-product as not model-generated.
Measurement

It can tell you whether AI engines started citing you.

Your buyers’ real purchase questions, asked many times across four engines and reported with a 95% interval. Half are held back as an untouched control, randomized before the first round.

Which plans measure
Difference-in-differences

What the readout actually subtracts.

this is the part nobody else in the category ships

Recommended in answers →baseline roundfollow-up rounda month of articles publishesattributable effecttreated Δ − control Δplatform drift — cancels
  • treated questions — the ones your content targets
  • control questions — held out, untouched
  • where the treated questions would have landed anyway
Why a before-and-after number is not proof

The same engine answers an identical question differently about one time in four, and platform changes move everyone at once — in August 2026 Reddit citations nearly vanished from ChatGPT. The control arm subtracts that.

No customers to quote yet, so here is what a logo wall cannot give you: 150 simulated worlds where the true effect is known exactly, scoring our readout against the category’s.

Where we fall short, stated plainly: our 95% intervals covered the truth 92.7% of the time, not 95%, and 7.3% of null worlds produced a false positive against a nominal 5%. The harness ships in the repo (npm run calibrate -- --reps 150), so that command is how you would catch us. Rounds are monthly, and a small effect needs the larger plans: at trial size nothing is detectable.
Over 150 simulated worldsDifference-in-differences (ours)Pre/post (the category standard)
Bias−0.03pp+0.72pp on a +2.3pp true effecta 31% overstatement of the real result
95% interval covers the truth92.7%mildly optimistic — see the note above90.7%
False positives when nothing was done7.3%moved ≥1.3pp half the timeand ≥2.7pp in the top decile — with no work done at all
Backlink exchange — opt-in, per site

A credit market for links, with the dangerous parts written into the code.

Host a relevant link and earn a credit; spend a credit and yours goes inside somebody else’s article. Every movement is a ledger row — a credit market with a mutable balance cannot resolve its first dispute.

Placement · hosted articlerelevance 0.61

Most crews lose an hour a day to bad sequencing, and a dispatch board that cannot see traffic is guessing. Teams running more than four vans usually pair it with a dedicated route planner before they hire another technician.

Published1 link in this article+1 credit to the host

An illustration, not a live placement. The link sits in a paragraph already about the subject — never appended as a “Further reading” block, which is the exact shape a reviewer looks for. No suitable paragraph, no placement.

Off by default
Opt-in per project, never account-wide.
Relevance floor 0.35
Refused outright below it, and the score is plain word overlap you can follow.
1 link per article
More than one reads as a paid-links page to any reviewer.
3 placements per week
Per hosting site, however much it publishes.
No direct reciprocity
A ↔ B is the clearest footprint a link network leaves, so it is refused.
Refused, then refunded
No relevant host inside 14 days and your credit comes back.
The part our competitors leave out: reciprocal link schemes are named in Google’s link spam guidance, and if one is detected the penalty lands on your domain, not ours. That is why the limits above are in code rather than a policy page. If you would rather not take the risk, leave it off — nothing else in the product depends on it.
Integrations

Four places it publishes. Not nine.

Each one is an adapter we wrote and verify before an article moves. A logo we have not written an adapter for is not an integration.

WordPress

REST API v2 with an application password. Images upload to your media library and the HTML is rewritten to your URLs — a post hotlinking our storage breaks the day we rotate buckets.

Webflow

Data API v2 CMS items, staged or live. Collections have no fixed blog schema, so the connection carries a field mapping, defaulted to Webflow’s blog template.

Shopify

Admin REST blog articles on a pinned API version (2025-07). Shopify re-hosts the hero image on its own CDN; body images stay at their original URLs.

Signed webhook

JSON POST with X-Rankli-Signature: v1=… over timestamp.body, Stripe-style. Return { id, url } and we key later updates on it.

And so much more

Nine decisions you would notice only when they were missing.

Credentials verified two ways

Authentication and permission to publish are different claims. We check both.

Credentials never reach a log

Every error passes a sanitiser first — a WordPress application password is effectively the whole site.

Internal links come from your sitemap

Up to 200 URLs, used to place links and to decide whether the link rule is satisfiable at all.

Every project is its own island

Profile, voice, keywords, calendar and CMS are per project. Nothing is shared between two clients.

A banned-phrase list you control

Case-insensitive across title, meta and body, and it is a hard rule.

Named steps, not spinners

“Checking 12 candidates against your existing keywords” — a spinner and a hang look identical.

Link credits are a ledger

Spending is guarded inside the UPDATE, so two concurrent requests cannot both spend the same credit.

Illustrations without an image provider

A deterministic abstract SVG from the title — no storage, no network, and it survives anywhere the markdown goes.

Costs accrue per stage

Outline, sections, intro, FAQ and meta each record their own cost, so a month is never a mystery line on a bill.

Pricing

Priced on articles, because that is what you are buying.

Every plan runs the whole pipeline and the measurement layer above it. What changes is how many articles a month, and how small an effect the measurement can resolve.

Full comparison
Trial
3 articles
$1 once
Starter
15 articles/mo
$89 /mo
Growth
30 articles/mo
$349 /mo
Scale
60 articles/mo
$899 /mo
Agency
90 articles/mo
$1,200 /mo

Agency covers 5 client sites, each a separate project. Full comparison on the pricing page.

Straight answers

What a careful buyer asks before signing up.

Will it publish to my live site without me looking?

Only if you set it up that way. Nothing publishes until you add a CMS connection and we verify the credentials, and each connection posts as a draft or straight to live — your choice.

Does it really sound like us?

It is derived from your own pages, and it will not be indistinguishable from your best writer. Read the first three before letting the month run — that is why the trial generates three.

Is the backlink exchange safe?

It carries real risk, and it is off until you switch it on for a specific site. The floors and ceilings are enforced in code, and a placement is refused rather than fudged. But nobody can promise a link scheme is penalty-proof.

How is this different from Outrank and the rest?

Our SEO rules are published with numbers, and some fail a draft rather than lower a score; and we can measure whether AI engines started citing you, against a held-out control. Where they are ahead: customers, case studies and a longer feature list. We are not going to invent any of those.

What is not shipped yet?

White-label branding on agency reports, and a public API — listed as not shipped rather than dressed up as roadmap features.

Who is this wrong for?

Anyone who wants a number that goes up every month regardless. The measurement returns inconclusive when the data cannot separate your effect from noise.

Let’s try

Point it at your site and read the first three.

$1 buys the analysis, the research, a 30-day plan and 3 finished articles in your own voice. If they do not sound like you, you have lost a dollar.

Start the $1 trial

One site, 3 articles, one measurement round.