nolimeo/Work/farmhouse.sk
E-commerce, shop operations

farmhouse.sk: online meat ordering built around real shop operations

When meat is sold by weight, the purchase does not end when the order is placed. The customer chooses an estimated weight, the shop prepares the actual cut, and the final price is confirmed after weighing.

Next.js 16React 19Drizzle ORMPostgreSQL 16Better AuthTransactional emails via AWS SES
farmhouse.sk
Farmhouse.sk — full page preview
Context and challenge

When an online store depends on how the shop actually works

Farmhouse is an artisan butcher with physical shops, in-store pickup, and local delivery. For this kind of assortment, the online store had to align with the daily operations of the shop, rather than function as a standard catalogue store. This includes meat preparation, available pickup points, delivery zones, holidays, and customer communication.

The original WooCommerce store helped validate online sales, but over time plugins, custom changes, and business rules started to overlap in ways that were hard to control. The store was selling, but day-to-day operations required too many checks and manual corrections.

No downtime

Migration of orders, customers, and products

4 zones

Local delivery by postal code and delivery rules

1 calculation

The same calculation in checkout, admin, and invoices
Where the old setup broke down

This was not a design problem. It started with the order itself.

Before designing the new platform, we had to name where the old store no longer matched the reality of the shop. The main friction was not the homepage. It appeared when an online order became real work for the team.

01
The same order could end up with a different total The calculation was split between WooCommerce, plugins, and custom changes, so it did not always produce the same result. With weight-based products, discounts, delivery, VAT rates, and cash payment rounding, differences could appear in checkout, admin, or even on the invoice. The result was manual intervention and follow-up corrections.
02
The real weight is known only during preparation A customer might order 500 g, but the shop prepares a cut with a different actual weight. That means the order cannot have a fixed final price at the moment it is placed.
03
Preparation instructions belong to the item Slice it, mince it, or keep it whole is not a note at the end of an order. It is a specific instruction for a specific product, and the team needs to see it during preparation.
04
Invoices and credit notes have to come from the final order For every order, it had to be clear which amount the invoice was based on. Invoices and credit notes therefore come from the final order after weighing, not from a fresh catalogue calculation.
05
Operational rules were scattered Delivery zones, holidays, pickup points, coupons, notices, and VAT rates needed their own management. They should not be hidden in a theme or spread across a stack of plugins.
Original WooCommerce adminNew admin panel
PÔVODNÝ WOOCOMMERCE
NOVÝ SYSTÉM
Designed around operations

One platform for the website, the shop, and store management

The project was not just a new look for the online store. Farmhouse now runs on a separate storefront, admin, and API layer where business rules, content, delivery, customer accounts, and orders are managed in one place.

Customer

A purchase flow that makes sense from category to cart

Category pages, product detail, and cart use the same language and the same rules. Customers can see what they are ordering, how the product will be prepared, and what can still affect the final amount.

Shop

Admin built for real order preparation

The team sees items, preparation options, notes, pickup or delivery method, and order status. The admin is designed for people who physically prepare orders, not just record them.

Management

Rules can be managed without changing the storefront

Products, categories, shops, holidays, notices, VAT rates, and store settings are structured data. They can be changed without touching the visual layer or the purchase flow.

Delivery

Delivery by postal code and available days

Local delivery works with zones, delivery fees, free-delivery thresholds, and holidays. Customers can see during the purchase whether and how their order can be delivered.

Pricing

One pricing logic from cart to invoice

Price calculation lives in the API layer. The storefront, admin, and documents therefore do not work from three different interpretations of the same order.

Coupons

Discounts with clear rules

Coupons can handle validity, minimum order value, usage limits, products, categories, and whether they can be combined with an in-store pickup discount.

States

Order changes stay traceable

Every order change stores its status, note, and author. The team can later check what happened to the order and why.

Account

Orders and invoices in the customer account

Signed-in customers have a profile, address, order history, and access to invoices. Farmhouse becomes more than a one-off purchase channel for returning customers.

Weight-based selling

Weight, preparation, and final price in one purchase flow

Products sold by weight needed a different purchase step than a standard online store. Customers choose an estimated weight, see the price per 100 g, and understand that the exact amount is confirmed only after the order is prepared.

Original WooCommerce
Farmhouse — WooCommerce product detail

Before: Weight, price, and preparation were handled as custom tweaks to a generic online store that did not naturally understand selling by actual weight.

New solution
Farmhouse — new product detail

After: On the product detail page, customers choose the weight, select the preparation method, and see both an estimated price and help with choosing the right amount.

01

Weight selection without guesswork

Customers choose from prepared weight options and immediately see the price for the selected weight as well as the price per 100 g. It is also clear that the final amount will be adjusted to the cut that is actually prepared.

  • prepared weight options
  • price for the selected weight
  • price per 100 g
02

Help with estimating quantity

With meat, customers often care not only about price but also about how much to buy. The helper on the product detail page estimates the recommended weight based on the number of portions.

  • portion-based estimate
  • less uncertainty while choosing
  • more useful product detail
03

Instructions directly on the product

Customers choose slicing, mincing, or whole-piece preparation for the specific product. During preparation, the shop sees the exact instruction that belongs to each item.

  • preparation choice per product
  • instructions visible in admin
  • fewer follow-up clarifications
UX and visual redesign

A redesign of the whole purchase flow, not just the homepage

For Farmhouse, changing the look of the website was not enough. The important screens were the ones where customers choose a product, review the cart, or complete the order. The specifics of the shop had to be built into the interface, not explained somewhere on the side.

Categories and product listing
01

Categories and product listing

Product cards had to quickly show the assortment, base price, availability, and the difference between a standard product and a product sold by weight.

Before

Categories felt like a generic product list, and the specifics of weight-based products were not clear enough.

After

The category page separates product types more clearly and helps customers decide before opening the detail page.

BeforeProduct detail — before
AfterProduct detail — after
02

Product detail

The product detail had to connect the purchase decision with what the shop would actually prepare.

Before

Weight and preparation choices felt like technical WooCommerce product adjustments rather than a natural purchase step.

After

The new detail gives customers quantity, preparation choices, and practical information in one place.

Cart
03

Cart

The cart had to bring together items, coupon, pickup or delivery method, and payment on pickup without making the flow feel like a technical exception.

Before

The cart showed the amount like a standard online store, which created the expectation of a fixed price for fresh meat.

After

The new cart explains the items, payment method, and next step of the order more clearly.

BeforeCheckout — before
AfterCheckout — after
04

Checkout

Checkout brings together local delivery, in-store pickup, contact details, delivery rules, and the order summary without requiring customers to understand the shop's internal rules.

Before

Checkout depended on WooCommerce and plugin rules that could not naturally explain local delivery, in-store pickup, and weight-based pricing.

After

The new checkout guides customers through delivery or pickup, contact details, and order confirmation without unnecessary explanation.

BeforeAdmin — before
AfterAdmin — after
05

Admin

The admin is not just an order table. It is designed for preparation, status checks, documents, and customer communication.

Before

The team worked in an environment built for a generic online store, not for preparing meat by actual weight.

After

The admin shows the order in the same way the team works with it during preparation and fulfillment.

Migration without chaos

Moving from WooCommerce without stopping sales

This was not only a redesign. Products, images, customers, order history, weight settings, categories, and delivery rules had to be moved without stopping sales.

01
Original WordPressZáloha a extrakcia starých produktov, kategórií a cien z WooCommerce tabuliek.
02
Controlled migrationThe data was cleaned, checked, and only then moved into the new structure. The important part was preserving business rules, not just copying products and text.
03
Modern PostgreSQLClean data imported with new attributes for weight-based selling logic.
WooCommerce
Original WordPress
Scattered rules
WordPress metadata
post_idmeta_keymeta_value
452_price"12.90"
452_weight_pricing"yes"
452_manage_stock"no"

Products, settings, and custom fields were stored in a way that worked for WordPress, but was weaker for custom pricing logic, filtering, and data checks.

TRANSFORMATION
PostgreSQL
Modern PostgreSQL
Controlled data
Clean data structure
column_namedata_typevalue
iduuid"prod_82a3..."
price_per_kgnumeric12.90
can_slicebooleantrue

Products, categories, orders, customers, invoices, shops, and delivery zones each have a defined place. The system can run precise checks and calculations on top of them.

Technical foundation

Storefront, admin, and API layer instead of a plugin stack

Farmhouse no longer depends on a fragile mix of plugins on shared hosting. The public storefront, admin, and API layer are separate services that can be deployed in a controlled way, tested, and quickly rolled back if something goes wrong.

Separate services for each part of the system

The API layer, admin, and public storefront run independently. A change in one part does not have to affect the entire purchase flow.

Deployment without downtime

A new version is prepared outside the live application and switched to production only after checks. If something fails, the system can quickly return to the previous stable version.

Security audit in CI

Deployment includes dependency checks, application builds, and type checking. Problems should be caught before they reach customers or the admin team.

Clear separation of responsibilities

The storefront handles shopping, the admin supports the team's work, and the API layer holds the rules for orders, prices, invoices, and communication. Each part has a clear role and does not have to compensate for the rest of the system.

Data ready for future development

Products, customers, orders, delivery, shops, and invoices are stored in a clean database structure. New features can be added on top of data with a clear meaning.

Control over the operation

The system is not tied to a closed rental platform or a random mix of plugins. Farmhouse has its own code, its own data, and a foundation that can keep evolving.

Prepared for an app

A platform ready for a mobile app

The platform was designed so Farmhouse would not remain tied only to the web. A mobile app can use the same products, cart, customer account, delivery rules, and server-side price calculation without rewriting the business logic.

The same cart and weight-based products

The mobile cart can work with weight, slicing, mincing, and item options. The app can therefore follow the same selling model as the website.

Delivery by postal code

The app is ready for delivery checks by postal code and delivery zone. Customers can check whether delivery is available in their area before placing an order.

In-store pickup and shops

The purchase flow also supports in-store pickup, shop selection, and contact details for pickup. The mobile channel uses the same operational rules as the website.

Customer account and secure sign-in

The app is ready for customer accounts, profiles, and order history. Tokens are stored in secure device storage, not in ordinary local state.

The server calculates the price

The mobile app should not decide the price on its own. Weight, items, discounts, and the final amount are confirmed through the API layer so the website and app use the same pricing logic.

Room for more channels

The separated storefront, admin, and API layer make it possible to add a mobile app without rewriting the core system. The website, app, and admin can work with the same data.

Questions and answers

What mattered in the project

Máte ďalšie otázky?

Ak ste nenašli odpoveď na to, čo vás zaujíma, neváhajte nám napísať na [email protected].

[email protected]

Farmhouse needed control over its business rules: products sold by weight, item preparation, delivery zones, pickup points, customer accounts, and documents. In the original WooCommerce setup, these parts were assembled from plugins and custom changes.

The admin shows items, preparation method, notes, order status, pickup or delivery, and documents in one place. The team no longer has to piece information together from different parts of the system.

Products, categories, shops, holidays, delivery zones, notices, coupons, and VAT rates are separate from the visual layer of the storefront. Everyday operational changes do not have to mean changing code.

Coupons are not blindly combined with everything else. The system checks coupon validity, usage limits, minimum order value, product and category rules, and compatibility with the in-store pickup discount.

Farmhouse uses transactional emails for order confirmation, status changes, cancellation, credit notes, and customer accounts. Invoices and credit notes are generated from the final order data, not from the current catalogue.

For Farmhouse, we needed a solution that would not only look good, but also understand how we really work with orders, weight, and meat preparation. Nolimeo understood our processes and turned them into a functional online store.

Farmhouse Logo

Marián Petrík

Managing Director, Farm House store network

Interested in pushing your project forward?