Date: 2026-08-13. Brainstorm, nothing approved.
Every claim below is checked against the code. Where something is not
checked, I say so under "Not verified" rather than leave it implied.
| Fact | Source |
|---|---|
| 29 of 58 deactivations happen within 24 hours of install | plugin_installs.first_seen vs deactivated_reported_at |
| 17 of those 29 never started a trial | joined against site_trials |
| 18 of those 29 had no licence key | deactivation_metadata.license_key_present |
| 22 of those 29 already ran Rank Math, Yoast or AIOSEO | deactivation_metadata.active_plugins |
A fresh install renders as locked | dashboard.php maps no_trial_no_keys AND no_trial_has_keys to 'locked' |
| Generation throws without a key | ai-requests.php:412, "Anthropic API key is required" |
| Premium access is trial or paid only | saiap_has_premium_access(), trial.php:304 |
| Installs run 1 to 2 per day and deactivations match them | plugin_installs, 9 weeks |
The wall: a keyless user can do nothing. The free tier is real, but it needs
an API key from OpenAI, Anthropic or Google.
ai-settings.php:215 names console.anthropic.com and nothing else. The plugin
supports Gemini (saiap_gemini_api_key, ai-settings.php:47), and Google AI
Studio issues Gemini keys on a free tier.
Add the direct link, and say plainly which providers need a card and which do
not.
every country, and what the current rate limit is. Check before shipping.
Nothing audits content today. taxonomy/audit (api-taxonomy-admin.php:26)
audits taxonomies only. saiap_get_site_context() already collects each post
with title, content, permalink, taxonomy data and post status, which is enough
to compute thin posts, missing meta descriptions, orphan posts, duplicate titles
and stale posts, entirely in PHP.
be batched or run on a cron.
Same data as idea 2, different output. Show which existing posts should link to
which, by title and taxonomy overlap. Pure string work, no model.
editor-chat.php handles internal links, but that path ispremium editor chat. A free local suggester does not exist.
suggestions. It needs a trial run on a real site before we believe it.
A permanent free allowance with a hard cap.
active_installs has not moved off 40.agent is a separate model call plus image search. I have not measured it.
Measure before deciding N.
The one-post version of idea 4, spent once per domain rather than monthly.
saiap_first_post_created (trial.php:1045) already blocksduplicates, so the once-per-site guard exists.
Write meta descriptions and titles for posts that have none. Found by idea 2.
Very cheap per call compared with a full post.
saiap_apply_seo_meta() (api-insert-post.php:830) alreadywrites meta, so the write path exists.
22 of 29 quitters run those two. If it only writes AIOSEO, this idea misses
most of the audience.
If a keyless user's real objection is spend, default the free path to the
cheapest usable model and show the estimated cost per post before they generate.
(saiap_refresh_models_registry_event, simple-ai-auto-post.php:118 area).
not, we cannot show a cost estimate without adding one.
startTrial returns already_had_trial forever after (trialService.ts:122).
Start the 7-day clock at the first generated post instead of at the row, so an
abandoned install keeps its trial for later.
decides whether this is worth building. I can measure it.
startTrial(domain, email?) takes the email as optional
(trialService.ts:102), and trial.php:758 already falls back to
get_option('admin_email'). So the email field can be removed from the flow
without any backend change.
admin address the user did not consciously give us. That is a consent
question, not a technical one, and it needs Christian's answer.
Connect Search Console and show which existing posts are decaying, which sit at
position 11 to 20, and which get impressions with no clicks. No content
generated, so no model cost.
mcp-abilities.php, onboarding-wizard.php, ai-settings.php and dashboard.php, so plumbing
exists.
licence. If the OAuth flow runs through our backend and that is gated, this
costs the same as any other gated feature. Check the gate first.
Start a real keyword audit as soon as the plugin phones home. When the user
opens the plugin, the result is already waiting. The first dashboard is not a
trial CTA. It is "here is where your site ranks now, and here is what ClearPost
can move in 30 days".
It is the only one that gives a keyless user something no competitor gives them,
on day one, with their own data in it.
| Piece | Where |
|---|---|
| DataForSEO provider | src/services/seo/dataForSEOProvider.ts |
| What the site already ranks for | dataforseo_labs/google/ranked_keywords/live |
| What is winnable | dataforseo_labs/google/bulk_keyword_difficulty/live |
| Keyword research | src/services/seo/keywordResearchService.ts |
| Strategy and scoring | src/services/seo/seoStrategyService.ts, strategySessionService.ts |
| The install trigger | saiap_schedule_context_updates on wp_loaded schedules the daily cron with time(). updateSiteContext then calls trackInstallActivity(domain) before validation. |
ranked_keywords targets a domain. It needs no site content and no API key.
We already receive the domain at install, so the audit can run with nothing else.
Measured across all 251 install rows:
| Domain type | Count | Share |
|---|---|---|
| Real public domains | 225 | 90% |
Local, IP, .test, .local | 14 | 6% |
| Staging or auto-subdomain | 12 | 5% |
172.18.0.1:18090, findadoctor.test and wordpress.local get no DataForSEO
data. Detect those and show the local audit (idea 2) instead.
wp-cron only fires when somebody loads a page. On a new low-traffic site, the
first page load is usually the admin opening wp-admin. That is the same moment
they open the plugin.
So the audit will not be ready on first open. It will be ready on the
second. Two fixes:
wp-cron, and
Both are needed. Neither is hard.
ranked_keywords call per domain. At 1.5 installs/day thevolume is small, but I have not priced it. Measure before shipping.
traffic in 30 days" is a specific claim. To stand behind it we need ranked
positions, search volumes and a CTR curve, and we need to be willing to show
the working. The brand rule is data over slop. **A forecast we cannot defend
is exactly the slop we say we are against.** My recommendation: state the
addressable volume we can evidence ("these 14 keywords carry 2,400 searches a
month and you rank 11 to 30 for them today") rather than a traffic promise.
rankings.** A site with zero ranked keywords gets an empty audit, which is
worse than no audit. Needs a fallback.
agrees.** It is their domain and public data, but it spends our money on
someone who has agreed to nothing.
Idea 11 is the strongest and Christian proposed it. It is the only idea
that shows a keyless user their own data on day one, and the whole DataForSEO
pipeline already exists.
Ship idea 1 alongside it, because it is a copy change and it may remove the
wall entirely for anyone willing to take a free Gemini key.
Keep idea 2 as the fallback for the 11% of installs on local or staging
domains, where DataForSEO has nothing to return.
**Before any of the paid ideas (4, 5, 6), I must measure the true cost of one
post with images.** I have used $0.11 in earlier notes. That figure is text only
and I have never measured the image agent.