Skip to content

CROPIA - Harvest Operations Dashboard

Business Analysis & Solution Design

Python (Pandas, NumPy)SQLReactForecasting

Cropia runs the daily picking operation of a 440-tonne strawberry and raspberry farm: around 60 plots, 20 varieties, and a product that has to be sold the day it is picked. I designed and built it for the business I had spent four years working in. It is now used every day by four people across four different jobs.

_screenshots coming soon

The business

A fruit farm makes one decision every morning: how much to pick today. Pick too much and the fruit is unsold and gone within two days. Pick too little and you cannot supply the buyer negotiating price and volume at six in the morning.

That decision depends on three things: what is already in the cold store, what is committed to sell today, and what each plot is likely to give. Around 60 plots, 20 varieties, 440 tonnes a year, 50+ seasonal pickers at peak. Yield varies from plot to plot, and even between the top and the bottom of the same plot, depending on soil, planting density and the age of the plants.

What was actually happening

Two systems that did not talk to each other. Picking was entered into a program written in Pascal twenty years ago. Everything else lived in a Google Sheets I had set up four years earlier, which the team used every day.

In practice that meant a physical loop. To check the day's figures you drove to the cold store, printed the picking sheets, came back to the house, opened the spreadsheet and checked the two matched. My father did it. I did it. Every day, and again at midday to check sales.

The second friction was smaller and constant. To price a sale, the salesperson opened the current week's sheet, then opened last week's in a second tab, to see what that client had paid and where prices were going.

Constraints

The users. Four people who are not comfortable with software and who had been using the same spreadsheet daily for four years. Anything that asked them to relearn how they work would not get used, whatever it did.

One developer. Me. No team, no design phase, no budget.

The history. Ten years of production records, all extracted from the same Pascal program but in two different shapes, before and after an update I had asked the original developer for. Neither shape was clean. Before any of it could support a forecast, it had to be reconciled into one consistent history.

_client

Etablissement Brajon Frères

_industry

Agriculture / Food production

_work

Process Mapping

Data Modelling

Dashboard Development

_date

February 2025 - Present

CROPIA - Harvest Operations Dashboard walkthrough

_01 the interface

I made the new interface look like the old spreadsheet

Deliberately. The Google Sheets was not elegant, but it was understood. My earlier attempts at a different layout were worse, and the moment I designed the screens around the sheet the team already knew, adoption stopped being a question. Familiarity was worth more here than a better-looking interface.

_02 cascading filters

Cascading filters instead of one long list

Selecting a plot used to mean scrolling a very long list: every variety, and inside each variety every plot growing it. Now you pick a fruit, strawberry or raspberry, which narrows to its varieties, which narrows to its plantings. The final list is a few lines. It is the single most repeated action in the tool, so it was the first thing to fix.

_03 price history

Price history where the decision is made

When you create a sale and select a client, the price history for that client and product appears below the form as a curve. No second tab, no last week's sheet. The information arrives at the moment the price is being decided.

_04 stock

Stock as a daily loop

Picking minus sales gives a theoretical closing stock. It is checked against the cold room in the evening and carried into the next morning, where it sets how much needs to be picked. That loop is the operation, so the tool is built around it rather than around reporting.

_05 forecasting

Forecasting at plot level

Forecasting by variety would hide what matters, because two plots of the same variety do not yield the same and neither do the two ends of one plot. The forecast combines supplier yield curves with each plot's own history, and rolls up to variety or to the whole farm when a wider view is needed.

What I built, and what I did not

Built: picking, planting, sales, invoicing, stock, and plot-level forecasting.

Left out: plant protection records, and per-plot tracking of what each employee did. Plant protection would not have been difficult, which is precisely why I had to be deliberate about it. The tool needed to do the core of the business properly, and be trusted doing it, before it did anything else. When I moved abroad we agreed to drop it rather than build it remotely.

Taken further than the immediate need: team invitations and permissions, and the beginnings of a multi-entity structure that would let a cooperative manage several farms. That part is not finished. I built it because the problem is not specific to one farm, and I did not want the data model to rule that out later.

What I got wrong

Two things, both pointed out by someone else. My uncle works in IT and I asked him to look at what I had built.

I had modelled access as broad roles: salesperson, crop manager, picker, data entry. That maps to how the farm is organised, which is why it felt right. It is also wrong, because a role describes a person and what you actually need to control is an action. As soon as one person wears two hats, or another farm organises itself differently, roles break. Access is now set per item, with read, write and edit separated, and the same granularity applied to the admin section.

I had also built the navigation hierarchy around data entry, fruit down to variety down to plot, and then found I could not query in the other direction. Weight by variety, weight by plot, and the cascade got in the way. A hierarchy optimised for entering data is not a hierarchy for analysing it, and the tool needed both. Filters now work in both directions.

Both are implemented and in production.

Where it stands

Cropia is used daily by four people covering four jobs: the farm manager, the salesperson, the crop manager and invoicing, plus a separate entry account in the cold store. The Pascal program has been retired.

It is in its first full harvest season, and it has run for two months without a change. The yield data is starting to feed planting decisions for next season: which plots and varieties performed, and what gets replanted.

What I would do differently

Both corrections above are things I would now design in from the start: permissions modelled as actions rather than roles, and an analysis hierarchy sitting alongside the entry hierarchy. Neither is a hard idea. I just did not see them until the tool was in real use and someone from outside asked the right question.

The wider lesson is the one that moved me out of operations. Most of the problems I had spent four years solving by hand were data problems. Once the data was in one place and could be queried, the operational decisions got easier on their own.

_next project

Dental Practice Website - Barbara Freitas

Website and SEO for Dr. Barbara Freitas, a dental therapist who had no online presence

CROPIA - Harvest Operations Dashboard | Brajy