Article · · 6 min read

From a warehouse program to three sales channels: 85 SKU, 53 models

How a small shop's stock in UkrSklad became product cards on Horoshop, Rozetka and Facebook: reading a Firebird database safely, recovering variants from names, and AI descriptions approved in Telegram.

A fishing-tackle shop keeps its stock in UkrSklad, a desktop program with a Firebird database. It wanted the same products on its Horoshop site, on Rozetka and in the Facebook catalogue, each with a proper description. The data existed; it just was not in a shape any channel could use.

Never touch the live database

The first rule was safety. The pipeline reads a copy of the UkrSklad database, never the live file, and dumps it to JSON: 85 SKU. If anything goes wrong downstream, the shop's accounting is untouched.

Variants hide in the names

The warehouse stores every size and colour as a separate product. A store wants a parent model with variants. The only place the relationship exists is the product name, so a name parser groups SKUs into parent models and their variants. Out of 85 SKU it found 53 models with 81 variants linked to their parents.

AI writes, a person approves

Each parent model needs a description, and nobody has time to write 53 of them. Gemini 2.5 writes one per model, about 22 a day within the free quota; when the quota runs out, the queue simply continues the next day. Every text goes to a Telegram bot first, where the owner taps /approve, /reject or /regen. Nothing reaches a store without a person seeing it.

One source, three renderers

Approved data is upserted into SQLite, and photos are matched to product codes. Then separate renderers build XML for Horoshop, Rozetka and the Facebook catalogue. Adding a fourth channel means writing one more renderer, not touching the rest.

  • 53 models found in 85 SKU
  • 81 variants linked to their parents
  • 3 channels from one source
  • ~22 AI descriptions a day, each approved by a person

What I would do the same way again

Read a copy, keep one internal format, and put a human approval step in front of anything an AI writes for customers. The daily quota sets the pace, and that turned out to be fine: a small catalogue does not need to be rewritten in an hour.

The project behind this article: fish-sync →

Have a similar problem?

Tell me what you are building and what data you have. I reply with how I would approach it.

Discuss a project →