Own product
Pullstok: ERP and online store for small businesses
A multi-tenant SaaS product to run a business end to end: stock, sales, invoicing, quotes, customers and an online store. React and Vite on the front, an Express API with Prisma and PostgreSQL.
Tech stack
The technologies used and why.
Screenshots
The product
Pullstok is my own product: a multi-tenant SaaS that lets a small business (a homeware store, a hardware shop, a kiosk, a cleaning supplies store) run its whole operation from one place. Each business gets its own isolated space, with its products, customers and sales, on top of the same platform.
The idea came from a very common problem: small shops usually track stock in a notebook or a spreadsheet, invoice separately and have no real visibility of what they sell. Pullstok brings all of that into one simple tool, built for people who are not technical.
Architecture
The system is split into clear pieces:
- App (management panel): a React SPA with Vite, React Router for navigation and TanStack Query for server state (caching, revalidation, loading states). Styled with Tailwind and fully typed with TypeScript.
- API: an Express backend with Prisma as the ORM on top of PostgreSQL. JWT authentication and input validation with Zod on every endpoint. The model is multi-tenant: each request is resolved within the business it belongs to.
- Landing and store: Astro sites, static and fast, kept separate from the app so the public web is not weighed down by the panel.
Everything runs on my own VPS, with a controlled deploy and a database managed outside the container lifecycle.
The modules
The panel covers a business’s full cycle:
- Products and stock: create, edit and control inventory, with categories that can be managed after the initial setup.
- Quotes, orders and sales: from a quote to an order and then to a sale, with delivery notes when needed.
- Customers: managing each business’s customer base.
- Invoicing: a service invoice module and a bridge that turns a sale into an invoice automatically, so data is not entered twice.
- Online store: an e-commerce connected to the same catalog, so whatever is in stock can also be sold on the web.
- Superadmin: a layer on top to manage the businesses on the platform.
Onboarding and quality
Setting up a new business is done through a step-by-step wizard that leaves the shop ready to operate with no friction. On the quality side, the API has end to end tests with Jest running against a real database in Docker, which lets me touch the data model with confidence and catch regressions before they reach production.
Status
Pullstok is in production and under active development. It is a living product: every new feature (categories, invoicing, the sale to invoice bridge) comes from the real needs of the businesses already using it.









