Skip to content
Commerce Controlled beta Laravel

GramShop: a Telegram shop that behaves like infrastructure

A lot of digital goods — accounts, licence keys, tokens, service access — are sold in a private Telegram chat by someone copying codes out of a spreadsheet. GramShop turns that into a system: a bot per store, a catalogue in three languages, stock encrypted at rest and reserved so the last unit has exactly one buyer, payments over VietQR or USDT, and delivery that happens the moment the money is confirmed. The money and the stock stay correct even when webhooks arrive twice, or late.

GramShop catalogue screen: category and product counts, language tabs for Vietnamese, English and Chinese, and products listed with price in VND, available units and status
3Languages in the bot and catalogue: Vietnamese, English, Chinese
2Payment rails today: VietQR and USDT on TON, plus a customer wallet
1Buyer per stock unit, enforced by reservation
BetaControlled; store creation is invite-only

The problem

Selling in a chat is fast to start and slow to run. Stock lives in a sheet, so two buyers can be sold the same code. Payment is a screenshot the seller checks by eye. Delivery is a paste, and a refund is a negotiation. The moment a seller has a second store, or a second person helping, none of it is auditable. Building the bot, the payment matching, the inventory and the ledger properly is months of work that no individual seller will do — and every seller needs the same months.

What it does

A Team owns one or more Stores; each Store has its own Telegram bot, catalogue, stock, customers and ledgers. The seller pastes a BotFather token, and GramShop verifies it, registers the webhook and syncs commands. From there the customer does everything in a private chat: pick a language, browse categories, get a fixed-price quote with an exchange-rate snapshot and an expiry, pay by VietQR or USDT or from a wallet balance, and receive the goods once the provider confirms payment. Secrets are sent only in the private chat and never appear in logs or exports.

Behind the chat is the operating side: an inventory screen that shows available, reserved, sold and quarantined units per product, a payment exception queue for the cases that need a person, controlled refunds that also reverse the platform fee, and a team workspace with roles, invitations, an audit feed and per-store scopes. A developer API with idempotency keys and signed outbound webhooks lets a Team sync its catalogue and react to orders from its own systems.

Built with restraint

Money is stored as integer minor units, never floats. Wallets and fee accounts are append-only ledgers; nothing is edited, only posted. Every operation that a retry could repeat — a webhook, a top-up, a delivery — is idempotent, and Telegram messages are sent in per-chat order with retries. The bot handlers and jobs are thin; the business rules live in shared domain commands that the bot, the panel and the API all call, so a rule is enforced once.

Where it is today

Controlled beta, with store creation by invitation. The core — tenancy, catalogue, stock, quoting, wallet, payment rails, delivery and the operator panels — is implemented; a live Telegram rehearsal, the remaining reliability work and the growth features are in progress. Pricing is settled in shape rather than in numbers: plans are priced on stores and seats, not as a cut of each sale, and rates will be published when sign-up opens.

At a glance
ForSellers and small teams selling digital goods on Telegram, starting in Vietnam
ShapeHosted multi-tenant SaaS; Team → Stores → bots
StackLaravel 12, MariaDB / MySQL, Redis queues, Docker Compose
PlansGo, Pro, Business, Enterprise; priced on stores and seats
StatusControlled beta, invite-only
Capabilities
Bot setup from a BotFather token, with webhook and command sync Catalogue with categories, quick buy, favourites and buy again Encrypted stock, batch import, reservation at checkout Fixed-price quotes with an FX snapshot and expiry Customer wallet, VietQR and USDT on TON, combinable in one order Automatic delivery on confirmation; secrets only in private chat Exception review queue and refunds that reverse the fee Team roles, audit feed, operator API with signed webhooks
Evidence status

Screens on this page are GramShop running on a seeded demonstration store: every team, product, customer and order is fictional and the prices are placeholders. No sales figures are shown because the product is in closed beta.

The product

Four screens behind the chat

The customer only ever sees the bot. These are the screens the seller works in, and every count on them is derived from the same ledgers the bot writes to.

Store overview with a store health panel: orders in 24 hours, awaiting fulfilment, payment reviews, low-stock products, and the bot, gateway and fee wallet setup state
Store overview. Health at a glance: what is awaiting fulfilment, what needs a payment review, what is running low, and whether the bot, gateways and fee wallet are ready to sell.
Inventory screen with available, reserved, low-stock and quarantined unit counts, a low-stock threshold setting, and per-product unit breakdown
Inventory. Every unit counted per product: available, reserved by a checkout in progress, sold, quarantined. The low-stock threshold changes what is highlighted, never whether a sale goes through.
Product detail with price, available units and max per order, commercial terms form, and customer-facing copy in Vietnamese, English and Chinese tabs
Product. Commercial terms on one side, customer-facing copy in three languages on the other. A product needs all three before it can go live.
Team dashboard with a needs-attention list of setup tasks across stores and business performance tiles for gross sales, paid orders, payment success and average order value
Team dashboard. The highest-impact work across every store the person may see, then paid activity over a chosen window. Empty tiles say “no sales data yet” rather than showing a zero that looks like a result.
Decisions

Three calls that shaped it

Ledgers are appended, never edited A wallet balance is the sum of its postings. A refund is a new posting that reverses the sale and the fee. Nothing is corrected in place, so every balance can be re-derived.
Reserve the unit before taking the money Checkout reserves a specific encrypted unit. Two buyers racing for the last code get one sale and one clear message, not two deliveries of the same secret.
Price on stores and seats, not on volume A percentage of sales makes the platform a partner in every dispute. Charging for stores and members keeps the seller’s margin theirs and the incentives simple.
Selling on Telegram, or building commerce that has to settle correctly? Ask about beta access, or start with a Blueprint for the commerce system you actually need.
Request a call →