Butchers Guild, a UK start-up connecting customers with independent local butchers. 2023 to 2025
Ordering meat by weight from local butchers
Meat has no fixed price: it depends on the cut, the weight, how it is prepared and whether it is marinated. I built the Laravel app for Butchers Guild that finds the butchers near a customer’s address, prices each cut live as it is set up, takes Apple Pay and Google Pay through Square, and gives every butcher a shop and an order queue of their own.
- Radius for finding nearby butchers
- 2.75 mi
- Levels of catalogue copied into each new shop
- 5
- From first version to last, in rounds of client feedback
- 19 months
How the ordering works
The problem
Meat has no fixed price
A cut can be 400 g or 1.2 kg, trimmed or diced, plain or marinated, and each choice changes the price. A shopping cart built for fixed-price items cannot sell that. And every butcher is a separate shop, with its own catalogue and its own orders.
Step one
Butchers within 2.75 miles, nearest first
The customer starts with their address, picked from UK address suggestions as they type, through getAddress.io. On the server I geocode the postcode with Google and measure the distance to each shop with the Distance Matrix API. Shops within 2.75 miles are listed nearest first, and the address is remembered, so a returning customer sees their list straight away.
Step two
Priced live, by weight
Each cut comes in forms, such as steak, and each form has a price per kilo with its own minimum, step and maximum weight. Preparation choices add a percentage, and a marinade adds a charge per kilo, taken from the shop’s own marinade range. The price updates with every tap on a page built for phones, and toggles give a short vibration.
Step three
Apple Pay and Google Pay, through Square
Checkout uses Square’s Web Payments SDK. The wallet buttons switch on once the customer’s details are filled in. The wallet token goes to the server, which takes the payment through Square’s Payments API with an idempotency key, saves the order and emails a confirmation. The app serves Apple Pay’s domain verification file and switches between Square’s sandbox and production. Square took over from a Stripe Checkout flow I had built earlier.
The back office
A shop for each butcher, set up from one form
One admin form creates the shop and the butcher’s login, then copies a template shop’s whole catalogue, five levels deep: categories, products, options, variations and preparation choices. Each butcher works from their own order queue, moving orders from Processing to Ready for Collection to Delivered, and the server will not mark an order Delivered before it is ready for collection.
How it fits together
Sets up the shops
The platform admin
- Creates a shop and its butcher’s login in one form
- Enters the shop’s address with Google Places, which fills in its coordinates
- Gets a copy of the template shop’s catalogue, five levels deep
- A static flag pauses a model hook during the copy, so options do not get extra variations
Orders, without an account
The customer
- Picks their address from UK address suggestions
- Sees the shops within 2.75 miles, nearest first
- Sets the form, weight, preparation, marinade and quantity, with a live price
- Pays with Apple Pay or Google Pay, and gets a confirmation email
Runs one shop
The butcher
- Logs in straight to their own shop’s orders
- Moves each order from Processing to Ready for Collection to Delivered
- Cannot mark an order Delivered until it is ready for collection
- Manages their own products and sorts them by drag and drop
How it changed over 19 months
- Oct to Dec 2023First version, with Stripe Checkout
- Aug to Sep 2024Back office rebuilt
- Oct to Dec 2024First pricing module, by the kilo or by a percentage
- Feb to Mar 2025Checkout moved to Square wallets
- Mar 2025Address search moved to getAddress.io
- Apr to May 2025New product page, with weights set per form
- May 2025New shops copied from a template shop