dotCREA
TREN

Metal Maket: migrating a 4,357-product catalogue from bespoke software to RGS, with a custom theme

Metal Maket is a die-cast model vehicle shop run by the same family since 1954. The store moved from the bespoke ecommerce software it had used for years to the RGS Ecommerce platform. The work had two halves: transferring the catalogue, customers and images out of a 50 MB database dump; then writing a storefront from scratch that works along the scale, brand and manufacturer axes a collector actually searches on.

ClientMetal Maket · metalmaket.com
SectorDie-cast model vehicle collecting — since 1954
PlatformRGS Ecommerce — migration over the Admin API and a theme from scratch
Year2026
ScopeCatalogue migration, Customer transfer, Theme development, Filter and search design
4,357
Products migrated
478
Categories, in parent order
1,780
Product images
844
Customers, with 227 address records
1,442
Products matched to a brand

What we inherited

  • The source system was undocumented bespoke ecommerce software; all we had was a 50 MB database dump, with no database server running in the environment.
  • Some product descriptions had been copied in from elsewhere, leaving fragments of interface markup inside the text.
  • Because the category tree branched every manufacturer by scale, it had swollen to 478 categories and navigation had become unreadable.
  • Collectors search at the intersection of brand, scale and model manufacturer; in the source system those three axes were jumbled inside a single text field.

Our goal

  • Move the catalogue, customer records and images without losses, in a way that can be re-run.
  • Extract scale and manufacturer from free text into filterable fields.
  • Build navigation around how a collector searches rather than around the number of categories.
  • Bring the copy on the information pages in line with the store's real business rules.
Metal Maket home page, desktop view
Home page — advanced search card and storefront

Reading the dump and cleaning the content

  • The 50 MB dump was read as a stream without installing a database server; the file was never loaded into memory whole.
  • Foreign interface markup, empty blocks and character entities were cleared out of product descriptions while the real text was preserved.
  • A separate URL transliteration was written for Turkish characters; prices were converted to minor units and phone numbers to a single format.
  • The URLs of 89 groups of sibling categories sharing a name were rescued from collision by qualifying them with the parent category name.

A migration that survives interruption

  • The migration was split into phases: categories, customers, products, stock, images. Each phase can be run on its own.
  • Every record created was written to a state file with its source ID; when a run is stopped it resumes where it left off and skips what already exists.
  • The platform's per-minute request budget was not guessed at: the remaining budget in the response header was read and the pace adapted to it.
  • Timeouts and retries with increasing back-off were set up for dropped connections; long runs no longer hang.
  • Images were downloaded in parallel to disk in a separate step; all 1,780 files were uploaded in full and linked to their products.
Product showcase and manufacturer rail on the home page
Showcase — manufacturer rail and new arrivals

The three axes a collector searches on

  • Scale existed only in free text (in the product name prefix, the model code or the tags); it was extracted with rules and turned into a filterable field.
  • The model manufacturer was derived from the root of the category tree the product was imported under.
  • Vehicle brand was deliberately not made a custom field; the platform's own brand field was used, so brand pages and clean URLs came for free.
  • For records with no brand in the dump, the brand was recovered from the product name and tags; 1,442 products in total were linked to their brand.

Simplifying the category tree

  • Because scale is now handled by a filter, the scale branches in the category tree became redundant.
  • Products sitting in those branches were moved to the nearest manufacturer category, and 291 scale categories were removed from the storefront.
  • Because the platform has no category delete endpoint, removal was done by deactivating the category; no data was lost.
Solido category page with the filter sidebar
Category — searchable filters and the product grid

Storefront: search and filtering

  • The home page was built with an advanced search card, a left category rail, featured models and a new-arrivals section.
  • Sub-category chips, a sort bar and a filter sidebar were added to the category page.
  • Because the platform's native brand filter shows the first fifty alphabetically and does not narrow by category, a category-specific brand list is generated from the catalogue data and fed to the filter.
  • A client-side search box that handles Turkish characters correctly was added to the long filter lists.
  • Links in the menu and filters are generated from real catalogue data rather than written by hand: only options that return results are rendered, so there are no dead ends.

Working around the platform's constraints

  • Because vector file upload and embedded image URLs are unsupported, icons were rasterised, uploaded once and cached.
  • Because the custom HTML field accepts neither forms nor scripts, the advanced search was built with radio inputs and pure CSS; reachable combinations are rendered as pre-computed links.
  • Because the theme has no script channel, client-side behaviour is loaded from the platform's custom code area.
  • Character limits on the global stylesheet and custom HTML are checked at build time, removing the risk of silent truncation.
  • Warnings the platform returns inside 2xx responses were surfaced, so dropped blocks and fields no longer disappear quietly.
Die-cast model product page with gallery and purchase area
Product page — gallery, brand link and purchase area

Design and accessibility

  • A warm copper-toned palette was built; cards, corner radii and shadows were defined through a single design system.
  • The copper tone fell below the accessibility threshold against white text; the fill tone was darkened to clear the threshold while the accent tone was kept as it was.
  • The theme installs and updates with a single command; fixed block IDs mean re-running updates in place rather than creating duplicates.

Fixing the information pages with the real copy

  • The sample copy created during setup contradicted the real business rules; the page said cash on delivery was accepted, for instance, when it is not.
  • The payment, delivery, about and contact pages were replaced with the store's own published copy, and the source of each text was recorded.
  • Because page bodies were rendered as plain text, the formatting was converted into heading, list and paragraph structure; the sentences themselves were untouched.

Result

A 4,357-product catalogue moved to the new platform along with its customer records and images; because scale and manufacturer were lifted out of free text into filters, collectors can reach the model they want at the intersection of brand, scale and manufacturer. The category tree came down from 478 nodes to something you can actually browse, and theme and catalogue data can be regenerated with a single command.

Process
Phase 1
Parsing the dump, cleaning the content and deriving the data model
Phase 2
Migrating categories, customers, products, stock and images
Phase 3
Building the scale, manufacturer and brand axes, and simplifying the category tree
Phase 4
Theme, search and filter work
Phase 5
Fixing the information pages and launch
Technical stack
RGS Ecommerce Admin APIPythonMigration from bespoke softwareStreaming SQL dump parsingTheme data fed by code generationCSS-based filter interfaceAccessibility contrast checking