# The Artitech

Case study 01 | Client | Live

A small decor studio was selling through a marketing page that sent buyers to Etsy. I replaced it with one platform that runs the whole business: the storefront, in-person sales, orders, stock and the books.

- Role: Design, build and ongoing maintenance. Solo, end to end.
- Timeline: January 2026 to now
- Stack: Python, Flask, PostgreSQL, Stripe, Square, Mailgun, Railway
- Live site: [the-artitech.com ↗](https://the-artitech.com)

1,000+ automated tests, run before every release

840+ commits since February 2026

300+ routes across storefront and admin

36 admin modules, from orders to year-end

The problem

## Every sales channel lived in a different tool.

Online orders went through Etsy, market and in-person sales went through Square, and everything else lived in spreadsheets and email. Nobody could answer a simple question like **"what did we actually make this month?" **without an evening of copying numbers between tools.

Before

- × Marketing page linking out to Etsy
- × Stock counted by hand
- × Square and online sales never reconciled
- × Invoices and receipts made one by one

After

- → Direct checkout, no marketplace fees
- → Stock updates itself from every sale
- → Every channel lands in one set of books
- → Branded PDFs generated automatically

What I built

## What the platform does

The customer only sees the storefront. Behind it is the system the owner runs the business from every day.

### Storefront

- → Catalogue with size and colour variants
- → Stripe checkout and customer accounts
- → Order tracking links sent by email
- → Promo codes and product waitlists

### Operations

- → Square POS sync for markets and pop-ups
- → Custom enquiries that convert into orders
- → Quotes, invoices, receipts and packing slips
- → Bill-of-materials costing and production runs

### Finance

- → Profit and loss, balance sheet, profitability
- → Expenses, payouts and per-account ledgers
- → Year-end reports, exportable to CSV and PDF
- → Role-based access with a full audit log

The hard part

## Keeping stock right across five sales channels

A piece can sell online, at a market, through a custom enquiry, as a manual order or on the Square terminal. Each path used to touch stock differently, so counts drifted. I moved every path onto** one inventory service** with the same lifecycle, so a sale reserves stock once and removes it once, no matter where it came from.

Website Square POS Markets Custom enquiry Manual order

1

Paid

Any channel hands the order to the same service.

2

Reserved

Available stock drops. Physical stock stays put. committed += qty

3

Fulfilled

Stock comes off exactly once, by exactly the quantity sold.

4

Shipped

Customer gets a tracking link and a branded receipt.

Cancel before fulfilment: the reservation is released and nothing else moves.

Refund after fulfilment: the exact quantity goes back, so every round trip ends where it started.

How it's built

## Engineering decisions

### Money in cents

Every amount is stored as a whole number of cents. No floating point anywhere near a price.

### Tested before it ships

The full suite runs against a sandbox database before anything reaches production.

### Permissions by item

Roles control access to 42 individual areas, from website orders to the balance sheet.

### Idempotent webhooks

Stripe and Square can resend events safely. An order is never counted twice.

### Shop-local time

Reports, receipts and daily totals follow Toronto time, including daylight saving.

### Brand on every page

Invoices, receipts and slips are generated as PDFs in the studio's own type and colours.

Screens

![The Artitech admin dashboard](https://abbasvirjee.com/static/img/artitech-wide.webp)

The daily dashboard: what needs attention, what sold, what's running low.

![An order page in the Artitech admin](https://abbasvirjee.com/static/img/artitech-a.webp)

One order page for every channel, with its full history.

![The Artitech profit and loss statement](https://abbasvirjee.com/static/img/artitech-b.webp)

Profit and loss across online and in-person sales.

The business runs on one system now, and the books reconcile without anyone copying numbers.

The studio sells online, at markets and on commission without switching tools, and the owner can see how the business is doing on any given day. I still maintain it and ship improvements as the business grows.
