Eesti E-pood — From Wix to a Trilingual SEO + GEO Engine for a Shopify Agency
A trilingual Shopify-agency platform for the Estonian market: 84 statically prerendered pages across Estonian, Russian and English, a 22,000-particle WebGL commerce journey, and a GEO layer with llms.txt, llms-full.txt and a 13-bot AI-crawler allow-list.
- Client
- Eesti E-pood
- Industry
- E-commerce agency
- Timeline
- 2 weeks + 1-week rebuild
- Year
- 2026
- Stack
- Next.jsGSAPLenisTailwind CSSTypeScript
- Live site
- www.eestiepood.ee

Eesti E-pood builds Shopify stores for the Estonian market, and we have now built their own site twice. Phase one got them off Wix — a monthly subscription that was buying a design ceiling and a page-speed floor. Phase two, shipped this August, is the part that matters: a trilingual platform of 84 statically rendered pages in Estonian, Russian and English, built for an agency that has to win the same search results it sells to its clients. A WebGL commerce journey carries the surface; an SEO and GEO engine anchored on a single crown keyword drives it underneath. The leads it produces land in ERPFlow.ai.
The opportunity
Wix was the presenting problem. A monthly fee bought a template that could not be pushed where the brand needed to go, and every attempt to make the site faster ran into someone else's platform. Migrating off it was straightforward, and it took two weeks.
The harder problem sat underneath. An agency that sells e-commerce has to be visibly better at being found than the merchants it is pitching — a slow, generic site is a live argument against hiring you. And in Estonia, being found means being found three times over. Estonian is the working language of the local SMB market, Russian is a first language for a large share of the country, and English is how e-Residency founders arrive from everywhere else. Those are not one audience translated three ways. They are three markets with different search behaviour, different competitors and different objections.
The buyers arrive from opposite directions, too: a merchant opening a first store, a founder incorporating a company from abroad, and a merchant already stuck on WooCommerce, Magento or Wix and looking for the exit. Each of them needs a different page — and increasingly, each of them asks an assistant before they ask Google.
What we built
Phase one — off Wix, onto our own ground
The first job was ownership. We migrated the site to a Next.js application on Vercel, which ended the recurring subscription but, more importantly, ended the negotiation with a platform about what the site was allowed to be. Every page renders statically and ships complete server-rendered HTML, so the copy that sells — services, prices, delivery terms — is in the document a crawler downloads rather than assembled afterwards by JavaScript. That reads like a technical detail, and it is, but it is also the precondition for everything in phase two. You cannot build a serious search and citation engine on top of a page builder that decides your markup for you.
KASSA — a design language built from a cash register
A Shopify agency whose own site looks like a Shopify theme has lost the argument before the first scroll. So we built a design system for it — KASSA, after the Estonian word for the checkout counter — held in a deliberate tension between merchant-precise and warm-technical. Everything in it comes from the till. Panels tear off at the edge like receipt paper, prices sit in chips shaped like price tags, section markers are drawn as barcodes, and figures line up in ledger rows with dot leaders and tabular-nums so columns of euros align to the digit. The palette is receipt paper against deep pine with a Shopify-green accent. The type — Unbounded, Onest and JetBrains Mono — ships Cyrillic and Latin-extended subsets, so Russian copy and Estonian diacritics render in the brand face instead of dropping to a system font mid-sentence.
A commerce journey rendered in 22,000 particles
The homepage carries a single WebGL scene that states the business in one gesture: 22,000 particles morph from a shopping bag into a cart, into a parcel, into a growth arrow as you scroll — a store's whole lifecycle, which is exactly what the agency sells. The first fifteen percent of the particles are reserved for silhouette curves, so the shape stays legible mid-morph instead of dissolving into noise. Every bit of randomness comes from a deterministic hash rather than Math.random, so the scene is identical on every load. Scroll velocity feeds the spin, so the model reacts to how fast you are reading. GSAP writes into a mutable scene object and the render loop reads it — no React state anywhere near a frame. A capability probe runs before any of it loads: where WebGL is unavailable the layer stays a CSS gradient field, the canvas stops rendering entirely when the tab is hidden, and anyone who has asked their system for prefers-reduced-motion gets a still one.
Trilingual down to the slug
Translation is not a language switcher. Each of the thirteen routes has its own public slug in every language — the services index is /teenused in Estonian, /services in English and /uslugi in Russian, and the agency landing page is /e-kaubanduse-agentuur, /ecommerce-agency-estonia and /sozdanie-internet-magazina-estonia respectively. Estonian is authoritative and serves from the bare domain with no prefix. Automatic language detection is switched off on purpose, so Googlebot always lands on the Estonian homepage instead of being bounced elsewhere by an Accept-Language header. And on the two route families where slugs differ per article and per service, the middleware strips the framework's automatic Link header — left alone, it would tell search engines the same slug exists in all three languages when it does not.
An SEO engine with one crown keyword
The Estonian homepage <h1> is frozen. It reads "Shopify e-poe tegemine Eesti turule." and it may not change without an explicit decision, because the entire Estonian side of the site is built to own that phrase. Everything around it is engineered so the structure cannot quietly rot. The sitemap is generated from an exhaustive record of every route, which means adding a page without classifying it fails the build rather than shipping an orphan. Eighty-one URLs each carry the full four-language hreflang set including an x-default, every page states its indexing directives explicitly, and the privacy policy is the only thing in the codebase marked noindex. Ten structured-data builders all resolve to a single ProfessionalService identity, so the graph describes one business rather than a different company on every page — and that entity's knowsAbout list is written in all three languages, because that is how the questions get asked. Seven service pages sit beneath it, three of them written specifically for merchants leaving WooCommerce, Magento and Wix.
The GEO layer — written to be quoted
Search is increasingly a conversation with an assistant, and assistants quote whatever is easiest to quote accurately. So we wrote the quotes. The site publishes an llms.txt generated from the same constants that render the pages — the full twenty-one-service catalogue with SKU codes and price anchors, contact details, booking link, and every key page in all three languages — alongside an llms-full.txt carrying the complete text of all thirty articles, roughly twenty-four thousand words, in a single fetch. It closes with a notes-for-assistants block that asks for attribution by name and corrects one specific piece of outdated advice models still repeat: Shopify Payments is available in Estonia, whatever older articles claim. Thirteen crawlers are named and allowed explicitly — GPTBot, Google-Extended, PerplexityBot, ClaudeBot, Applebot, Meta-ExternalAgent, YandexBot and the rest. The library behind all of it is thirty articles: ten topics written natively in Estonian, Russian and English and cross-linked by translation key, not machine-translated from one original.
Lead capture and booking on ERPFlow.ai
An agency site's real output is a qualified lead, so we wired the last mile straight into ERPFlow.ai, our own platform. The quote form posts server-side into ERPFlow's lead-capture API, and a booking page there replaced Calendly outright — which means an enquiry lands in the same system that will later issue the quote and the invoice, with no export step and no second inbox. Validation is one framework-free contract imported by both the browser and the server, so field caps and enums cannot drift apart between them. Cloudflare Turnstile is verified server-side and fails closed, because spam protection beats availability on a form like this. And if credentials ever go missing, the form says so and points at the booking page and the phone number rather than swallowing a lead in silence. ERPFlow's own story is a case study of its own.
The result
Eesti E-pood came off Wix in two weeks, and got the platform in a rebuild a few months later: eighty-four statically rendered pages across three languages, a design system built from a cash register, a commerce journey drawn in twenty-two thousand particles, and a search-and-citation layer that treats being quoted by an assistant as a first-class outcome rather than a side effect. It is the site an e-commerce agency has to have — the proof, not the brochure.