E-commerce · 2026
Farm Direct Sales Shop
A shop where the farm handles orders, bank-transfer reconciliation and shipping lists on its own
An online shop and an operations console built so an apple farm can take and process its own orders. Bank-transfer payments are read from the account history and matched to orders automatically, carrying through to confirmation messages and shipping lists.
- Client
- DMZ1km Apple Farm
- Category
- E-commerce
- Project site
- Project site ↗

Overview
- A storefront and an operations console for an apple farm selling direct to customers
- Visitors order products by variety; the farm handles orders, products and members in the same site's admin screens
- Ordering without signing up, with order lookup and cancellation tied to the phone number verified at checkout
- Bank transfer only, with status moving from received to payment confirmed, shipping, then delivered
- Refund-requested, refunded and cancelled kept as separate statuses, excluded from totals

Challenge
- Bank transfer as the only payment method → every order needing a manual match between payment and order
- Orders identifiable only by depositor name and amount, with same-name, same-amount collisions possible
- Gift orders in the mix → orderer and recipient differing within one flow
- Phone number as the only lookup credential for guest orders → other people's orders reachable without a check
- Varieties and pack sizes changing each season → products editable by the farm itself
- Shipping cost varying with the number of parcels → parcels counted from the volume of what is in the cart
Solution
- Cart built from the variety list, then a stepped form: review, orderer details, recipient, confirmation
- Recipient step starting with a choice of "same as orderer" → skipping input entirely for orders to oneself
- Address chosen by search rather than free text → blocking postcode and address from drifting apart
- Order number and bank account shown on the confirmation screen, and sent to the orderer by text
- Members looking up orders through their account, guests through a verification code, with the two scopes kept apart

- Admin screens for adding categories and products, reordering them, swapping photos, toggling sold-out and hidden
- Order management filtering by status, changing several orders at once, entering tracking numbers
System architecture
Customer
- Pick products → place order → payment instructions by text → transfer → confirmation by text → delivery
Farm
- Check what to ship → export to Excel → ship → enter tracking numbers → move to shipping
- Dashboard showing orders awaiting action, order counts and amounts per period, and totals by variety and product

Payment reconciliation
- Bank account history read on a schedule, moving received orders to confirmed when depositor name and billed total both match
- Operator notified by messenger of confirmations, failed confirmation texts, and multiple candidates
- Unrelated deposits logged without a notification → keeping alerts that need no action from piling up
- Unpaid orders left to the operator's daily check, which the automatic matching does not replace
Implementation
- Amounts shown by the screen first, recalculated by the server at checkout → orders whose products changed in between rejected and returned to a refreshed cart
- Shipping cost as parcel count times unit price, with volume rounded up to whole parcels; unit price read and set by the operator through a messenger command
- Oldest order confirmed when several candidates match, with the operator notified and the order history recording it
- A single processing checkpoint held, so re-reading the same transaction after an interruption never confirms one order twice
- Processing narrowed by transaction time when the checkpoint is missing → preventing the whole query window from being confirmed at once
- Excel export covering every row matching the filter rather than the current page, and reporting when the cap truncates it

Personal data and permissions
- Account lockout on repeated login failures, with per-address rate limiting in front of it
- Unknown IDs and wrong passwords answered identically → never revealing whether an account exists
- Codes, tokens and phone numbers kept out of logs; customer texts carrying no address or recipient
- Addresses absent from member lists and present only in a single member's detail → removing any path that returns many addresses at once
- Uploaded photos re-encoded on the server → stripping capture location and anything appended to the file
- Admin features split into permission units, with button states as display only and enforcement on the server
Result
- Products and prices edited by the farm directly, keeping up with varieties as the season turns
- Payment confirmation feeding the order status without a person in between, with the confirmation text going out alongside
- Order status, processing history and the basis for each confirmed payment traceable in one place
- Shipping lists exported to Excel and used as-is to prepare parcels
- Guests ordering without an account and reaching only their own orders through number verification
- Visit analytics collected under the farm's own domain → the collecting server's address never exposed to visitors

Technology
- Python
- FastAPI
- PostgreSQL
- SQLAlchemy
- React
- TypeScript
- Redis
- Docker
Screens




Have a problem that needs solving?
From software development to equipment integration and engineering, we can work out the approach that fits what your project needs.
Discuss a project