2026

ALU-GUM - an OEM Wheel Store Across Five Markets, from a GDPR Audit to Google Ads

We took over a wheel store that collected data without user consent and took over ten seconds to load. We replaced the foundation instead of patching it: a custom consent mechanism, a new store with no page builder, sales rules written into the code, five markets, four currencies, BaseLinker and Google integrations, an in-house shopping assistant and campaigns measured against revenue.

ALU-GUM Sławomir Wizner
Automotive - wheels and tyres, multichannel sales
Two months
ALU-GUM - OEM wheel store

A store that collected data without consent

ALU-GUM is a family business from Sulmierzyce, trading since 2007. Around six thousand wheels in stock: genuine OE rims for Renault, Dacia, the PSA group, Volkswagen, BMW and Jaguar, steel wheels, tyres and complete wheel sets. A real warehouse, real customers, sales running through several channels at once.

And an online store that could not carry any of it. Built on Elementor, loaded with plugins, with a cookie consent banner that was pure decoration. Google Analytics fired regardless, before anyone clicked "accept".

509 KB
Homepage HTML alone, before images and scripts

12.9 s
Time to main content on mobile

1357
Elementor occurrences in the code of a single page

0
Actual blocking of analytics until consent

The audit: most urgent first

We started with a live review of the public code, sitemaps, legal pages and structured data. Not with a visual design, but with the question of what could hit the company as soon as tomorrow.

Cookie consent was a facade

The Google Analytics script loaded as an ordinary executable tag, with no blocking and no Consent Mode. Data was collected before the user consented. That is a real GDPR risk, and since 2024 the absence of Consent Mode v2 also cuts off remarketing and conversion measurement in Google Ads.

The rest of the list was just as concrete. The cookie policy was a template, with no cookie names and no lifetimes. The accessibility statement existed as an empty URL, with no date, no conformance level and no contact. Next to the returns form sat the word "DOWNLOAD", except with no link behind it, as plain text.

On top of that came a layer invisible to the customer but expensive for the store: three H1 headings per page, homepage structured data describing the store as a blog article, products without a brand and without a manufacturer part number, which pushed the wheels down in Google Shopping, and collected customer reviews that were never wired into search engine data.

Before

Analytics started before cookie consent

Accessibility statement: an empty page

Returns form: a "DOWNLOAD" label with no file

Three H1 headings on a single page

Homepage described in structured data as an article

Products without a brand or manufacturer part number

One language, one currency

Elementor and 31 stylesheets

After

Custom consent mechanism, analytics starts only after acceptance

Accessibility statement and cookie policy with a cookie table

Interactive returns form with a privacy notice and a consent checkbox

One H1 per page, keyboard navigation, skip link

Store described as an auto parts store, products with brand and part number

Brand and manufacturer part number filled in on nearly three thousand items

Five languages and four currencies

Custom theme, two stylesheets

The decision: no patching, a new foundation

The client received two quotes. The first covered removing the legal risk and nothing more. The second, the one they chose, meant throwing out Elementor and building the store from scratch while keeping the catalogue and the orders. We did not migrate data, we replaced the entire presentation and logic layer around it.

1

Audit and concept

A review of the actual state, then a clickable visual concept covering ten screens as a standalone HTML file. The client signed off on the look before the first line of production code existed

2

Consent and measurement layer

A custom consent mechanism with Consent Mode v2 instead of a third-party plugin. A tag container and a full e-commerce data layer

3

A theme from zero

A classic PHP theme with Tailwind compiled to a static file. No page builder. Homepage, filtered listing, product page with a configurator, cart, checkout and customer account

4

Business rules in code

Selling in sets, wheel add-ons, a carrier and payment matrix. What used to live in the owner's head became a rule the store enforces on its own

5

Migration to new hosting

Moving the store off the old provider, repointing the domain, mail and certificates, with no break in sales

6

Expansion and automation

Five languages, four currencies, cross-border sales rules, a product feed in Google, a shopping assistant and ad campaigns

Cookie consent done honestly

We threw out the third-party consent plugin and wrote our own. The reason is mundane: in Consent Mode v2 the order matters in which things reach the page head. A plugin that does it its own way can break measurement despite a correct-looking banner.

  • Denied by default for analytics and marketing, set before anything loads
  • The remembered user choice read before the tag container starts
  • Stripping tracking parameters from the URL so they do not pollute statistics and search results
  • Categories: necessary, statistics, marketing, with the option to change the decision from the footer
  • Without consent the data goes out anonymised, after consent in full, and that is the difference between legal and illegal measurement

The e-commerce data layer was built on that foundation: product view, add to cart, checkout start and purchase together with the amount, currency and order number. One source for analytics, ads and any future marketing integrations.

Forms that actually work

The "DOWNLOAD" label with no file was replaced by an interactive returns form. The customer fills it in online, ticks the required data processing consent and sees the privacy notice, and the request is emailed to the store and to the customer. No printing, scanning and posting back.

A contact form was built the same way, with a separate optional marketing consent, a bot trap and a submission limit per minute. Consents also appeared at account registration: accepting the terms and the privacy policy is required, marketing stays optional, and the decision is saved on the customer account.

A new store instead of Elementor

The theme was built from scratch, on tokens taken from the approved concept. The numbers show it, because removing the page builder stripped around 470 kilobytes of raw HTML off the page, before styles and scripts are even counted.

97
Performance score, previously impossible to measure

2.6 s
Main content on mobile, down from 12.9 s

38 KB
Homepage HTML, down from 509 KB

0
Layout shifts during loading

Accessibility went up from eighty-eight to ninety-five points. One H1 per page, a link to skip navigation, correct contrast, keyboard support, closing the menu with Escape. This is not cosmetics, it is a requirement of the European Accessibility Act, which has applied to online stores since June 2025.

A product page that sells the set

Wheels are sold in sets and the store finally knows it. The product page has a configurator: the customer picks the number of items, adds tyres, pressure sensors and fitting, and the total recalculates live. The owner's business rule was written into the code, including recognising when an offer covers a single item and when it covers a full set.

  • A search that understands queries like "clio 17" or "5x114.3" and turns them into filters
  • Selection by specification: diameter, width, bolt pattern, centre bore and offset
  • A condition filter separating new wheels from used ones, built on data from the whole catalogue
  • Real product reviews visible on the homepage and in search engine data
  • Statistics calculated from the database, not hardcoded into the template

Delivery and payment without calling the customer

The rules for shipping wheels used to be tribal knowledge. We turned them into an automation that does not let an impossible order through.

  • Wheels ship by courier only, the parcel locker option disappears on its own
  • Small items can go both by courier and to a parcel locker
  • Cash on delivery is unavailable for parcel lockers, prepayment remains
  • Cross-border shipping goes with international couriers only, with a minimum cost threshold
  • Outside Poland cash on delivery is not offered at all

Five languages and four currencies

The store was meant to go beyond Poland, so it got five language versions: Polish, German, Czech, Slovak and Romanian, each in its own URL directory. We translated not only the interface but the catalogue: over three thousand products times four languages is around fifteen thousand product entries, plus menus, categories, pages and the full set of legal content.

The hardest part was the part you cannot see

Once multilingual support was switched on, the filters stopped working on the foreign versions. There were two causes and both sat deep: the translation plugin also covered the technical wheel attributes, which meant the database query could not return anything sensible, and the translated products never made it into the table WooCommerce reads prices and stock from. Fixing both layers restored the filters, the technical data and the related products in every language.

On top of that came four currencies: zloty, euro, Czech koruna and Romanian leu, with rates pulled automatically from the National Bank of Poland. The currency follows the language, and the customer can change it manually with the choice remembered.

Cross-border sales with its own rules

Shipping wheels abroad costs more and the client set clear conditions. Prices for foreign markets get a fixed percentage markup, applied before the currency is converted, so the order of operations does not distort the amount. Shipping outside Poland goes only with selected international couriers, with a minimum amount converted into the customer's currency. All thresholds are set from the store admin panel, without touching the code.

One source of truth for every channel

ALU-GUM does not sell on its own site alone. Stock and prices for the whole catalogue live in BaseLinker, which feeds two Allegro accounts, Erli and the online store. Our job was to make that loop consistent and to make the data fit the channels that demand it.

  • Filling in the manufacturer and the manufacturer part number on nearly three thousand items, because without them marketplaces and Google Shopping treat the offer worse
  • Automatically assigning the part number as the product identifier on the store side, which BaseLinker does not do by itself
  • Automatic category classification based on the wheel manufacturer data
  • A product feed sent to Google Merchant Center, over three thousand offers, with images and labels for bid control
  • Prices in the Google feed always in the domestic version, no matter which currency the visitor sees
A lesson worth knowing

After multilingual support was enabled, the store API began returning products from every language at once. The automation sending the feed to Google duplicated offers several times over, which ended in thousands of rejected items. We found the cause, cleaned up the duplicates and rebuilt the automation so that it filters by language and stops when the data looks suspicious. Any program reading data from a multilingual store has to state the language explicitly.

Felek, a shopping assistant with no subscription

The client saw a chat run by a rented service at a competitor and wanted the same. We costed it out and proposed something else: an in-house assistant, with no language model and no subscription fees.

Felek recognises the intent behind a question, copes with typos and inflection, understands questions in five languages and searches the store catalogue. Asked about a tyre size it recognises one with a regular expression, asked about a "golf" or a "passat" it reduces the name to a car model. It answers questions about delivery, returns, payments, sets, availability, cross-border sales and wholesale, and takes the data straight from the store settings, so it cannot drift away from reality.

It learns without machine learning

Questions Felek could not answer land in the admin panel together with a repeat counter. The owner sees what customers ask most often and adds an answer with one button. That turns the chat into a tool for researching customer needs, not just an answering machine.

Advertising that knows what sells

Google Ads campaigns came last. We did not touch them until the store could measure sales down to the zloty, because without that advertising is spending you know nothing about.

  • Three campaigns: search by car brand, shopping fed by the product feed, and brand defence
  • Twenty ad groups, one per car brand, plus selection by bolt pattern and used wheels
  • Five hundred and four keywords in match types that limit accidental traffic
  • Seventy-four negatives from day one, among them repair, straightening, buy-back and rental
  • The feed split into fifteen segments with separate bids, from the most expensive premium brands down to accessories
  • Purchase tracking passing the amount, currency and order number, so the report shows revenue, not a click count

We deliberately started with bidding for clicks with a bid cap rather than with an automated conversion strategy. Automation needs sales history and the account had none. We also switched off the campaign the Google wizard creates by itself, along with display and partner network expansion, because at the start they obscure the reading of what actually works.

An outage that taught us something

At the end of August the store stopped responding for nearly a full day. The cause was a configuration workaround inherited from the migration, which the hosting provider eventually killed off. Ad-hoc restarts stopped helping, so instead of reviving the workaround we moved the store to the current, system PHP version, and documented the whole diagnosis and recovery procedure.

A week later it turned out the outage had left a mark elsewhere. Orders stopped reaching BaseLinker even though stock levels were syncing normally. Log analysis showed that after a run of failed requests during the outage BaseLinker had suspended order fetching on its own and never resumed it once the store came back. The store had been working correctly the whole time. That went into the documentation as a standing procedure for any extended downtime.

Technology

WordPress
WooCommerce
PHP 8.5
MariaDB
Tailwind CSS 4
Classic theme, no page builder
REST API
Polylang Pro
Multicurrency with NBP rates
BaseLinker
Przelewy24
Google Tag Manager
GA4 with Consent Mode v2
Google Merchant Center
Google Ads
Schema.org JSON-LD
Docker
PHPUnit

Results

GDPR compliance instead of a facade
Analytics and marketing start only after acceptance, in the model Google has required since 2024

A site faster by an order of magnitude
Main content in 2.6 seconds instead of 12.9, HTML thirteen times smaller, zero layout shifts

Five markets instead of one
Poland, Germany, Czechia, Slovakia and Romania, each with its own currency, prices and shipping rules

Sales rules enforced by the store
Sets, add-ons, carrier selection and payment availability work automatically, with no call to the customer

A catalogue consistent across every channel
The store, two Allegro accounts, Erli and Google Merchant Center all fed from one source

Customer service without a subscription
An in-house assistant in five languages, with no per-query fee and no data sent outside

Advertising measured against revenue
Campaigns with order value tracking, negatives and bids split by car brand

A project handed over with documentation
One document of seventy-odd pages: architecture, procedures, known limitations and the full set of credentials

What this project teaches

The store was not broken because someone lacked the will. It was broken because every new element was stacked on the previous one until the whole thing stopped holding together: a page builder on a plugin, a plugin on a plugin, cookie consent as an image to dismiss. Fixing it meant reversing the order: the legal and measurement foundation first, then a fast presentation layer, and only at the end expansion and advertising.

That order is why every further stage could be added without rebuilding the previous one. Multilingual support went on top of a finished theme. Currencies went on top of multilingual support. Cross-border sales went on top of currencies. Advertising went on top of measurement that had been standing since the first week of the project.

Project by KamikStudio • 2026

Have a similar project?

Tell us about your needs. We will prepare a quote and a delivery timeline.