Guide

Import a car catalogue into Telegram

Three columns are mandatory, fifteen more shape the card, photos come by URL. What the importer checks, what it refuses, and the one thing it will not do.

AdminHub

In short. The importer takes a CSV or XLSX, checks it row by row without creating anything, shows you what failed, and only writes listings when you commit. Three columns are mandatory — make, model, year — and fifteen more decide how much the card actually says. Photos arrive as URLs separated by a vertical bar, thirty per listing at most. The limit is enforced at commit time: three active listings on the free plan, fifty on Pro. And the thing to know before you start: this is a one-time push, not a synced feed.

You have the cars in a spreadsheet already. Somebody exported them from the system you use, or you typed them, and now there are forty rows and a folder of photos. This page is about getting that into a Telegram catalogue without discovering the problems one listing at a time.

Start from the template

Download the template — CSV or XLSX, whichever your tool opens without complaining. It is a header row and one example listing, and its column names are the ones the parser looks for.

You do not have to use it. You do have to match the column names, and the template is simply the shortest way to be sure you did.

The three columns that are not optional

make, model, year. A row missing any of them fails validation and does not become a listing.

That is a deliberately low bar, and it is worth knowing exactly how low. A row with only those three is valid: it will import, and it will produce a card that says a make, a model and a year, and nothing else. Valid is not the same as good.

The fifteen that decide what the card says

Everything else is optional, and each one you leave blank is a line the buyer does not get:

mileage_km · transmission · drivetrain · body_type · fuel_type · engine_volume_l · condition · vin · city · price_amount · price_original_amount · price_currency · price_negotiable · description · photo_urls

Two are worth calling out. price_original_amount is the old price — fill it and the card can show the drop rather than just the number. price_negotiable is the flag that answers the first question every buyer asks, before they have to ask it.

If you are going to skip columns, skip vin and drivetrain. Do not skip city or price_amount: those are the two that decide whether somebody messages you at all.

Photos come by URL

Put the image addresses in photo_urls, separated by a vertical bar:

https://example.com/photo-1.jpg | https://example.com/photo-2.jpg

Up to 30 per listing are taken; anything beyond that is ignored rather than erroring. The addresses have to be reachable at import time — a link to a file behind a login, or one that expires, gives you a listing without photos and no way to tell from the spreadsheet.

If the photos only exist on your disk, upload them to the listing after import instead. There is a per-listing photo screen with drag-to-reorder, and the first photo is the one that travels on the shared card.

Nothing is created until you say so

The import is two steps and the split matters.

Parse reads the file and returns every row with its own validation errors. It creates nothing at all. You get a review screen showing which rows are fine and exactly what is wrong with the others, so you fix the file once rather than deleting bad listings afterwards.

Commit is what writes. Until you press it, your catalogue is untouched.

This is worth using properly: upload, read the errors, fix the spreadsheet, upload again. Two minutes there beats an afternoon of editing forty listings by hand.

The limit bites at commit, not upload

Active listings are capped by plan: 3 on free, 50 on Pro. The commit checks how much room you have and stops with an explicit error and a count if there is none.

So uploading forty cars on a free plan is not a mistake the system hides from you — but it is also not going to work. Decide which three are worth having live, or move to Pro before the import rather than after.

What this does not do

It does not follow your source. This is a one-time push, not a feed. There is no URL it watches, no scheduled refresh, nothing that notices when your master spreadsheet changes. Sell a car and you archive the listing yourself; drop a price and you edit it or import again.

That is fine for a catalogue that turns over monthly. It is a real cost if your inventory changes weekly, and you should count that cost before moving twelve months of stock across.

If… then…

If…Then…
You have more than a handful of carsUse the file — hand-entry stops being reasonable around ten
Your photos live on a website alreadyphoto_urls is faster than uploading them again
Your photos are only on your phone or diskImport the rows first, add photos per listing after
You are on the free planPick your three before you upload, not after the error
Your stock turns over every weekNothing here syncs — price that maintenance in before you start
You only sell two or three cars a yearSkip the file entirely and create them by hand

Where to start

Take ten rows, not forty. Fill the three required columns plus city, price_amount and photo_urls, and run the parse. Read what it says about those ten — the errors you get on a small file are the same errors you would get on the big one, and they are much cheaper to read.

Then fix the spreadsheet, commit those ten, and look at the cards. If the card says enough to make somebody message you, add the rest of the columns and do the remaining rows. If it does not, the missing lines are exactly the columns you skipped.


For what a Telegram car catalogue is as a product, and when a marketplace still beats it, see selling cars on Telegram. To set one up, start at the listings page.

What people usually ask

What file does the importer take?
CSV or XLSX. There is a template you can download in either format — a header row plus one example listing — and matching its columns is the shortest path to a clean import.
Which columns are actually required?
Three: make, model and year. Everything else is optional, and every optional column you skip is a line the card will not show. A listing with only the three required fields is valid and looks it.
How do photos get in?
By URL, in a photo_urls column, several separated by a vertical bar. Up to 30 per listing are taken; anything past that is ignored. The images have to be reachable at those addresses when the import runs.
Can I check the file before anything is created?
Yes, and this is the whole point of the two-step flow. The parse step creates nothing: it returns every row with its own validation errors so you can fix the file and re-upload. Only the commit step writes listings.
What happens if I have more rows than my plan allows?
The commit stops with a 402 and tells you the count — free workspaces hold 3 active listings, Pro holds 50. It fills the room you have rather than silently dropping the rest, so check the number before uploading 40 cars into a 3-listing plan.
Does it keep syncing with my source file?
No. The import is a one-time push, not a feed. When a price changes you either edit the listing or import again — there is no URL it watches and no scheduled refresh. If your inventory turns over weekly, factor that in.