Anagart is the shop of the artist Ana: original paintings, canvas prints, stickers and a monthly letter sent by post. The job was a sales channel of her own rather than a rented storefront — a site that shows the work, takes payment safely, and keeps an honest count of pieces that exist only once. Sales opened on 25 September 2026.
Why not an off-the-shelf shop
There is exactly one of each original painting. A shop system built for restockable inventory treats that as the edge case. On top of it came postage rules of the artist's own, a monthly subscription, and a design that should not look like a template someone else is also using.
So the shop is its own application on Cloudflare: static pages, one Worker handling every flow, a database for the catalogue, stock and orders, and object storage for the images. No WordPress, no Shopify, no frontend framework. Fonts and images are served from the shop's own domain.
Taking payment without touching a card
Payment runs through Stripe, and the shop never receives card details. Every price is checked on the server before a payment exists: what the browser sends does not decide what anyone is charged.
Postage was the hard part. The rate depends on the largest piece in the bag and on the destination country, and the customer should not have to pick a shipping option at all. Once the delivery address is complete, the server works out the rate for that country and updates the payment. After payment, the same figure is derived again from the address the payment provider validated, and compared. If the two disagree, the session is refused.
Stock that stays honest under load
A piece is held while someone is paying for it, so it cannot be sold twice. The publicly visible count only drops once payment is confirmed. Abandoned checkouts release their hold when they expire, and a scheduled task clears them up.
That hold was exploitable at first: starting many checkouts and finishing none could make the shop look sold out without paying for anything. Checkout now carries an additional verification step, and a single order can hold at most one of each original painting.
Paid orders survive the unusual cases too. An order whose postage does not match the validated address is recorded as paid and flagged for review, rather than quietly going missing, and the artist is told about it.
Prices in the visitor's currency
Everything is charged and settled in Australian dollars. Alongside that, the shop shows an approximate figure in the currency of the country the request comes from, using a daily reference-rate snapshot that is cached rather than fetched per visitor. A switcher in the footer lets someone choose a different currency.
Converted figures are marked as approximate. If the snapshot is stale or the source is unreachable, the shop simply shows Australian dollars again. Invoices, emails and the dashboard stay in the settlement currency throughout.
The studio dashboard
Ana manages works, images, prices, stock, orders, subscriptions and enquiries herself. A new work gets its own address without anybody deploying code.
The protected area has two independent locks: Cloudflare's access control in front of the application, and a second check of the sign-in inside the application itself. If one layer fails or is bypassed, the other still holds. Customer records and uploaded reference images are unreachable without signing in.
The monthly letter, and the mailing list
The offer includes a monthly letter by post, either open-ended or for a fixed number of months, with billing and cancellation handled by the payment provider.
The mailing list uses confirmed opt-in: a signup does nothing until the owner of that address opens the link in a confirmation email. Every subscriber holds a lasting unsubscribe key, so the link in an old email never goes dead, and unsubscribing happens on a page with a button rather than on a bare link — otherwise a link scanner could unsubscribe someone by prefetching it.
What the build taught us
Two things are worth naming. The payment provider's API changed during the project: the variant chosen first stopped allowing server-set postage, so checkout moved to the embedded form. And visitors were briefly running day-old scripts against a new API, so every file now carries a content-derived stamp and a browser cannot execute yesterday's version after a release.
There was a design finding too. Photographs of the prints rendered the colours too warm, because of the light in the room; scans of the artwork are used instead. The email templates were also built to survive older versions of Outlook rather than falling apart in them.
What this case demonstrates
What is demonstrated is the build and the flows that were tested: prices and postage calculated server-side, stock that handles one-of-a-kind pieces correctly, confirmed payments, a protected dashboard, and automated tests covering checkout, rollback, payment confirmations and sign-in validation.
What is not demonstrated is sales, traffic or rankings. Sales opened on 25 September 2026, and at the time of writing there is no meaningful period to report on. When there is, and the figures are released, they can be added here with their source and period attached.
Frequently asked
Why not Shopify or WooCommerce?
Because one-of-a-kind stock, custom postage rules and a subscription arrived together, and the site was not meant to look like a template. For a different project a ready-made platform may well be the right answer; that gets settled before development starts.
Does the shop store card details?
No. Payment happens at the provider. The shop stores the order with delivery and contact details, not the card number.
Can the artist maintain the catalogue herself?
Yes. Works, images, prices, stock and orders are edited in the dashboard. New works need no code release.
Are there sales figures for this project?
No. Sales opened on 25 September 2026. Figures without a meaningful period behind them would demonstrate nothing.