SWG Ultimate SEO Tool
Run every client's SEO from one WordPress dashboard. Search Console, GA4, and Google Ads together, AI that builds campaigns instead of just suggesting them, and branded PDF reports that make the retainer feel obvious.
Overview
- 6-step client onboarding wizard capturing services, service areas, goals, target keywords and competitors per client
- Per-client Google OAuth (analytics.readonly + webmasters.readonly + adwords) with the token stored on the client row, plus property/site/account pickers
- Page evaluation engine: crawler extracting SEO signals through 16 builder-aware content selectors, then per-step OpenAI calls for an 11-section audit, FAQs, schema, intent/E-E-A-T/semantic/snippet/competitor-gap and a ranking plan
- Branded PDF reports via bundled DOMPDF with QuickChart-rendered chart images, saved to uploads/sust-reports/ and emailed on a daily cron schedule per client
- Google Ads campaign creation and control: AI keyword suggestions, ad-group grouping, ad copy, then real campaignBudgets:mutate and campaigns:mutate calls to launch, pause and enable
- AI content pipeline: keyword clustering from GSC data, calendar generation, and blog drafts written straight into wp_posts as drafts with _sust_* meta
- Rank, health-score, CWV and competitor snapshots taken on WP-Cron and charted as trends
- Third-party SEO data: DataForSEO backlinks, disavow file, keyword difficulty and SERP features; Bing Webmaster data with Bing-vs-Google position comparison
- Agency intelligence layer: upsell detection, churn risk, MRR, client LTV, share of voice, content decay, cannibalization, internal-link suggestions and a task kanban
- OpenAI usage panel with lifetime and today's spend, per-model cost pricing, reset, and a hard-failing configurable daily spend cap
Who it is for
An SEO or web agency owner (or the one account manager who does reporting) running several client sites from a single WordPress install. Everything is behind `manage_options`, so it is an admin-only back-office tool, not something you hand to staff or clients. Day to day it gives you one place to store client records, pull Google Search Console / GA4 / Google Ads numbers per client, run AI page audits, generate branded PDF reports, and build AI content calendars and Google Ads campaigns.
// illustrative interface preview. real screenshots land here before launch.
See it running
AI campaign creation, governed
Describe the client and the goal; the tool drafts the Google Ads campaign, keywords, and copy, then pushes through the Ads API. Every AI call runs behind a spend cap, a per-user cooldown, and a kill switch.
Client reports that sell the retainer
Branded, white-label PDF reports assembled from live GSC, GA4, and backlink data. Send them monthly without opening a spreadsheet.
GSC + GA4 + Ads
All three Google surfaces in one dashboard, per client.
Backlinks + difficulty
DataForSEO backlink profiles and keyword difficulty inline.
Bing too
Bing Webmaster Tools alongside Google, not an afterthought.
Connection tests that fail
Every API ships a test that fails loudly, not a green lie.
How you use it
Onboard a client and connect their Google account
- SWG SEO Tool > Clients > Add New Client (opens the 6-step wizard).
- Step 1 Business Info: Name and Website URL are required; domain goes in bare, no http:// and no trailing slash. Industry, business type, contact, logo (WP media picker) and brand colors are optional.
- Step 2 Services & Location: Services and Service Areas are comma-separated single-line fields. Physical address and Google Business Profile URL are free text.
- Step 3 Goals & KPIs: primary goal radio, monthly lead target, current traffic, current ad spend, Target Keywords and Top Competitors (one per line or comma-separated).
- Step 4 Google Connections: SKIP IT on a new client. The Connect Google Account button aborts with 'Please save the client first before connecting Google services,' and Fetch/Test Connection are rendered disabled until the client exists and has a token.
- Step 5 Report Preferences: set Report Frequency, and fill Report Recipients – the Email button on the Reports page reads this field and errors with 'No recipients configured for this client' if it is blank. Tick the report sections you want.
- Step 6 Review & Create > Create Client.
- Now reopen the client: Clients list > Edit. Go to Step 4 and click Connect Google Account, complete Google's consent screen, and you land back on the client with &tab=connections&oauth_success=1.
- Back in Edit > Step 4, click Fetch Properties (GA4), Fetch Sites (Search Console) and Fetch Accounts (Ads), choose one in each dropdown, then click each Test Connection.
- Advance to Step 6 and click Update Client – the property/site/customer selections are only persisted by that submit.
Pull the month's data and produce a client report
- Clients > click the client name > Organic (GSC) tab > Pull Search Console Data. Wait for the queries/pages/countries tables to fill.
- Traffic (GA4) tab > Pull GA4 Data.
- Paid (Ads) tab > Pull Google Ads Data (the tab shows a 'No Google Ads account connected' notice instead if ads_customer_id is empty).
- SWG SEO Tool > Reports. In Generate Report pick the Client, pick Date Range (7 / 28 / 90 days), and untick any of the 12 sections you do not want.
- Click Generate PDF Report. On success the status line shows the filename and the page reloads after 2 seconds. Files land in wp-content/uploads/sust-reports/ (the folder gets an Options -Indexes .htaccess).
- In Report Archive, use Email on the new row to send it to the client's Report Recipients with the PDF attached – the row's Status badge flips to Sent. Download gives you the file; Delete asks for an inline confirm.
Run an SEO evaluation on a single page
- SWG SEO Tool > Run Evaluation.
- Pick a Client (or leave '— Internal (no client) —'). Page URL is the only required field.
- Fill Target Keyword, Page Type, City, Service. Competitor URL is optional but it is the switch for the Competitor Gap step – leave it blank and that step is skipped even if the Intelligence Suite box is ticked.
- Under 'What to generate', SEO Report / FAQs / Schema Markup are pre-ticked; SEO Intelligence Suite and Ranking Plan are not – tick them if you want them.
- Click Run Evaluation. The form hides and a progress bar walks the steps: crawl, then one AJAX call per AI step, then Finalizing at 100%.
- Read the result cards, then click Run Another Evaluation. Evaluated URLs show up under Pages Library, filtered by client, with a Re-evaluate button and a ranking-plan completion pill.
Build a content calendar and turn it into WordPress drafts
- SWG SEO Tool > Content Calendar. Choose a client in the dropdown – changing it auto-submits the form and reloads the page with ?client_id=N.
- Click Generate Keyword Clusters. This reads that client's stored Search Console data plus their target keywords, so pull GSC data first or the clusters will be thin. The page reloads and renders one card per cluster.
- Pick Posts per week (1/2/3) and click Generate Calendar. That button stays disabled until at least one cluster exists.
- Use Write Next Post for the oldest pending row, or the per-row Write button in the 90-Day Content Calendar table. Each one creates a WordPress draft post.
- Once a row's status flips to Written, its action button becomes Edit Draft, which opens the post in the WordPress editor.
- Optional: paste a URL into 'Content URL to promote' and click Generate Outreach Drafts to get 5 AI outreach emails rendered as cards at the bottom of the page.
Create and launch a Google Ads campaign
- SWG SEO Tool > Campaigns > Create Campaign.
- Step 1: choose the Client (required to advance), Campaign Type (Search / Display / Performance Max) and Campaign Name.
- Step 2: click Suggest Keywords for AI suggestions from the client's SEO data, and/or type your own one-per-line into the manual box.
- Step 3: click Organize into Ad Groups. Step 4: click Generate Ad Copy. Both are AI calls against your OpenAI key.
- Step 5: set Daily Budget and Bid Strategy. The warning box repeats the safety cap from Settings > Google Ads; a launch above that cap is rejected server-side.
- Step 6: review, then either Save as Draft, or Launch Campaign – which shows an inline 'This will create a live campaign spending ~$X/day. Confirm?' bar, saves the draft, and then creates the budget and campaign through the Google Ads API.
- Back on the Campaigns list, drafts get an Edit button, active campaigns get Pause, paused ones get Enable.
Tech specs
Straight from the codebase scan and the engineering docs. No marketing numbers.
How it works
Single-file bootstrap (swg-ultimate-seo-tool.php) defines SUST_* constants, registers an spl_autoload mapping SUST_Foo_Bar to includes/class-foo-bar.php, wires activation/deactivation, and on plugins_loaded builds the SUST_Plugin singleton. SUST_Plugin is a service-locator god object: it compares sust_db_version against SUST_DB_VERSION and re-runs SUST_Activator::create_tables() on drift, instantiates roughly 100 service and repository objects across 106 class files (grouped by build phase 1-19), then calls register() on the 17 that hook WordPress. Admin is thin: SUST_Admin_Menu adds one top-level menu plus 8 submenus that each require() a view in admin/views/, and every render method re-checks manage_options before including the file; all interactivity goes through SUST_Ajax_Handler (4,175 lines, 141 unique wp_ajax_sust_* actions, no nopriv variants) plus two admin_post download endpoints. Data lives in 40 custom sust_-prefixed tables created by dbDelta, one wp_options row (sust_settings) holding all configuration, and transients for API response caching (SUST_Data_Cache) and mid-evaluation state. The front-end surface is separate and tiny: two shortcodes and two rewrite-rule token routes registered by SUST_Client_Portal, SUST_Self_Service_Reports and SUST_Approval_Workflow.
Where the data lives
| Database / table | Type | Purpose |
|---|---|---|
| sust_clients | custom table | One row per managed business: contact, brand colors and logo, JSON services, service areas, target keywords and competitors, GA4 property, GSC site URL, Ads customer id, serialized Google OAuth token, report frequency/recipients/sections, status. |
| sust_search_console_data / sust_ga4_data / sust_ads_data | custom table | Per-client daily API pulls – GSC query/page/country/device with clicks, impressions, CTR, position; GA4 rows as JSON dimensions and metrics; Ads campaign, ad group, keyword, match type, cost, conversions, quality score. |
| sust_evaluations | custom table | One SEO analysis run: page URL/type/city/service/target keyword, which outputs were requested, crawl data, and each AI result in its own longtext column (seo_report, faq_output, schema_output, intent, eeat, semantic, snippet, competitor_gap, ranking_plan, custom_results, CWV, PAA) plus token counts and model. |
| sust_pages / sust_faq_sets / sust_ranking_actions | custom table | Evaluated page library with last-evaluation pointer and count; generated FAQ sets with schema and draft status; ordered ranking-plan action items with impact, effort and is_complete. |
| sust_prompts / sust_custom_prompts | custom table | Versioned built-in prompt bodies keyed by prompt_key, and user-defined extra analysis prompts with label, sort order and active flag. |
| sust_reports / sust_report_schedules / sust_report_downloads | custom table | Generated PDFs (file path, date range, sections, delivery status, recipients); per-client cron schedule (frequency, day of week or month, recipients, sections); tokenized public download links with expires_at, download_count and last_downloaded. |
| sust_campaigns / sust_ad_groups / sust_ad_keywords / sust_ad_copy / sust_campaign_templates | custom table | Local draft model of a Google Ads campaign – type, budget, bid strategy, status – with its ad groups, keywords, generated headlines and descriptions, and reusable templates. |
| sust_ads_audit_log | custom table | Every spend-affecting Ads action with JSON before/after state, estimated cost impact and the confirming user id; written only through an INSERT helper, with no update or delete API. |
| sust_keyword_clusters / sust_content_calendar / sust_outreach_drafts | custom table | AI keyword clusters with primary keyword, intent and angle; scheduled content rows (week, date, title, keyword, type, target words, status); generated outreach message drafts. |
| sust_rank_history | custom table | Daily per-keyword position, clicks and impressions snapshot per client, dated 2 days back to match the GSC delay and deduped by client plus date. |
| sust_backlinks / sust_keyword_difficulty / sust_bing_data / sust_serp_features | custom table | DataForSEO backlink rows and quality data, cached keyword difficulty, Bing Webmaster metrics, and tracked SERP-feature presence per keyword. |
| sust_site_crawl_results | custom table | Full-site crawl output (max 500 pages per run): broken links, missing titles, duplicate meta, redirect chains, orphan pages. |
| sust_tasks | custom table | SEO task items per client, used by the task manager and the kanban board where status moves happen over AJAX. |
| sust_health_score_trends / sust_cwv_history / sust_competitor_snapshots / sust_competitor_sitemaps | custom table | Weekly cron snapshots: client health score over time, Core Web Vitals history, competitor page snapshots for change detection, competitor sitemap state for new-content alerts. |
| sust_title_tests | custom table | A/B title test definitions and their measured CTR and position results. |
| sust_approval_tokens | custom table | Shareable blog-draft preview links: random token, post id, client id, expires_at, status (approved or changes_requested), client comment and responded_at. |
| sust_activity_timeline / sust_logs | custom table | Per-client activity feed, and the plugin event log (event_type, message, level, client_id) shown on the Logs screen. |
| sust_log_analysis | custom table | Parsed server access-log analysis for Googlebot crawl behavior and crawl-budget waste. |
| sust_gbp_data | custom table | Google Business Profile pulls – reviews, ratings, posts, Q&A, photos – per client. |
| sust_token_usage | custom table | One row per OpenAI call: plugin slug, action label, model, input and output tokens, computed cost_usd; powers the usage panel and the daily spend cap. |
| sust_settings | option | Every configuration value in one array: agency branding, Google client id and secret, Ads developer token and budget cap, OpenAI key/model/temperature/max tokens/daily cap, DataForSEO and Bing credentials, report defaults, SMTP, access mode. |
| sust_db_version | option | Schema version compared against SUST_DB_VERSION (3.0.0) on every load to auto-run create_tables(). |
| sust_eval_{id} / sust_eval_faq_{id} | transient | Crawl data, competitor crawl and PAA questions held between the step-by-step AI calls of one evaluation; expiry forces the run to be restarted. |
| sust_openai_cap_hit_today | transient | Cap amount, spend so far and reset timestamp when the daily OpenAI cap trips; expires at midnight in site timezone and drives the admin notice. |
Talks to
OpenAI Chat Completions (gpt-4o, gpt-4o-mini, gpt-4-turbo) SEO audits, FAQs, schema, intent and E-E-A-T analysis, ranking plans, ad copy, blog drafts, briefs, executive summaries and digests Google OAuth 2.0 One per-client consent covering analytics.readonly, webmasters.readonly and adwords; tokens stored on the client row and refreshed Google Search Console API (searchconsole.googleapis.com/v1) Site list plus searchAnalytics queries, pages, countries and devices; source for rank history and opportunity keywords GA4 Data API (analyticsdata.googleapis.com/v1beta) and Analytics Admin API Sessions, users, traffic sources, landing pages, conversions; account and property discovery Google Ads API v22 (googleads.googleapis.com) googleAds:searchStream reads for campaigns, keywords and search terms, plus campaignBudgets:mutate and campaigns:mutate writes for launch, pause and enable Google Business Profile API (mybusiness / mybusinessbusinessinformation) Reviews, ratings, posts, Q&A and photos per client location PageSpeed Insights API v5 Core Web Vitals for evaluations and the weekly CWV monitor; no key required DataForSEO Backlinks and disavow input, keyword difficulty, keyword volume and SERP features; HTTP basic auth with login plus API password Bing Webmaster Tools API Bing rankings, clicks and impressions, and Bing-vs-Google position comparison QuickChart.io Server-side rendering of chart PNGs embedded in PDF reports; no key SERP provider (DataForSEO, ValueSERP or SerpAPI) People Also Ask questions during evaluations; skipped silently when unconfigured Looker Studio / Data Studio API Optional per-client template cloning and report link management; returns null when unconfigured SMTP or wp_mail Scheduled report delivery, weekly digests, monthly client emails and health alerts
Public surface
Small and optional. Two shortcodes: [sust_client_portal] renders a logged-in client dashboard (28-day GSC KPIs with month-over-month deltas, top keywords, recent report links) for whichever client id is stored in that user's sust_client_id user meta, and [sust_report_builder] lets the same user pick a date range plus sections and generate a PDF. Two rewrite routes give tokenized, no-login access: /sust-report-download/{token} streams a generated PDF and increments a download counter, and /sust-preview/{token} shows a blog draft with Approve / Request changes buttons that POST back and fire a webhook. An opt-in white-label login skins wp-login with the agency logo and colors. There is no public data-entry form and no nopriv AJAX.
History
Changelog
63 releases since March 2026. The whole history, verbatim from the changelog:
Pricing
Starter
- 1 site
- All features, no gates
- Updates + support for a year
- 30-day refund
Agency
Most popular- 10 sites
- White-label PDF reports
- Priority support
- 30-day refund
Lifetime
- Unlimited sites
- Updates forever
- Priority support
- 30-day refund
// placeholder pricing pending launch. tiers mirror the swg-license-manager product model.
Frequently asked questions
What is the SWG Ultimate SEO Tool?
It is an all-in-one SEO platform for WordPress agencies. Google Search Console, GA4, Google Ads and Bing Webmaster Tools run in one dashboard per client, alongside backlink research and branded PDF reporting.
Who is this SEO plugin built for?
Agencies and consultants running SEO for more than one client. Everything is organized per client, so the dashboard, the connections and the reports all scope to whichever account you are working on.
Does it connect to Google Search Console and GA4?
Yes. Each client gets their own Google connection covering Search Console, GA4 and Google Ads, so you are never stitching exports together by hand. Bing Webmaster Tools sits alongside them rather than being an afterthought.
Can it actually build Google Ads campaigns, or just suggest keywords?
It builds them. You describe the client and the goal, and the tool drafts the campaign, keywords and ad copy, then pushes it live through the Google Ads API.
How do you stop the AI features running up a bill?
Every AI call runs behind a hard spend cap, a per-user cooldown and a kill switch. Usage is written to a ledger you can read, so the spend is visible rather than a surprise on your card.
Can I send white-label reports to clients?
Yes. The PDF reports are branded and assembled from live Search Console, GA4 and backlink data, so a monthly client report does not mean opening a spreadsheet.
Do I still need a separate rank tracker or reporting tool?
That is the point of it. It is built to replace a reporting tool, a rank tracker and a campaign builder, plus the time you spend reconciling their exports.
Where does backlink and keyword difficulty data come from?
Backlink profiles and keyword difficulty come from DataForSEO and render inside the same client view, so research does not mean leaving the dashboard.
How will I know if a Google connection has broken?
Every API integration ships a connection test that is allowed to fail loudly. A broken token reports as broken rather than showing a green light over stale data.
Can I buy the Ultimate SEO Tool today?
Not yet. Checkout opens once the SWG License Manager clears its final security gate, and the prices on this page are placeholders until then. Join the launch list and you will be emailed the day it opens.
Want it the day checkout opens?
Checkout opens the day our license platform clears its final security gate. One email when it does. That is the whole funnel.
No spam. One email at launch, then the newsletter only if you opt in.