← work / index
Ø03

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.
orto.ch
The Orto shop: the box being built on the left, seasonal produce cards with prices on the right
orto.ch
The Orto home page: seasonal, social, zero-kilometre produce
orto.ch
The orders screen in WordPress admin: customer, products, collection point and status per order, with archive and export
orto.ch
The CSV export screen: orders or vouchers, by date range and pick-up point, for the pickers and drivers
orto.ch
The shop on a phone: two produce cards per row with an add-to-box control, running total at the bottom
orto.ch
The member account on a phone: credit balance and an active voucher code