- Fixed White page on the dashboard and every app screen after the asset-caching change: the ASSET_VER constant was only defined in config/constants.php, which the deploy never uploads. It is now defined in an autoloaded helper that ships with the code.
- New "Prepared by" card on the client success report and the team reports page: your logo, name, a one-line description, website link, contact email and phone, all set under Agency > Profile. SEO Locale gets its name and seolocale.com by default.
- Improved Front end finished: the FAQ, documentation, blog post and 404 pages moved onto the new theme; the five original feature pages (keyword tracking, technical audits, white label, automation, competitor analysis) now run on the same template as the newer pages with screenshots, comparison tables, structured data and related links; blog posts and all marketing pages are in /sitemap-pages.xml.
- New Case studies at /case-studies, starting with Grand Affair Party Rentals: the numbers from their own reports, the approach, the actual screenshots and the tools behind it.
- Improved Faster pages: stylesheets and scripts are now cached between releases instead of refetched on every visit, and fonts load from one link in the page head with display swap instead of a blocking import inside each stylesheet.
- New A set-up checklist on an empty dashboard: add a project, connect Search Console and Analytics, invite a client, schedule a report. It hides itself once everything is done.
- Improved The legacy AI keyword report (Project report, Report view and its email) is retired. Old links open the success report, which does the same job from every data source and publishes to the client dashboard.
- Improved The header search works now. Type two letters and it searches everything you own: projects, tracked keywords (straight to the keyword history), success reports, AI visibility projects, GA4 properties, uptime monitors, Google Ads campaigns and every page in the menu, with keyboard navigation and Cmd/Ctrl K or / to focus it from anywhere. The success report list has its own search box that works together with the tabs.
- Improved Success report rebuilt. The list now scores every project on the keywords that improved or held the top 3 since the first check, and View report opens a compiled page instead of a placeholder: a success score, the wins found across rankings, local pack, AI Overviews, SERP features, share of voice, Search Console, GA4, AI assistants, Google Ads, uptime and backlinks, an agency-only watch list, a 30-day, 90-day or all-time range, and an AI-written note to the client you can edit. Publish to client puts the exact report on the client's dashboard (a card at the top with the score and top wins) and on a Success Report page in their portal, looking the same as it does for you. Remove it from the dashboard at any time.
- New Social proof strip on the homepage, the feature landing pages and the comparison pages: rating, the agencies and products built on SEO App, and customer quotes.
- New Comparison pages at /compare: SEO App vs Semrush, Ahrefs, Moz Pro, SE Ranking, AccuRanker, BrightLocal and AgencyAnalytics, each with a head-to-head card, a feature table marking who wins each row, where the other tool is the better pick, screenshots, a verdict and FAQs. The header Compare link now opens the hub, and the pages are in the sitemap.
- New Ten new SEO landing pages on seoapp.io (agency rank tracker, local SEO, AI visibility, SERP features, share of voice, client reporting, Google Ads reporting, uptime and DNS monitoring, API and webhooks, keyword gap analysis) built from one config file and one template, with FAQ and breadcrumb structured data, related-page links, footer links and a /sitemap-pages.xml listed in robots.txt.
- Improved Homepage and the new SEO landing pages now show real product screenshots (keyword report, client portal, local rank heat map, keyword table, keyword history) with a click-to-enlarge view. Each landing page gained a who-it-is-for section, a stats band, a usual-way versus SEO App comparison table, a three-part deep dive and more FAQs.
- Improved Keyword ranking progress report email redesigned: at-a-glance tiles (keywords tracked, page 1, top 3, AI Overviews, moved up/down, newly ranking), biggest gains and keywords needing attention, a colour-coded table of every ranking keyword with Google, AI Overview and local pack positions, the agency's logo, a button to the full report and the client dashboard link. Keywords entering or leaving show "new" and "lost" instead of odd numbers.
- Improved Client portal: the LLM keyword tracking page and the LLM keyword detail page are rebuilt on the new design: mention tiles per engine, visibility timeline, a summary of mentions found / ranked first / improved / declined, the keyword history chart, a sortable keyword table with new/lost chips, and engine tabs on the detail page with your pages highlighted in each AI answer.
- Improved Client portal: social proof statistics (tiles, impression/hover charts, top pages, collected data with expandable details) and the gap analysis detail (who leads, shared keyword table with gap, keyword difficulty ring, search volume history and both sites' ranking pages and backlinks) are rebuilt on the new design. Every portal page now uses the new shell.
- Fixed Keyword history: a day's position is now the best ranked check that day (an unranked check no longer counts as the day's minimum), "since first check" compares with the first check that ranked, and the date range links no longer break on keywords with spaces.
- Improved Sidebar reorganised: 14 flat application groups become six sections by task (Overview, Rankings & keywords, AI visibility, Traffic & ads, Content, Technical & monitoring) plus Clients, Account and Administration. The section holding the current page opens itself, your open/closed choices are remembered, a "Find a page" box filters the menu as you type, duplicates and the legacy Google Ads templates are out of the menu, and "Domains" is now "Projects".
- Improved Client portal: the Google Analytics pages (dashboard, channels, audience, pages, organic & devices, traffic sources, widgets and the generated report view) are rebuilt on the new design: metric cards you click to switch the charts, a date range picker, dark-theme charts, and the report view now shows the same tiles, highlights and channel table as the report email.
- Improved GA4 daily, weekly and monthly report emails redesigned: at-a-glance tiles with change chips, plain-English highlights (top channel, biggest riser and faller, key events), a channel table with share bars, a key events table with the best channel per event, the agency's logo and a button into the client portal. Replaces the old raw metrics grid.
- New Analytics → Reports: generate a daily, weekly or monthly report for any site on demand (same data the schedule would pull). Newest reports are listed first, and hand-made reports are never emailed automatically.
- New Analytics → Reports: type an email address in the page head and click the envelope on any report row to send that report as a test email, exactly as the client receives it.
- New Google Ads → Performance Report: pick any mix of accounts and campaigns and see them combined (plus per-campaign), with a comparison period of your choice: previous period, previous period matched by day of week, same period last year, or a custom range.
- New Client portal: a Paid Ads page with the same report (read-only, limited to the client's own campaigns) and a Google Ads tile on the dashboard showing spend, clicks, conversions and cost per conversion for the last 30 days against the 30 before.
- New Paid ads report: a Conversions by type table (calls, form submissions, purchases and every other conversion action) with primary and secondary counts, value, share and change, plus a conversion-types column in the campaign breakdown. Secondary actions are shown even though Google leaves them out of the headline Conversions number.
- New Paid ads: daily trend chart (spend, clicks, conversions, impressions, CPC, cost per conversion or CTR) with the comparison period as a dashed line.
- New Paid ads: scheduled weekly or monthly email per account, sent to the client portal users and any extra addresses, with key metrics, conversions by type, campaigns and top searches, and a link to the portal. Send yourself a test from the report page.
- New Paid ads: budget pacing per campaign for the current month: daily budget, spend to date against what was expected by now, projected month end and an on/under/over pace flag.
- New Paid ads: enter what a conversion is worth (a call, a form lead) and the report shows estimated revenue and ROAS everywhere, including in the client portal, where Google has no conversion value.
- New Paid ads: device and location breakdowns (share of spend by device; clicks, cost and conversions by city or region).
- Improved Campaign breakdown can switch to an ad-group breakdown; every table sorts by any metric; a metric chooser per section adds or removes columns and remembers your choice.
- Improved Keyword performance tags keywords and search terms as brand or non-brand. Move a term with one click or add brand / non-brand rules (contains or exact); campaigns named "brand" count as brand by default.
- Improved Cost metrics (spend, CPC, cost per conversion) use reversed colour coding: a drop shows green.
- Improved Google Ads menu and pages say "accounts" for SEOApp projects and keep "campaigns" for Google's campaigns; the linked list sorts by account, customer, campaign or status.
Changelog
What's new in SEO App
Every improvement, new feature and fix we ship, newest first. Updates go live as soon as they are released.
New
Improved
Fixed
- New Client portal sign-in: "Forgot your password?" now emails the client a one-time 6-digit sign-in code (valid 15 minutes, single use). They sign straight in and are invited to set a new password, so nobody has to resend login details by hand.
- Fixed Client portal sign-in no longer accepts a hard-coded fallback password; only the client's own password or an emailed code signs them in.
- Improved Client portal dashboard tiles: a colour per report type, a headline number and a green/amber/red status chip (ping speed, DNS changes, domain and SSL expiry).
- Improved Client portal: the account manager is now front and centre. A large card at the top of the dashboard shows who to contact with a one-click email, team reports and report history, and a smaller card sits in the sidebar on every portal page.
- New Client portal: approvals waiting in PeakKR raise an alert on every portal page (plus a badge on Team Reports), not only on the dashboard, so a client cannot miss a decision the team is waiting on.
- Improved Client portal dashboard redesigned: a headline card per project (keywords tracked, top 3 and page 1 with change since the last check, rank distribution, best rankings and biggest climbers), approvals and team reports next, and every shared SEOApp report or tool as one compact tile grid instead of a tall column of single cards.
- Improved Each agency connects its own PeakKR workspace: My profile → Integrations → PeakKR reports. Paste the token, see the connection status, and your clients get their team reports on the next portal visit. Changing the token re-matches projects.
- New Client portal: reports from your SEO team. When the PeakKR API token is set (Admin → SEO tools settings), each client's dashboard opens with any approvals waiting for them, the latest reports shared by the team (GBP audits, AI visibility audits, site audits, on-page docs, success stories, local map grids and work reports) opened via their white-label pages, a Google Search traffic tile, the account manager's contact and a link to the full report history. A new Team Reports page lists everything with a filter by type.
- Improved Clients are matched to PeakKR projects by domain once and the key is stored; data is cached for an hour and only ever requested in client mode, so nothing internal can reach a client screen.
- Fixed Client portal: the Data Studio report page opens the Looker report full-height with Monthly / Quarterly / Yearly switches and an open-full-screen button; the SEO Detect and Dash Directory embeds are gone. Links in the rebuilt portal tables use the theme colours instead of browser blue.
- Fixed Share of voice and SERP features cards: inner padding, a readable highlight for your own domain on agency-branded portals (light accents no longer wash out the text), larger share numbers and clearer bars.
- Fixed Client dashboard polish: the project card no longer washes out on light agency accents, the four stat tiles stand out as boxes, rank distribution legend and best-ranking rows have proper spacing, and the account name in the top bar uses the theme colour.
- Improved Client portal menu only lists what the client has: LLM projects, Analytics, GA4 reports, uptime, DNS, domains, gap analysis, social proof, Data Studio, files and announcements disappear when there is nothing behind them, and empty sections are hidden.
- Fixed Client portal: a 500 error on every page once PeakKR was connected (the shell looked up models the wrong way inside the view). The agency logo from agency settings now shows in the portal sidebar reliably, with the name as fallback only if the image fails to load.
- Fixed Keyword report: the row-select and select-all checkboxes in the rankings table use the dark theme styling.
- New SERP features: a new card on the keyword report (main app and client portal) shows which features appear for your keywords (featured snippets, People also ask, video, local pack, AI Overview, top stories, shopping, ads and more), how many of them you hold, and which domains hold the rest. Click a feature for the keyword-by-keyword list. Owners are recorded from the next ranking check onward.
- New Competitor keyword discovery: every competitor on the Share of voice card has a Keywords button that lists the keywords they rank for in the top 30 that you do not track yet, with volume, CPC, difficulty, intent and their ranking page. Tick the ones you want and add them straight into the project. Lookups are cached for 30 days per competitor and cost audit tokens like the keyword research tools.
- New Dashboard: a Portfolio panel lists every project with keywords, top 3 and page 1 counts (with change since the previous check), share of voice, last check, when the client last opened the portal, and signals such as “12 keywords left page 1”, “Share of voice down 3 pts”, “No check for 4 days” or “Client not seen in 40 days”. Filter by at risk / improving / steady and sort any column.
- New API v2: outbound webhooks. Register a URL and SEOApp posts a signed project.checked event after every ranking check with the summary, movements, best keywords and share of voice. Also new: GET /portfolio, GET /projects/{id}/serp-features/ownership and GET /projects/{id}/competitors/{domain}/keywords. Built for PeakKR, usable by any tool.
- Fixed Client portal: the Share of voice and SERP features cards now load (their endpoints were missing from the portal's route list), and the keyword finder's volume lookup is routed too. Checkboxes in the competitor keyword list use the dark theme styling.
- New API v2: GET /stats returns the agency's headline numbers (keywords on page 1, at #1, in the top 3, movement since the last check, monthly searches and estimated clicks you capture, AI Overview citations, local pack wins, SERP features held, share of voice, lifetime #1s, monitors up) plus a keyless GET /stats/embed/{token} with CORS for live counters on your own website. GET /projects/{id}/stats gives the same per project.
- Fixed Dashboard: the new Portfolio panel could hold up every other widget on large accounts. It now uses cheap range lookups, is cached for 10 minutes, and no longer holds the session lock while it builds, so the rest of the dashboard loads independently.
- Improved Client portal: Google Analytics properties, the GA4 reporting hub and generated reports, LLM projects, social proof campaigns and notifications, Data Studio reports (list and report view), gap analysis, topics & keywords, the keyword finder, the competitor visibility report and the Looker Studio page now use the same dark design, cards and tables as the keyword report.
- Improved Client portal: the AI visibility pages (overview, visibility score, cited pages, citation detail, mention analysis, monthly report and AI answers vs Google) and the blog post pages (posts with tracked keywords, post rankings, keyword history) are rebuilt in the same style, with engine chips, rank chips and change pills instead of the old badges.
- Fixed Client portal keyword finder: the search-volume and CPC lookup was calling an endpoint that expected a project id and never filled in. It now resolves per keyword again.
- Improved The five largest controllers (cron jobs, main app, client portal, data queries and webhooks, together over 60,000 lines) are now split into 29 focused trait files grouped by feature: billing, projects, keyword research, SERP sensor, reports, GA4, monitoring, LLM, payments and so on. Routes and behaviour are unchanged; nine superseded “_old” methods that nothing linked to were removed.
- Improved A keyword that ranked on the first two pages and is then missing from a single check no longer shows as a drop to “Not in top 100”. The keyword report keeps the last known position with a small “?” marker (hover it for details) and the charts and distribution stay stable. A drop is only shown when two checks in a row miss the keyword. Applies to the main keyword report, the client portal and the API (`unconfirmed` flag on each ranking row).
- New Share of voice: every keyword report (main app and client portal) now has a competitors card below the rankings table. It shows which domains own the search results for your tracked keywords, weighted by position and search volume, your site's share and rank among them, a 14 / 30 / 90-day trend, and the exact keywords where a competitor took your spot since the previous check, or where you took theirs.
- New API v2: GET /projects/{id}/share-of-voice returns the same standings, trend and lost / won spots for your own dashboards.
- Improved Share of voice is snapshotted on every ranking check, so the trend builds up from today even though raw search results are only kept for two days.
- Improved Every ranking, history, report and cron query that used to splice keyword, domain, date and URL values straight into SQL now passes them as bound parameters. 141 queries across the app, the client portal, the API and the cron jobs were converted, and the social-proof and scheduler filters now escape their inputs. No behaviour change, just a closed door.
- New Projects list: a Table / Cards switch in the toolbar. The table now shows each site's favicon; Cards gives every project a preview card with cover, highlight numbers, rank distribution, best rankings and biggest climbers since the last check. Your choice is remembered on that device.
- Improved Keyword tracking page: the SERP sensor, backlink audit, client login and insights panels now sit below the keywords table under an Agency insights heading, so the charts and table load higher. The highest-visibility keyword is called out in the table toolbar.
- Improved The “ranking checks temporarily affected” pop-up no longer interrupts the ranking page and combined reports. Client users see it as a dismissible notice at the top of the portal and on the sign-in page instead.
- New The client portal (agency_user) now uses the same dark design as the main app: sidebar, top bar, mobile drawer and the agency logo in the corner. Agencies without a logo file see their agency name instead of a broken image.
- Improved Agency branding in the client portal: the agency logo sits in the sidebar and the agency's brand colour replaces the gold accent (active menu item, buttons, chips) when it reads well on the dark theme; greys and near-white colours fall back to gold. Blog topics no longer appear on the client dashboard.
- Improved Portal monitoring pages rebuilt in the keyword-report style: server uptime list and monitor page (stat cards, response-time chart, latest checks, incidents, checking locations), check history and single-check pages, DNS monitor list, record view with change history, domain names list with expiry chips, plus announcements, project files and change password.
- Improved Portal heatmap now uses the same map as the main app: dark map with heat glow, keyword list with filter and Maps / Organic / Both layers, detail card, and stat cards. Blogs & Topics is gone from the client sidebar.
- Improved Portal domain name page rebuilt: domain and status in the title, last check and total checks under it, then two cards for registration (with days-left chip, registrar and nameserver chips) and the SSL certificate. Stat widgets on the other monitoring pages are now one compact row each and go full width on phones.
- Improved Every other client portal page (server uptime, DNS, domain names, analytics, GA4 reports, LLM projects, social proof, blog topics, files, announcements, heatmap, change password) now sits inside the same dark shell, with its cards, tables, buttons, forms, charts and dialogs restyled to match.
- Improved Portal dashboard: everything shared with a client is grouped by report type as cards with Open and Report buttons, instead of one plain table.
- Improved Portal keyword report rebuilt to match the main ranking page: stat cards, the Share / Count keyword history chart, rank distribution with AI Overview and Local Pack top 3, the Google Maps strip, position chips, SERP feature chips with a click popover, spreadsheet export and the date comparison.
- Improved Portal keyword history page rebuilt: keyword headline, best-ever and since-first-check stats, position chart with top 3 and page 1 bands, quick ranges, and ranking history plus top results tables.
- Improved Portal projects page is now a preview of each project: a cover with the site's favicon and domain, keyword count, average position and change, top 3 and page 1 counts, AI Overview and local pack counts, a rank distribution bar, best rankings and biggest climbers since the last check, with a Today / Yesterday / 7D / Month / All range for the change.
- Improved Keyword history page rebuilt: the keyword as the title with domain, location and device under it; stat cards for current position, best ever, change since first check, volume, CPC and difficulty; a position-over-time chart with top 3 and page 1 bands and quick 7d / 30d / 90d ranges; a ranking history table with per-check change; and a top results table with your page highlighted.
- Improved Projects list opens sorted by the biggest position gain for the selected range, with the sorted column marked in gold. Columns where more is better now open descending on first click.
- Improved Keyword history chart rebuilt: rounded stacked bars showing each band's share of the month (switch to raw counts with one click), the same colours as the rank distribution, a clickable legend, no empty future months, and a tooltip with counts, shares and the monthly total. The rank distribution below it is now one solid bar in the same colours, with new rows for the share of keywords in AI Overview and, when enabled, in the Local Pack top 3.
- Improved The keyword table opens sorted by best position, with keywords outside the top 100 at the bottom. Your own column sort is still remembered.
- Improved Add keywords form: a full-width, four-line keyword box with a live keyword count, one keyword per line or comma separated, and the location, device and save controls lined up beneath it.
- Improved Keyword tracking header: a small Dashboard / Projects breadcrumb replaces the Projects and Go Back buttons, leaving one quiet Heatmap link and the gold Add keywords button.
- Improved Add keywords is a gold button in the page header; the form itself stays collapsed until you need it.
- New Mobile navigation: on phones and small screens the sidebar now opens as a drawer from the menu button in the top bar.
- Fixed The notification bell in the top bar now opens a panel with your latest notifications and links to the full list. The red dot only shows when there is something new.
- New This changelog page, so you can see what changed and when.
- Fixed Changelog page text now appears on every device.
- Fixed On phones the page title and header buttons no longer show through the open navigation drawer; the notification panel also sits above page headers now.
- Improved Dark map that matches the app, with a keyword panel, filter, and a toggle between Google Maps rank, organic rank, or both.
- New Heat glow drawn from your keyword locations, colour-coded by rank band, plus a tracked-location pin with a reference radius.
- New Stats strip: keywords on the map, how many are in the local 3-pack, average Maps rank and average organic rank.
- Improved Clicking a keyword or pin opens a detail card on the map instead of a white pop-up; hovering a keyword highlights its pin.
- Improved Rank distribution card beside the keyword history chart replaces the six coloured percentage boxes.
- Improved Google Local Map condensed into one line: keywords in the local 3-pack, band counts and a monthly sparkline.
- Improved Cleaner table: tabular position numbers, small up/down change chips, clearer column names, SERP features as a count you can click to see the list, and an 'Export to spreadsheet' button.
- Improved Visibility, keyword mapping, position tracking and analytics insights are collapsed by default so the page is shorter.
- Fixed Tooltips on chips, badges and the sparkline now appear immediately on hover.
- New Verified ranking pins: an external tool can push a position it verified for a keyword. The tracker shows it with a 'verified' mark while the measured history keeps recording underneath, and releases it automatically once the regular check catches up, after two near-misses, or after 14 days.
- New API v2 at /api/v2 with per-user API keys, pagination, rate limits, and endpoints for projects, keywords, current rankings, ranking history, changes between two dates, stored SERPs, SERP features, AI Overview, Google Maps ranks, verified pins and a one-call export (JSON or CSV).
- Improved The local map chart now includes the top 3 and 4-10 bands, which were computed but never shown.
Have a question about an update? Contact us. Machine-readable version: changelog.json.