EzVenda
A multi-tenant commerce platform where small Pakistani merchants run cash-on-delivery shops on their own domains.
Small merchants in Pakistan sell in rupees, mostly cash on delivery, and their ad spend is wasted on fake orders that never get paid for.
EzVenda gives each merchant a hosted storefront with guest checkout, a merchant app for catalogue, orders and shop design, and a connector so the merchant’s own AI assistant can do the work for them.
Decisions
01
Custom domains, without running certificatesDecision D-201
- Chose
- Merchants connect their own domain through Cloudflare for SaaS, which issues and renews the certificates.
- Instead of
- Issuing certificates on demand from our own servers the first time a new domain connects.
- Why
- Merchant traffic gets the same DDoS protection, firewall and caching as the platform, and certificate renewal and rate limits stop being our problem.
02
Count a sale when the merchant confirms itDecision D-268
- Chose
- The server reports a purchase to Meta and TikTok when the merchant confirms a cash-on-delivery order, with the order id as the event id.
- Instead of
- Firing the purchase from the shopper’s browser the moment an order is placed.
- Why
- Fake COD orders are the biggest problem for Pakistani advertisers. Counting only confirmed orders teaches the ad platforms to find real buyers, and a sale is never counted twice.
03
Pixel IDs only, no pasted scriptsDecision D-16
- Chose
- Merchants enter format-checked pixel IDs, and a first-party script starts each vendor’s tracking.
- Instead of
- A custom scripts box, or pasting the vendors’ inline snippets.
- Why
- Arbitrary JavaScript on a page with a checkout turns any XSS bug into a card skimmer served from our own domain.
04
The AI connector uses the API’s own routesDecision D-249
- Chose
- Each merchant’s MCP key is tied to one store and one person, and every tool calls the API’s existing routes.
- Instead of
- Tools that read and write the database directly.
- Why
- An agent’s change gets the same validation, permissions, events and audit trail as the merchant’s own click, and design edits stay drafts until the merchant publishes.
05
Stock that cannot be oversold
- Chose
- Checkout takes stock with one conditional update that subtracts only while enough is left.
- Instead of
- Reading the stock, checking it in code, then writing the new number.
- Why
- The check and the decrement are one atomic statement, so two shoppers can never both buy the last unit. Checkout also re-prices from live tables.
EzVenda, in use: The EzVenda store builder: the home page’s sections on the left, the live shop on the right. The Your AI page: changes an assistant made, waiting for the merchant to publish. An order in the merchant app: what to pack, cash to collect on delivery. The shop home page on a phone. A product page with price, discount and photos. Guest checkout asking for a phone number. The orders list, grouped by what each order needs next. The products list with stock and price. A shop on EzVenda in a desktop browser. Customers, with how many orders each has had delivered. The online store page: theme, pages and settings.








































- app.ezvenda.com/storeThe store builder: sections on the left, the shop as shoppers see it on the right.
- app.ezvenda.com/aiAn AI assistant edits the shop over MCP; the merchant reviews before it goes live.
- app.ezvenda.com/ordersOrders built around cash on delivery: pack it, hand it over, collect.
- app.ezvenda.com/ordersOrders grouped by what they need next.
What shipped
- Live, with a real merchant trading on it since milestone 1 (Sep 2026), their catalogue imported from Shopify.
- 39 MCP tools let a merchant’s AI assistant manage the catalogue, pictures, shop design and settings.
- Full end-to-end suite green: 152 passed, 0 failed. 139 unit test files and 54 Playwright specs.
- 307 engineering decisions written down, each with what was chosen, what it was chosen over, and why.
- Two storefront themes and 51 screens across the merchant app, the shop and the admin.
Built with
TypeScript, Fastify, ts-rest, Drizzle, Postgres, BullMQ, React, TanStack, Astro, Cloudflare for SaaS, R2, MCP





