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
| Metric | Before | After |
|---|---|---|
| PageSpeed, mobile (Performance) | 22 | 60 |
| Server response on key pages | 0.7–2.6 s | 0.04–0.06 s |
| Total image weight | 456 MB | 94 MB (−79%) |
| Ahrefs Health Score | 44 (150+ errors) | 99 |
| Redirect chains | 31 | 0 |
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.
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.
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.
| Page | TTFB before | TTFB after |
|---|---|---|
| Home | 1.25 s | 0.06 s |
| Laser cutting (Kharkiv) | 2.58 s | 0.05 s |
| Sandblasting | 2.18 s | 0.05 s |
| Metal bending | 0.77 s | 0.06 s |
| Contacts | 0.70 s | 0.04 s |
Core Web Vitals
| Metric (PageSpeed, mobile, Lviv page) | Before | After |
|---|---|---|
| Performance | 22 | 60 |
| TBT (script blocking) | 1,710 ms | 220 ms |
| CLS (layout shift) | 0,246 | 0,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.
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.
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.
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.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.
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.
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.
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).
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.
Where to find me
Message me on Telegram or by email — I respond quickly. Telegram channel and YouTube are for those who want to see real cases before reaching out and understand my approach.