Online store · our own business · in production
The store we built for our own operation: card or OXXO cash payments and a Telegram alert for every order
InovaTienda is our own online store for medical and dental supplies, with about 3,932 products. It charges by card or OXXO cash, deducts inventory only once payment is confirmed and sends one Telegram alert per order. Live at tiendainova.com.
- Client
- InovaTienda (riel's own business)
- Industry
- E-commerce for medical and dental supplies · Mexico
Our own business: a system we built for our own operation
The problem
Sell a large catalog to buyers who pay in different ways, and run the store without someone watching the screen all day.
- Take cards and cash: some buyers pay at OXXO convenience stores and that payment arrives hours or days later. The system must wait for the deposit without deducting inventory early, and close the order if the voucher expires.
- Deduct inventory only once the money arrived, exactly once, even if the payment provider notifies twice.
- Learn about every paid order without opening a panel: an alert on the phone.
- Nobody pays less than the real price: the amount charged must come from the database, not the screen.
- Run the catalog without a developer: add products, fix prices in bulk, see orders and stock alerts.
Before
- How orders were taken and charged before the store: pending documentation; not estimated.
What we built
| Phase | Delivered working |
|---|---|
| Catalog | Six categories, search, comparison, wishlist and cart. Price or stock changes show without reloading. The total formula is identical in cart, checkout, database, charge and alert. |
| Coupons and student discount | Coupons apply on screen and are re-validated server-side before charging. Verified student discount (5 %), yearly, approved from the panel; not stackable with coupons. |
| Stripe payments: card or OXXO | The server recalculates the cart against the database, applies the discount, creates the order and opens payment. With OXXO the order stays pending until Stripe confirms the deposit; if the voucher expires, it is marked failed. |
| After payment | A server function receives the confirmation, marks the order, deducts inventory through a database function and sends one Telegram alert, with a retry. |
| Admin panel | Products, orders, inventory and stock alerts. Bulk editing from Excel. The admin role lives in the database, not the browser. |
| Security review | The deployment was exposing SQL files and internal docs as static files; closed with a deploy exclusion list. We say so because it is what you find by reviewing, not by building. |
Adjustments after delivery
- What this project does not have, said as such: no automated tests or documented phases like the ERP DG; it was built incrementally for our own operation. That is the difference between what we do for ourselves and what we deliver to a client.
How it was built
- 01
Catalog first
Products loaded into the database and also embedded in the page as a fallback.
- 02
Payments in test mode
Until the full flow worked end to end with card and OXXO, including expired vouchers and alert retries.
- 03
Admin panel
With the operations that used to be done by hand.
- 04
Security review
Two fixes: server-side price re-validation and exclusion of internal files from the deployment. 128 commits between June 3 and July 29, 2026.
Technology
Framework-free JavaScript in the browser (a single page with store and panel); Supabase (PostgreSQL with row-level permissions and database functions); Stripe Checkout with cards and OXXO; Telegram Bot API; two serverless functions on Vercel.
Verified figures
- Products in catalog
- ~3,932
- Categories
- 6
- Payment methods
- Card and OXXO
- Server functions
- 2
- Verified student discount
- 5 %
- History
- 128 commits
- Domain
- tiendainova.com
Business metrics: they are ours, they exist in the database, and they will be published when we decide what to share. Not estimated.
What changed
Cards and OXXO without manual work
Including the case where the OXXO voucher expires unpaid.
Inventory deducted on confirmed payment
Once per order, even if the provider notifies twice.
Every paid order reaches the phone
One Telegram alert, never duplicated.
Nobody pays less than the database price
Even if the cart is tampered with in the browser.
The catalog runs without a developer
Products, bulk price fixes from Excel, orders, inventory and alerts.
Verified student discount
Approved or rejected from the panel, not stackable with coupons.
Selling on WhatsApp and confirming transfers by hand?
Orders that get lost, payments confirmed one by one, inventory deducted when someone remembers. Tell us how you run it today.