MangoesToMetro

The Ordering System Behind MangoesToMetro

May 16, 2026 · 7 min read

Orders dashboard listing orders with tracking code, buyer, quantity, total, payment method and status, with tabs for each order stage and an export button

Behind the MangoesToMetro store is a custom ordering system built specifically for it. This case study explains what it does and how it was put together, written for anyone considering something similar for their own business. The short version: an order should arrive complete, land in one place, and keep the customer informed without anyone having to remember to do it.

What happens after you press Place Order

From the buyer’s side, pressing the button is the end of the job. Underneath, a sequence runs every time, in the same order, whether it is the first order of the season or the fiftieth.

The submission is first checked to make sure it came from a person rather than an automated script. Then the details are validated: a real delivery area, a sensible number of boxes, a usable email and phone number. The uploaded proof of payment is inspected before it is accepted, and if anything fails the buyer is told exactly what to fix rather than being met with a generic error.

Once the order is accepted it is saved with a tracking code, and a confirmation email goes out automatically. Nobody has to be awake for this to happen.

Order confirmation reading Order Received with a tracking code, a note that a confirmation email was sent, and contact details
What the buyer sees the instant an order is accepted. The tracking code is generated and stored with the order. Sample order shown.

Every order in one place

The team sees one list. Every order has the same fields in the same columns: tracking code, buyer, contact number, quantity, total, payment method, status and date. There is a search box and a date filter for finding a specific order, and an export button for pulling the day’s orders into a spreadsheet.

Orders dashboard listing orders with tracking code, buyer, quantity, total, payment method and status, with tabs for each order stage and an export button
The orders dashboard, with the order stages across the top and a status control on every row. All order data shown here is sample data.

This is the part that replaced the manual coordination. There is no scrolling back through a conversation to find an address, and no two people keeping separate notes.

Stages a customer recognises

An order moves through stages named after real things rather than internal jargon: pending, confirmed, preparing, shipment, out for delivery, and order received. Two more exist for when reality intervenes: delayed and cancelled.

The stages are not just labels. The system knows which moves are allowed, so an order cannot jump from pending straight to delivered, and it cannot quietly go backwards. That sounds like a small thing until you have several people updating orders during a busy week. It means the status a customer sees is one the team can actually stand behind.

The counts along the top of the dashboard show how many orders sit at each stage, so it is obvious at a glance where the work is today.

Keeping payment details safe

Buyers upload a screenshot of their payment, which means the store accepts files from the public internet. That is the single riskiest thing a small shop can do, so it was handled carefully.

Uploads are restricted to images and PDFs, checked in more than one way rather than trusting the file’s name, and stored under a generated filename rather than whatever the sender called it. The submission is also checked for automated abuse before any of that work happens, so spam is rejected early instead of filling the order list.

Who can see what is controlled deliberately. Rather than handing everyone a full administrator account, there are separate roles: the people who run orders day to day, a read-only view for partners who need visibility without the ability to change anything, and the ability to export orders granted only where it is needed. Sign in happens through a dedicated branded page, and the standard WordPress login address is closed off.

What the team sees

Confirmation emails are sent through a properly configured mail service rather than whatever the web server happens to do by default, because order confirmations landing in spam is worse than not sending them at all.

Admin screen for configuring the outgoing mail server used for order confirmation emails
Order confirmations are sent through a configured mail server rather than the default PHP mailer.

A summary of the day’s orders is sent automatically to DTI at a set time each day, so the partner organisation stays informed without anyone compiling a report by hand.

The payment QR codes shown to customers are managed from the dashboard. When the account details change, someone updates them in a form. No developer, no deployment, no waiting.

Admin screen for managing the payment QR codes shown to customers
Payment QR codes are managed from the dashboard, so they can be replaced without touching any code.

Things a client can change without a developer

This is the part that decides whether a system stays useful after handover. The price per box, the maximum number of boxes per order, the sender name and address on emails, the time the daily report goes out, and the spam protection keys are all settings in a form.

Plugin settings screen with pricing per box, maximum boxes per order, sender details, daily report time and spam protection keys
Pricing, order limits, sender details and the daily report time are editable settings, not values buried in code.

When the season ends, the ordering panel can be replaced with an out of stock notice rather than collecting orders that cannot be filled. When it returns, ordering comes back.

How it was built, and why that matters to a client

Every change to this system shipped with an automated test written before the code, and the tests had to pass before anything was merged. On top of that, every change went through two independent reviews before it was accepted.

For a client, this is not a technical detail. It is the difference between a system where a fix to one thing quietly breaks another, and one where the safeguards catch it first. It is also what makes the system safe to hand to someone else later, because the behaviour is written down in tests rather than living in the original developer’s memory.

What a client gets

A custom WordPress plugin that takes orders, keeps them in one dashboard, moves them through stages the customer understands, handles payment proof safely, sends confirmations, reports to a partner organisation daily, exports to a spreadsheet, and can be adjusted from a settings page rather than by editing code.

It was built for a specific problem: a seasonal product, a single box size, two delivery areas, and payment by QR code with a screenshot as proof. That focus is why it is simpler to use than a general purpose shop system carrying features this store will never need.

Want the technical version?

The engineering detail behind all of this, including the order state machine, the upload hardening and the export handling, is in Engineering a secure WordPress ordering plugin.

Tags: , , , , ,

Got something to say?

Thoughts, reactions, questions, or just want to chat about it? I'd love to hear from you.

Drop Me a Message