Skip to content

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

~3,932
Products in catalog
6
Categories
Card and OXXO
Payment methods
2
Server functions

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

PhaseDelivered working
CatalogSix 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 discountCoupons 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 OXXOThe 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 paymentA server function receives the confirmation, marks the order, deducts inventory through a database function and sends one Telegram alert, with a retry.
Admin panelProducts, orders, inventory and stock alerts. Bulk editing from Excel. The admin role lives in the database, not the browser.
Security reviewThe 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

  1. 01

    Catalog first

    Products loaded into the database and also embedded in the page as a fallback.

  2. 02

    Payments in test mode

    Until the full flow worked end to end with card and OXXO, including expired vouchers and alert retries.

  3. 03

    Admin panel

    With the operations that used to be done by hand.

  4. 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.