← All work SMART STORE nnj.moscow ↗ · t.me/nnjmarket ↗ ←02 / 07→RU

Prices and stock
update themselves

An electronics web store built from scratch that never needs updating by hand. The supplier posts a price list in their Telegram channel — the program carries its prices and stock into the store’s channel, already with our markup and our wording. From the store’s channel everything flows to the website: with photos, product cards and a cart. From there the order runs itself: confirmation, a sales receipt, a courier window and a request for a review.

NNJ.Moscow home page: the new iPhone 18 Pro from 125,500 ₽ and the category catalogue

The store’s home page · a live site you can open and check

For whom

My electronics store in Moscow: a Telegram channel and a website

What was done

The supplier’s price list becomes a storefront with markup by itself, an order reaches the customer with a receipt, prices are checked against four competitors

Result

2,100+ products with no manual edits, orders with a receipt and a review, customers arrive from search and ChatGPT

Film · 36 seconds, no sound, in Russian · from the supplier’s price list to the sales receipt

A storefront
that was always
behind

Prices and stock used to be changed by hand. The supplier sent a price list, a person retyped the lines, added the markup, updated the channel post and the product cards. Supplier prices change often, and every delay cost money.

If the storefront price is below cost, you sold at a loss. If the item is gone but still on the site, the customer is unhappy — and trust is easier to lose than a price is to fix.

Three steps
from price list to storefront

Prices travel from the supplier’s channel to ours, and from there to the website. No person is needed at any step.

01Supplier’s channelthe price list as plain text
→
02Store’s channelour markup, our wording
→
03Websitephotos, product cards, cart
01

Supplier’s channel

The supplier runs a Telegram channel and posts the price list there as plain text: models, colours, storage, prices, what is in stock. The program follows that channel and reads every new post and every edit.

02

Store’s channel

The program rebuilds the same price list and publishes it in the store’s channel — with its own markup on every item, its own wording and layout, nothing extra. Subscribers see current prices and stock a few minutes after the supplier does.

03

Website

From the store’s channel the products flow to the website: each gets photos in the right colour, storage variants are gathered into one card, and search, comparison and a cart appear. Price and stock on the site and in the channel are always identical — it is one and the same price list.

The iPhone 17 Pro section on the site: 51 offers, filters by model, storage, colour, SIM, country and condition

The iPhone 17 Pro section on the site · 51 offers from the price list, filters by storage, colour, SIM, country and condition

What makes it hard

The supplier’s price list is written for people, not software. Out of it you have to build a tidy store where every product has a colour, storage size, photo and correct price.

01

The price list is written for people

The supplier publishes prices as an ordinary Telegram post: headings, notes, a price written as “89.990” one day and “89 990 ₽” the next, colour and storage on the same line. The program tells a product from a heading, extracts model, storage, colour and SIM type, and gathers lines about one product into one card.

02

Every product has its own markup

The markup is set per product and added to the price in any format — “89.990”, “1.299.990”, “— 12 000”. Years, part numbers and “20000 mAh” are left alone. Change a markup and the whole catalogue is recalculated in about a minute.

03

Out of stock does not mean deleted

When a line disappears from the price list, the product is marked “out of stock” and stays: a customer may have its page open or find it through search. A changed price is an update, not a new product. A product with no photo never reaches the storefront, and every colour has its own shots: the program will not substitute a different colour.

A site from scratch:
from the design
to the cart

The store used to have only a Telegram channel with prices as text. There was no website: I designed it, built the catalogue with search, and made the cart and checkout.

The storefront is built from the same price list, so the site and the channel always show the same prices and stock.

01 A design made for this store Its own design: a white background, the brand red, large section and product cards. The home page looks like a storefront, not a price table.
02 Catalogue and search Sections and subsections by product type: iPhone by generation, Apple Watch by series. On a phone the menu opens as folders, and search finds a product by name or model.
03 Cart and checkout The cart lives in the customer’s browser, but prices always come from the server — they cannot be tampered with. If an item vanishes from the price list, the cart marks it unavailable. The finished order goes to the managers on Telegram and runs itself from there — more on that below.
04 For a shopper still deciding Favourites with a “price dropped by…” note, comparison of up to four products with a “differences only” toggle, and a “notify me of a price drop” form that lands in the managers’ chat.
05 Promises that can be checked The 5.0 rating on Yandex Maps is read every morning and shown on the site next to customers’ own words. Every product carries “Found it cheaper? We’ll lower the price”, every phone comes with a free screen protector, and a friend who buys earns you 1,000 ₽: at checkout the site asks who recommended the store.
06 Everything a store needs Pages for delivery, warranty, the service centre, the offer and the privacy policy, plus a sitemap and page descriptions for search engines.
The iPhone 17 Pro 512 GB Blue card on the site: gallery, price 118,390 ₽, colour dots, storage and SIM buttons, an “Add to cart” button and the store’s promises

A product card · colour, storage and SIM as buttons, photos for the chosen colour, the store’s promises as a list

Choose by eye,
not by scanning lines

In the Telegram channel the price list is a long text like “iPhone 17 Pro 256 Black — 119 900”. To picture the colour you need to know the model; to compare two you scroll the post. On the site the shopper sees the product itself.

Next step

A Telegram mini app

The plan is to attach this same site to the channel as a mini app: a button under the post takes the shopper into the same storefront with photos and cart without leaving the messenger. Still on the roadmap.

01 The colour is seen at once Photos swipe in a gallery, and colour is picked with a colour dot — the shots change with it. Generation, storage and SIM type are buttons right on the card.
02 All variants in one place Colour, storage and SIM type are gathered into one card instead of being scattered across twenty price-list lines.
03 Found in a second A category or a search instead of scrolling a long post down to the right line.
04 Same price and stock as the channel Both come from one price list, so site and channel never disagree.
05 Order right away Add to cart and check out — no back-and-forth about “which colours do you have” and “how much is delivery”.
A post in the store’s channel
The “iPhone 17 Pro” post in the store’s channel: the section cover and price-list lines with prices
→
The same product on the site
The iPhone 17 Pro 512 GB card on a phone: photos, price 118,390 ₽, colour dots, storage and SIM buttons

The store’s channel and the site · one price list, one price

An order sees itself
to the door

An order from the site used to be just a message to a manager. Now it has a path: confirmation, a sales receipt, a courier window and a review. A person presses buttons; the program does the rest.

01 · WebsiteThe customer checks outcourier day and window, payment method, who recommended the store
→
02 · To the managersThe order on Telegram, with buttonsConfirmed · Delivered · Cancelled
→
03 · To the customerThe order and the sales receiptfrom the store’s own account; replying “yes” confirms
→
04 · Two hours after deliveryA request for a reviewa link to the store on Yandex Maps

Sales receipt

A document you are not ashamed to hand over with a phone worth a hundred thousand

Receipts used to be written by hand. Now every order gets a PDF in the store’s look: the number carries on from the old series, the date is the day the courier brought the order, every product carries its warranty, the total is spelled out in words, with the manager’s signature, the warranty terms and a QR code to the reviews. The receipt goes to the customer on Telegram with the order, and the admin can download it at any time.

Open the PDF →
Sales receipt No. 352: seller, buyer, order, two product lines and delivery, total 126,890 ₽, 12-month warranty, a QR code to the reviews, the manager’s signature

The store’s real receipt · buyer, order and signature are samples

Store · orders14:07
Bring: iPhone 17 Pro 256GB Deep Blue
+ add a screen protector
Tomorrow, 15:00–18:00 · Moscow, 3rd floor
+7 ··· ··· 12-34 · Anna
119,900 ₽ + delivery from 1,000 ₽ · card by QR
ConfirmedDeliveredCancelled
Store → customer14:08 · typing…
Hello Anna! Your order: iPhone 17 Pro 256GB Deep Blue — 119,900 ₽. The courier comes tomorrow between 15:00 and 18:00.
📄 Sales receipt No. 352.pdf
If everything is right, reply “yes”.
Anna: yes

Sample messages

01 A sales receipt for every order A PDF in the store’s look: the number carries on from the paper receipts, the date is the delivery day, a 12-month warranty, the manager’s signature and a QR code to the reviews. The same receipt is what a return needs — the store issues no separate waybill.
02 Writes from the store’s account A bot cannot message a person first; the store’s account can. A separate program sends the order and the receipt 15–45 seconds after checkout, shows “typing…” before the text and reads only replies to its own messages. If it breaks, prices keep flowing to the channel.
03 Buttons instead of back-and-forth The manager presses “Confirmed”, “Delivered” or “Cancelled” right under the order. The status is written into the order and into the customer’s thread, and two hours after “Delivered” the customer gets a request for a review.
04 Customer chats live in topics Everything customers write to the store’s account lands in the “Customers” group, one topic per person. The owner replies from the topic, a new customer gets one automatic reply with a link to the site, and the “/site” command sends the site or a product with its price.
05 Courier by time window Within Moscow from 1,000 ₽ in a three-hour window, in the region from 2,000 ₽ in a four-hour window, from 11:00 to 22:00 up to a week ahead. Same day — if more than four hours remain before the window ends. Payment on delivery: card by QR code or on credit.

Knows
where we are
pricier

Every morning at 9:15, before the store opens, the system reads four competitors’ catalogues — page by page, with pauses so as not to load other people’s sites. Then it matches their products to our cards and builds a table: our channel price, our markup, the competitors’ prices and the difference.

The decision stays with the owner. The table shows where we are above the market and where a price could go up. The system never changes prices itself.

01 One product, one name “Apple iPhone 17 Pro phone, 256 GB, eSim, colour: deep blue” and “iPhone 17 Pro 256 GB Blue eSIM” are the same product. The program normalises both names: model, storage, RAM, colour in Russian and English, SIM type, size, part number, year.
02 Does not confuse look-alikes Used, activated and “Russian keyboard” units are never compared with new ones, a case with a phone, a band with a watch, or a copy accessory with a genuine Apple one. Otherwise the table would lie and the decisions made from it would be wrong.
03 A table built for decisions Products are sorted by the size of the gap. There are filters by category, “where we are pricier” and which store has the item, plus “Refresh competitor prices” and “Download Excel” buttons.
04 New models appear on their own The program reads a competitor’s list of sections from their own site, so new models enter the comparison by themselves. A new store is one line in the settings: the table, the filter and the Excel file gain a column with no code changes.
ProductOur channelCompetitor 1Competitor 2Gap
iPhone 17 Pro 256GB119 900 ₽117 500 ₽118 200 ₽2,400 ₽ pricier
AirPods Pro 215 900 ₽15 400 ₽—500 ₽ pricier
MacBook Air M5134 500 ₽136 900 ₽135 000 ₽500 ₽ cheaper

What the difference table looks like · two of the four stores, sample prices

→ the table scrolls sideways
DetailsThree more sections: how search engines and ChatGPT find the store, what watches for breakages, the weekly reportExpand ↓Collapse ↑

So the store
gets found

In October one customer arrived from ChatGPT. Search engines and AI assistants read a site differently from people, so the store has separate pages and files for them — and all of it updates by itself along with the price list.

About 700 models got a description and key specifications from the makers’ own pages, and 54 cards with a wrong photo were left with none: a wrong picture is worse than no picture.

01 Search engines hear within the hour Every hour the site tells Yandex and Bing about new and changed pages. Bing, in turn, feeds ChatGPT’s search.
02 Answers to buyers’ questions An FAQ page: is it genuine, how to check before paying, eSIM or SIM, countries, conditions, delivery, payment — with markup search engines understand.
03 A file for AI assistants The store and its terms in plain text in one file, so an assistant answers about the store correctly instead of making things up.
04 Products for Yandex A feed of new devices in the Yandex Market format, and every product’s data carries the description, the seller, the 14-day return policy and the delivery terms.
05 The page does not vanish A sold-out product keeps its page: “Out of stock”, the last price and a “tell me when it’s back” button. After 90 days the address is honestly retired, and old addresses are redirected to live cards every hour.

Runs
unattended

The store depends on prices flowing in from the price list on their own. So more important than any headline feature is never missing a quiet failure.

On 30 September the server ran out of disk space. Since then the system warns the owner on Telegram when the disk is 85% full, and service logs no longer bloat the daily backup.

Store · channel10:02
The “Garmin” post no longer fits Telegram: 500 paragraphs at a limit of 500. Not sent — split the post.
Store · monitor10:40
Supplier silent since 09:00 — not one post all morning.
11:05 · Supplier is posting again. Storefront updated.

Sample messages

01 Re-reads the channel every five minutes The supplier often edits an old post instead of writing a new one, and Telegram does not report every edit. So every five minutes the program re-reads the whole channel and updates the storefront if anything changed.
02 Pages load fast Ready-made pages are kept on the server so they open instantly, and are rebuilt the moment a price, stock level or photo changes. The shopper never waits, and prices never go stale.
03 Orders reach the manager on Telegram Cart, delivery and checkout work on the site, and the finished order goes straight to the manager as a message — no separate order system.
04 Warns when something goes quiet If the supplier is silent during working hours or the site stops reading the channel, the owner gets a Telegram message — and a separate one once everything is fine again.
05 A daily backup and checks on every change Every night the database is backed up to Telegram, and the system is covered by almost 250 automated tests: price-list parsing, competitor comparison, the cart, orders and receipts, channel posts, the site.

Monday,
10:30: the week’s
report

Once a week the managers get a single message: channel subscribers, how many people see the morning post, orders and requests from the site, what got cheaper, where competitors are cheaper. Traffic from Yandex Metrika and the Google queries the site was found by are read by the program itself — nothing is exported by hand.

The morning post in the channel on 20 October: “Cheaper since yesterday” and five products with new prices

The morning post in the channel · 20 October, the real one

Store · reportMon 10:30
Week of 13–19 October
Channel: 4,120 subscribers (+36), the morning post is seen by 1,480
Site: 1,940 visits — Telegram 41%, Yandex 33%, Google 18%, ChatGPT 3%
Orders 7, price requests 12, clicks to Telegram 58
23 items got cheaper · pricier than competitors: 9 Apple items

Sample figures

every 5 min
Supplier’s channelis re-read in full; the storefront updates if anything changed
06:20
Yandex Maps ratingis read and shown on the home page, the product page and at checkout
09:15
Four competitors’ pricespage by page, with pauses; the difference table builds itself
10:00
Morning post in the channelwith the five biggest price drops of the day — a price history is kept for every card
every hour
Search engines and addressesYandex and Bing hear about changed pages, old addresses are redirected
03:30 · 04:00
Archive and backupwhat sold out 90 days ago goes to the archive, a copy of the database goes to Telegram
Mon 10:30
Weekly reportto the managers on Telegram, in one message

The outcome

Prices and stock on the storefront come from the supplier’s price list by themselves; nothing is typed in. An order reaches the customer with a receipt on its own and comes back as a review. The owner manages only the rules: markup, sections, the list of what we don’t sell, model photos and the disputed lines.

2 100+ products in stock on the storefront: prices and stock come from the price list with no manual entry
4 competing stores are checked against the storefront every morning, and the difference table builds itself
700 models got a description and specifications from the makers’ own pages
0 manual edits to prices or stock

Built with: Laravel, Nova, MySQL, Go, Python, Tailwind, Alpine, Telegram API.
About 32,000 lines of code, 5,000 of them automated tests · the publishing bot has run since 2024, the site and catalogue since September 2026, orders with receipts since October · site and design from scratch; it is my own store: I am both the owner and the developer.

Message me on Telegram → The store’s website ↗ Telegram channel ↗ ← All work Next project · 03 / 07Mint Decor →
Message