About Services Cases Blog Tools Reviews Partners Contacts

Technical Audit and Recovery of the Grafix Website: PageSpeed 22 → 60, Server Response 2.6 s → 0.05 s

WordPress website technical audit: PageSpeed 22 → 60, server response 2.6 → 0.05 s, Ahrefs Health Score 44 → 99

Grafix is a manufacturing company listed in the Forbes Ukraine ranking: powder coating of metal, laser cutting, sandblasting, metal bending. Several cities, three language versions, B2B leads through forms and calls. I’ve been working with Grafix for over three years, running their PPC ads. This time I took on the entire technical state of the site: speed, security, SEO and analytics.

Contents
  1. What we were dealing with
  2. Speed
  3. Redirects and links
  4. Security and plugins
  5. The language-version incident
  6. SEO
  7. GTM and analytics
  8. Interface
  9. What’s next
  10. FAQ
MetricBeforeAfter
PageSpeed, mobile (Performance)2260
Server response on key pages0.7–2.6 s0.04–0.06 s
Total image weight456 MB94 MB (−79%)
Ahrefs Health Score44 (150+ errors)99
Redirect chains310

What we were dealing with

The site had been developed for years without technical maintenance. There’s no in-house developer, different contractors made changes, and each left something behind. At the start I found:

  • an outdated WordPress 5.8 and PHP 7.4;
  • dozens of plugins, some of which didn’t work at all, plus traces of six different caching and optimization plugins;
  • old analytics code right in the theme: two old GA4 properties, an inactive Google Ads account, Yandex.Metrica, a Bitrix24 widget;
  • an old phone number in the “Call” links;
  • redirect chains and pages that took 2–3 seconds to respond.

Since August 20, Search Console had flagged all 141 mobile pages as “slow”: LCP over 4 seconds.

Search Console — 141 mobile pages with the “LCP over 4 s” issue
Search Console — 141 mobile pages with the “LCP over 4 s” issue

And the worst thing was in the site’s public folder: a full 748 MB archive of the site from 2021, available via a direct link. Together with a copy of the settings.

The site’s public folder with a 748 MB archive from 2021
The site’s public folder with a 748 MB archive from 2021

I made every fix as a separate step: reviewing the changes, applying them, checking the live site in a browser. Every fix has a backup and can be rolled back.

Speed

Page caching on Cloudflare

I enabled HTML page caching on Cloudflare. The admin area, forms, search and logged-in users bypass the cache. Forms, GTM, GA4 and Ringostat number replacement work on cached pages — I checked with test leads.

PageTTFB beforeTTFB after
Home1.25 s0.06 s
Laser cutting (Kharkiv)2.58 s0.05 s
Sandblasting2.18 s0.05 s
Metal bending0.77 s0.06 s
Contacts0.70 s0.04 s

Core Web Vitals

Metric (PageSpeed, mobile, Lviv page)BeforeAfter
Performance2260
TBT (script blocking)1,710 ms220 ms
CLS (layout shift)0,2460,06

What made this happen:

  • reCAPTCHA took 1.6 s of CPU time on every page. Now it loads after the visitor’s first interaction: a scroll or a tap. Forms work, checked with a test lead.
  • 1,220 images recompressed without changing their dimensions or URLs: 456 → 94 MB.
  • The main image loads first, with a separate version for mobile. Some styles no longer block the page from rendering.
  • Missing hero photo. The file had simply disappeared, and on 17 pages, including powder coating and Lviv, there was an empty space instead of a photo. Restored it.
  • A layout shift caused by certificate logos in the header — removed.
  • Slider Revolution loaded on every page, even though the site has no slider. Disabled it.

Lab PageSpeed fluctuates between runs, so I rely on Google’s real-user data. At the time of the work, the Chrome UX Report for 28 days showed LCP 4 s, INP 255 ms, CLS 0.14. A new data window will be ready by early December, and that’s when I’ll start the fix validation in Search Console.

Real Chrome UX Report data at the time of the work
Real Chrome UX Report data at the time of the work

Redirects and links

  • 1,531 internal links pointed to old URLs through redirects. I replaced them with direct links in page texts, Elementor and menus.
  • Redirect chains of 2–3 hops: I pointed 31 rules straight to the final URL. There are now 0 chains.
  • The address link in the site header also went through a redirect — fixed for all languages.
  • Removed broken RSS links.

Security and plugins

  • I deleted the 2021 site archive and the settings copy from the public folder. Moved the 6.3 GB backup to a private folder.
  • Removed 15 plugins: non-working ones, duplicates and typical attack points like WP File Manager and WP Migrate DB. Disabled file editing from the admin area.
  • I didn’t touch the Perfectum CRM and CF7 to Webhook integrations: leads go through them.
Removing non-working plugins
Removing non-working plugins

The language-version incident

I’ll be honest about what went wrong, too. An old theme script redirected visitors between language versions. When I enabled the cache, from 15:13 to 15:29 visitors from Ukraine got pages reloading in a loop.

I rolled back the changes in 16 minutes, rewrote the script so that the language is taken from the page without extra requests and redirects, and only then enabled the cache again, checking in a browser. That’s exactly why every fix I make comes with a backup: when something breaks on a live site, a rollback should take minutes.

SEO

Audit and indexing

  • The hosting was blocking the Ahrefs crawler with a 403 response, so the audit saw only 9 pages and a Health Score of 44. I unblocked it. The repeat audit: 796 URLs, Health Score 99, 5 errors.
  • In Search Console, instead of 9 sitemaps, some of which returned 404 or pointed to the closed English version, I kept one up-to-date sitemap.
  • Closed 10 old landing pages with no links from indexing. They remain available for ads.
  • Fixed canonical on the privacy policy pages and removed a pixel image that was being used in social media page previews.
Ahrefs before — the audit saw 9 pages, Health Score 44
Ahrefs before — the audit saw 9 pages, Health Score 44
Ahrefs after — 796 URLs, Health Score 99
Ahrefs after — 796 URLs, Health Score 99

Keyword map and on-page

I built a keyword map from 90 days of Search Console queries and Google Ads search terms, tied to pages. I found cannibalization: several pages were competing for the same query with the wrong headings.

  • Title: 16 templates (“… - grafix” across the whole site → “… | GRAFIX”) and 29 individual titles for hubs, city pages, laser cutting, profile coating, metal structures, the calculator.
  • H1: fixed 16 headings for target queries. The sandblasting hub, for example, had the H1 “Shot blast cleaning”, and some H1s were whole sentences or had typos.

Press center

Three new articles in Ukrainian and Russian, 6 pages, for queries the site was already showing up for but had no dedicated page:

  • powder coating of galvanized steel, stainless steel and aluminum;
  • how much powder coating costs, with a “from” price table;
  • bending galvanized sheet and aluminum.

Each article links to the service and city pages. I added them to the sitemap and submitted them for indexing.

Combo · SEO + Google AdsGoogle Ads + SEOA powerful combo: Google Ads and SEO in one pair of hands — technical and local SEO, content, ads and a monthly report. 3-month minimum.$750 / moLearn more

GTM and analytics

  • Removed all outdated tags from the theme code: two old GA4 properties, an inactive Google Ads account, old remarketing, Yandex.Metrica, the Bitrix24 widget.
  • Two hardcoded Meta Pixels: moved one to GTM, the other was an unnecessary duplicate.
  • Combined the Google tag: instead of three copies of the gtag.js library, one loads. GA4 and remarketing to both Google Ads accounts work.
  • All analytics is now managed from one place, GTM: GA4, Google Ads (2 accounts), Meta Pixel, Ringostat, Clarity.
  • Thank-you page: after a lead from a Ukrainian page, the visitor was sent to the Russian one. Now it’s the Ukrainian one, and the GA4 conversion fires on both, so no data is lost.
  • Phone: replaced the old number with the current one in 65 places, including the “Call” links and descriptions for Google. Ringostat replaces it correctly, test leads reach Perfectum CRM.
Combining the Google tag with both Google Ads accounts in GTM
Combining the Google tag with both Google Ads accounts in GTM
End-to-End Analytics: What Problems It Actually Solves Analytics + Google AdsEnd-to-End Analytics: What Problems It Actually SolvesWhat end-to-end analytics really is and what real dashboards for lead gen, B2B and e-commerce look like.Sep 16, 2026Read

Interface

  • The “Services” menu in three languages: grouped laser cutting into a dropdown by city (Kharkiv, Kyiv, Lviv), like coating and sandblasting, and moved metal structure fabrication higher.
  • The Ringostat button covered text on the left. Moved it to the right under the reCAPTCHA badge and changed its color to green.
  • Removed duplicate breadcrumbs in the article template.
  • Addresses on the home page — cities only, no streets. Added Ivano-Frankivsk.
  • Background images were loading from the theme’s demo site. Now — only from the client’s own server.
The services menu before the changes
The services menu before the changes
Laser cutting with a city submenu, the green Ringostat button on the right
Laser cutting with a city submenu, the green Ringostat button on the right

What’s next

  • ~Nov 20–25: checking the real-user speed data and starting the fix validation in Search Console;
  • further speeding up the first screen;
  • new press center articles;
  • updating WordPress, PHP and plugins: the stack is outdated.

A separate note for the client: after changing content in the admin area, you need to click Cloudflare Caching → Purge Everything. Otherwise the updates appear on the site within 2 hours.

Grafix described how these changes look from the company’s side in its own article “We updated the Grafix website: faster, more convenient, more up to date” (in Ukrainian).

CRO for Google Ads: It's Not the Ads Wasting Your Budget. It's Your Website Google Ads · MarketingCRO for Google Ads: It's Not the Ads Wasting Your Budget. It's Your WebsiteCRO for Google Ads: why ads can't save a broken website. Two real teardowns — a landing page and a product page — plus a first-screen checklist.Oct 6, 2026Read
Slow site, and ads and SEO don’t bring leads? Get in touch, I’ll review the technical state

FAQ on the topic

Frequently asked questions

Why is a WordPress site slow even when the hosting is fine?
Most often it’s what piles up over the years: unnecessary plugins, heavy images, scripts that load on every page for no reason, and redirect chains. Without a systematic audit, every new fix adds another layer.
Is it safe to enable Cloudflare page caching on a site with forms?
Yes, if you exclude the admin area, forms, search and logged-in users from the cache, and then check leads, analytics and call-tracking number replacement on the cached pages.
Why does PageSpeed show one thing and Search Console another?
PageSpeed is a lab test of a single load, and its result fluctuates between runs. Search Console uses real Chrome visitor data over 28 days, so improvements show up there with a delay.
Why remove old analytics tags from the theme code?
Duplicate tags duplicate conversions and slow the site down, and tags in the theme code are invisible to everyone and not controlled. When everything is managed from GTM, you can see what is sent where.
How long does technical website optimization take?
It depends on the state of the site. The audit and the main fixes take a few days, but the result in Google’s real-user data becomes visible in about a month.



Contact

Let's discuss
your project

Leave a request — we'll assess your situation, discuss your goals and find the best solution for your business and budget.

🏆
As a Google Partner, I can help you get a Google Ads bonus of up to 55,000 UAH ($1.2K) for your first campaigns.
❌ I don't work with: gambling · betting · alcohol · tobacco · crypto · grey niches · payday loans
▸ new_project.init()
Discuss a project