Orto.ch
A hand-built WordPress shop for a social enterprise growing zero-kilometre produce. No WooCommerce, no payment processor, no third-party scripts.
Ø1 Problem
Orto is a charity in Chiasso, on the Swiss-Italian border. It grows fruit and vegetables, sells them to its own community, and gives people pushed to the margins of working life a real job to come back to. It needed a genuine shop: weekly boxes, pick-up points, member accounts, reminders. WooCommerce would have meant a heavy stack, constant patching, a platform fee climbing every year, and a team of volunteers babysitting it.
Ø2 Solution
A shop built by hand as a custom theme. Every product is its own piece of content with its season, story and price. Customers assemble a box from what is in season this week, choose a pick-up location, and pay by Twint or cash on collection. Orders are structured content the team can see, edit and export. A member area shows past orders and a credit balance that covers sponsored vouchers and goodwill: one float on the user, three journeys, zero PCI surface. Reminders go out by SMS the day before collection.
Ø3 Delivery
I wrote the first version in 2024 and came back in 2026 with a clear brief: keep the data model and the pages, replace the rot underneath. Vue and jQuery went, business logic left the templates for typed classes, and side effects moved into hooks that fail silently so a CRM outage can never fail an order. The shop runs on a private VPS and deploys from GitHub Actions over Tailscale, with a syntax gate on every file. Admin staff get a one-click CSV of the day's orders for the pickers and drivers.
Notes from the build
- Versioned REST API, about twenty routes, for cart, catalogue, orders, users and vouchers, consumed by a vanilla-JS front end.
- SMS reminders via Brevo behind a credit gate: a batch falls back to email rather than sending SMS it cannot pay for. Dropping emoji from the copy cut the cost per message five-fold.
- Self-hosted Altcha proof-of-work instead of a third-party captcha. No external servers, no tracking, fails closed.
- Two-factor authentication enforced for privileged roles, and enforced fail-closed if the 2FA plugin is ever missing.
- Order reminders run from system cron, not WordPress pseudo-cron, because a low-traffic site fires that unreliably.