---
title: "Malacca Tables: a homeware shop AI search can read · Polargate"
description: "A premium tableware and home linen brand in Madrid moved off WordPress and WooCommerce onto a custom store. Polargate migrated 24 products and 93 variants without…"
url: https://polargate.ai/work/malacca-tables
locale: en
publisher: POLARGATE S.L.
---
Premium tableware and home linen, direct to consumer retail

# A homeware shop rebuilt so AI search can read the catalogue

A premium tableware and home linen brand in Madrid moved off WordPress and WooCommerce onto a custom store. Polargate migrated 24 products and 93 variants without admin access, and turned 65 pages that served AI crawlers nothing into pages that carry the full catalogue in plain HTML.
[Visit the live site](https://malacca.es)

malacca.es

In short
Polargate rebuilt a premium tableware brand's WooCommerce shop as a custom store on Vite, React, Supabase and Vercel. The full catalogue, 24 products and 93 variants, was migrated through the public Store API and verified piece by piece. Before the rebuild all 65 URLs served zero body text to AI crawlers; they now serve 105,212 characters of readable HTML, refreshed daily.
105,212
characters of body text readable by AI crawlers across 65 URLs, up from zero

65
routes pregenerated at build time with their own metadata and JSON-LD

24
products migrated, across 19 series and 9 categories

93
product variants verified one by one against the old catalogue

137
catalogue images regenerated as WebP at three widths

92
references in the live product feed for Google Merchant Center and Meta

## The problem

The brand had been selling online for two years through a WordPress and WooCommerce shop and getting almost nothing back from it. Nobody could get into the WordPress admin any more. Shipping was quoted as a flat promise the real carrier tariffs did not support, strike-through prices had no genuine previous price behind them, and several claims about the product and the checkout could not be backed up. The worst part was invisible: all 65 URLs returned zero characters of body text to GPTBot, ClaudeBot, PerplexityBot and OAI-SearchBot, so to an AI assistant the shop had no products at all.

## What we built

Polargate rebuilt the shop on its own stack instead of another plugin ecosystem: Vite, React and TypeScript with Tailwind and shadcn/ui, Supabase for Postgres, Storage, Auth and Deno edge functions, and Vercel for hosting. We read the old catalogue out through the public WooCommerce Store API and verified it piece by piece: 24 products, 93 variants, 19 series, 9 categories and 137 images rebuilt as WebP at three widths. All 65 routes are pregenerated at build time with their own metadata and JSON-LD, and three build guards fail the build if any route drops below 400 characters of text.

## The outcome

The catalogue is now readable by search engines and AI assistants alike: 105,212 characters of body text across 65 URLs, up from zero, refreshed every morning by a GitHub Actions cron that triggers a Vercel deploy hook. A product feed with 92 references is live for Google Merchant Center, Meta and Pinterest, and a 64 page sitemap is accepted in Search Console. Card payments were verified with a real charge before opening. The shop has not traded long enough to report sales, and Polargate does not publish numbers it cannot attribute.

Stack

- Vite
- React
- TypeScript
- Tailwind CSS
- shadcn/ui
- React Router
- TanStack Query
- Supabase
- PostgreSQL
- Deno
- Vercel
- GitHub Actions
- Node.js
- Resend
- Search Console
- Meta Ads
[malacca.es](https://malacca.es)

## What we found

The brand had been selling online for two years through a WordPress and WooCommerce shop and getting almost nothing back from it. Nobody could get into the WordPress admin any more, so we read the catalogue out through the public WooCommerce Store API and rebuilt it piece by piece: 24 products, 93 variants, 19 series, 9 categories and 137 images.
The audit turned up problems that had nothing to do with looks. Shipping was quoted as a flat promise the real carrier tariffs did not support. Strike-through prices had no genuine previous price behind them. Some claims about the product and the payment gateway could not be backed up, so they came out.
Then the finding that changed the order of work. On 4 August 2026 we fetched every URL the way GPTBot, ClaudeBot, PerplexityBot and OAI-SearchBot see it. All 65 pages returned zero characters of body text. The shop only existed after JavaScript ran, so to an AI assistant the catalogue was empty.

## What we built

We rebuilt the store on our own stack rather than another plugin ecosystem: Vite, React and TypeScript with Tailwind and shadcn/ui, TanStack Query for data, Supabase for Postgres, Storage, Auth and Deno edge functions, and Vercel for hosting. Row level security is enabled and forced on all 25 tables, and prices are re-read on the server before anything is charged.

- All 65 routes are pregenerated at build time, each with its own title, description, canonical, Open Graph tags and JSON-LD. Three build guards fail the build if a route drops below 400 characters, so readability cannot quietly regress.
- The migrated images were regenerated as WebP at three widths. The second photo batch alone went from 80.0 MB of PNG to 11.3 MB, 85.9 percent less.
- Shipping is calculated in Postgres by weight and zone, and the same function answers both the browser estimate and the server that creates the order.
- Card payments run through the client's own bank virtual terminal over the CECA protocol, with the amount re-read server-side, the signature verified and repeat notifications made idempotent.
- The brand's own team runs the shop from an admin panel for orders, products, prices, stock, series and shipping.

## How it runs now

The catalogue serves 105,212 characters of readable HTML across 65 URLs, and a GitHub Actions cron triggers a Vercel deploy hook every morning so the prerendered pages follow stock and price changes. A product feed with 92 references is regenerated on each build for Google Merchant Center, Meta and Pinterest. A 64 page sitemap is accepted in Search Console, and the old WooCommerce sitemap, which had been returning errors, is gone. Order confirmations leave from the client's own subdomain.
Five multi-agent audit passes ran before launch, every finding verified adversarially, and more than 70 were fixed. Several of them cost real money: a scene selling black pieces while showing blue ones, an order charging 99 units, a cart duplicating quantities, and a VAT error on the preparation fee worth about 80 euros per 100 orders.

[Build →](https://polargate.ai/services/build) · [Grow →](https://polargate.ai/services/grow) · [Care →](https://polargate.ai/services/care) · [Retail and ecommerce →](https://polargate.ai/for/retail)

FAQ

## Questions about this project

How long does a WooCommerce migration like this take? This rebuild ran from the end of July 2026 to the domain switch on 27 August 2026. The store was live on a preview domain within the first week; the rest of the time went on shipping rules, payments, photography and five audit passes. Polargate starts this kind of project with a paid, fixed-price Discovery Sprint, so the scope and the schedule are agreed before any code is written.
Can you migrate our catalogue if we have lost access to the WordPress admin? Usually yes. We rebuilt this catalogue without logging into WordPress once, by reading products, variants, prices and images out of the public WooCommerce Store API and checking every record against the live shop. 24 products, 93 variants, 19 series, 9 categories and 137 images came across that way. If a shop hides that API, the fallback is a crawl of the public pages plus a manual reconciliation.
Why does my shop show up in Google but not in ChatGPT or Perplexity? Most often because the pages only exist after JavaScript runs. Google renders JavaScript; most AI crawlers do not. This shop was indexed in Google while returning zero characters of body text to GPTBot, ClaudeBot, PerplexityBot and OAI-SearchBot on all 65 URLs. The fix is real HTML generated at build time for every route, plus a guard in the build so the text cannot disappear again unnoticed.
Can you connect the shop to our own bank instead of Stripe? Yes. This store charges through the client's own bank virtual terminal over the Spanish CECA protocol, not Stripe or Redsys. The amount is re-read from the order on the server, the signature is verified, repeat notifications are idempotent, and the acknowledgement back to the bank measured between 268 and 710 milliseconds in production against a 25 second limit. The payment layer is abstracted, so Redsys or Stripe can sit behind the same interface.
Will we be able to update products and stock ourselves afterwards? Yes. The team manages orders, products, prices, stock, series, shipping rules and messages from an admin panel, and stock can also be synchronised from the logistics warehouse file: the first run corrected 49 references. The prerendered pages refresh every morning through a scheduled job, so catalogue edits reach search engines and AI crawlers without anyone triggering a deploy by hand.

INITIATE

## Start the engine

Tell us what you are building in a few short questions. A senior engineer answers in writing within 48 business hours, with a first take on scope, timeline and price.
[Start your project](https://polargate.ai/start) · [Talk to us](https://polargate.ai/start#static-brief-heading)
