FarmiCrop
v1.0.0Farm Management System
Installation
Everything needed to get FarmiCrop running — server requirements, license activation, and full walkthroughs for Hostinger and cPanel.
Thank you for purchasing FarmiCrop — Farm Management System. This section takes you from a bare server to a working install.
- Version: v1.0
- Author: Stackwebify
- Framework: Laravel 13 + Inertia + Vue 3
Server Requirements
The minimum server stack, PHP extensions and settings FarmiCrop needs.
Before installing, make sure your server meets the requirements below. The installer checks all of these for you on its first step and refuses to continue until each one passes.
- PHP 8.2 or higher
- MySQL 8.0+ or MariaDB 10.6+
- Web server: Apache or Nginx
Disk space
~ 500 MB minimum. Allow extra space for uploaded media and attachments.
Required PHP extensions
All of the following must be enabled. Most hosts ship them by default; on cPanel you can toggle them under Select PHP Version → Extensions.
- OpenSSL, PDO, Mbstring, Tokenizer, JSON, cURL, XML, Ctype, BCMath, Zip, Exif, Fileinfo
PHP settings
The installer unpacks files and runs migrations, so a few php.ini values need headroom:
memory_limit = 256M
max_execution_time = 300
upload_max_filesize = 64M
post_max_size = 64MJust as important, no required function may be disabled. The disable_functions directive should be empty:
disable_functions =Common blocker: many shared hosts disableproc_open,proc_get_status,symlinkorexec. If the installer stalls, ask your host to re-enable them for your account.
Folder permissions
These folders must be writable at 0775 or higher before the installer will continue:
storage/frameworkstorage/logsstorage/appbootstrap/cache
Tip: the installer's Permissions step includes a Fix Permissions button that sets these for you, so you rarely need to do it by hand.
Web server rewrite
Apache needs mod_rewrite enabled (or the Nginx equivalent). Where possible, point the document root at the /public directory rather than the project root — that is the safest setup.
On shared hosting you usually cannot change it. That is fine: the package ships a root.htaccessthat forwards every request intopublic/, so the app still works with the document root left atpublic_html. Both the Hostinger and cPanel guides cover this.
Active Purchase Key
Activate your purchase key to unlock updates and support.
Activate your purchase key to unlock updates and support. Follow these steps:
- Register an account on the Stackwebify portal.
- Verify your email address from the confirmation link.
- Log in and open the Licenses page.
- Click the Activate License button, then select your project in the modal.
- Paste the purchase code you received from CodeCanyon.
- Enter the domain name you want to install the script on.
- Copy the generated license key — you'll need it during installation.
Hostinger Setup
Step-by-step installation on Hostinger shared hosting — no SSH or command line needed.
This is the recommended path for users without a VPS or technical experience. FarmiCrop is fully compatible with the cheapest Hostinger Single Web Hosting plan. No SSH, no Composer, no command line needed — Single includes native cron jobs, PHP 8.2+ and free SSL out of the box.
Tested on: Hostinger Single, Premium and Business plans (PHP 8.2+, MySQL 8.0+, native Cron Jobs included on all tiers).
Step 1 — Set PHP version and extensions
- Login to Hostinger hPanel.
- Go to Hosting → Manage for your domain.
- Set the PHP version to 8.2 or 8.3 via Advanced → PHP Configuration.
- Open the PHP Extensions tab and make sure these are enabled (usually default):
OpenSSL, PDO, Mbstring, Tokenizer, JSON, cURL, XML, Ctype, BCMath, Zip, Exif, Fileinfo
Step 2 — Enable SSL (HTTPS)
- Go to Security → SSL and install the free SSL certificate for your domain.
- Turn on Force HTTPS.
Tip: do this before running the installer. The installer saves whichever URL you visit it on, so your site URL is stored as https:// from the start.Step 3 — Create MySQL database and user
- In hPanel, go to Databases → MySQL Databases.
- Click Create New Database — Hostinger creates the database and its user together, already granted full privileges.
- Note these 3 values:
- Database name — e.g.
u123456789_farming - Username — e.g.
u123456789_admin - Password — auto-generated, keep it safe
- Database name — e.g.
Important: Hostinger prefixes both the database name and the username with your account ID. Copy the full prefixed values, not what you typed.
Step 4 — Upload files
- Go to Files → File Manager in hPanel.
- Navigate to
public_html/(this is your domain's root). - Delete any default
index.htmlordefault.phpin that folder. - Click Upload Files and upload the
source.zipfrom the package. - Right-click the ZIP → Extract. After extraction, all files should be at the root of
public_html/. - Verify
public_html/contains:app/,public/,vendor/,artisan,.htaccess.
Important: make sure.htaccessexists both at thepublic_html/root and insidepublic/. They contain the URL rewriting rules. If File Manager hides hidden files, click Settings → Show hidden files.
Step 5 — Point the domain at /public
Laravel serves from public, so the document root must be changed. In hPanel go to Domains → your domain and set the document root to public_html/public.
If your plan will not let you change the document root: leave it atpublic_html. The package ships a root.htaccessthat forwards every request intopublic/, so the site still works. Do not move files around or editindex.php.
Step 6 — Set folder permissions
In File Manager, right-click each of storage and bootstrap/cache, choose Permissions, set them to 775 and tick Apply to subdirectories.
Note: the installer checksstorage/framework,storage/logs,storage/appandbootstrap/cache, so recursing into subdirectories matters. If you miss this, the installer offers a Fix Permissions button that repairs it for you.
Step 7 — Run the web installer
Open your browser and go to https://yourdomain.com/install. You will see the FarmiCrop installer.
- Welcome — the start screen. Your application key is generated automatically here; there is nothing to edit by hand.
- Requirements — all checks should pass (green). If any fail, enable the missing PHP extension in Advanced → PHP Configuration, or contact Hostinger support.
- Permissions — confirms the storage folders are writable. Use Fix Permissions if a row is red.
- License — paste the license key from Active Purchase Key. It is checked against the domain you are installing on, so the domain must match the one you registered.
- Site Info — enter your site name and application URL. The URL is pre-filled; confirm it reads
https://. - Database — enter the credentials from Step 3. The connection is tested before you can continue.
- Install — runs migrations and seeders, then caches the config. Takes up to a minute. Do not refresh.
- Done — you will see a button to log in.
Wizard field examples for the Database step:
| Field | Value |
|---|---|
| Host | localhost |
| Port | 3306 |
| Database | u123456789_farming |
| Username | u123456789_admin |
| Password | the one Hostinger generated |
Log in with the default account created during seeding:
- Email:
admin@example.com - Password:
12345678
Change the default password immediately after your first login. Using the default credentials in production is a serious security risk.
Step 8 — Setup automatic email alerts via Hostinger Cron
FarmiCrop uses Laravel's scheduler for background tasks. Set up one cron job in hPanel and Laravel decides which task to run when.
- In hPanel, go to Advanced → Cron Jobs.
- Click Create Cron job.
- Select type: Custom (not "PHP" — we need to pass an argument).
- For the command, enter the following (replace
uXXXXXXwith your Hostinger account username):
/usr/bin/php /home/uXXXXXX/public_html/artisan schedule:run- Set the schedule to Every minute — all five fields (Minute, Hour, Day, Month, Day of week) set to
*. - Click Save.
Tip: open File Manager, locate the artisan file (root of your project), right-click → Properties to copy the full path.That's it — FarmiCrop now runs its scheduled tasks automatically. Laravel internally schedules each job at its correct frequency (daily 08:00, monthly, etc.).
Document root set topublic_html/public? No problem — your Laravel code still lives at thepublic_htmlroot, so the cron path remains/home/uXXXXXX/public_html/artisan(don't add/public/).
Fallback for hosts without cron: if your provider lacks cron jobs, FarmiCrop also exposes a webhook trigger URL. Log in as admin → Settings → System tab → copy your Cron URL. Sign up free at cron-job.org, create a cronjob, paste the URL, set Every 15 minutes and save.
Troubleshooting on Hostinger
"500 Internal Server Error" after upload
- Verify
.htaccessexists atpublic_html/root and contains the rewrite rules. - Verify PHP version is set to 8.2 or 8.3 in hPanel.
- Check
storage/logs/laravel.logvia File Manager for the actual error.
"Permission denied" on uploads
Hostinger usually sets correct permissions, but if not:
- Right-click
storage/in File Manager → Permissions → set to 775 recursively. - Same for
bootstrap/cache/. - Or simply re-run
/installand use the Fix Permissions button on the Permissions step.
cPanel Setup
Step-by-step installation on any cPanel host, using File Manager only.
These steps apply to any host running cPanel. Everything is done through the cPanel UI — no Terminal or SSH access is needed at any point.
No Terminal in cPanel? This is normal on many shared plans, and it is not a problem. The web installer handles the application key, the .env file, migrations and seeding for you, so nothing on this page requires a command line.Step 1 — Set PHP version and extensions
- Access your cPanel account.
- Navigate to MultiPHP Manager (or Select PHP Version) and configure your domain to use PHP 8.2 or 8.3.
- Open MultiPHP INI Editor or the PHP Extensions section.
- Verify these extensions are activated:
OpenSSL, PDO, Mbstring, Tokenizer, JSON, cURL, XML, Ctype, BCMath, Zip, Exif, Fileinfo - If any extension is absent, enable it via the extensions menu or request activation from hosting support.
- In the Options tab, raise these values:
memory_limit = 256M
max_execution_time = 300
upload_max_filesize = 64M
post_max_size = 64MStep 2 — Enable SSL (HTTPS)
- Go to SSL/TLS Status (or Let's Encrypt SSL / AutoSSL).
- Execute Run AutoSSL or install a free certificate for your domain.
- Once issued, enable Force HTTPS Redirect under Domains.
Tip: wait a few minutes after enabling SSL, then visithttps://yourdomain.comto confirm the padlock icon appears. Do this before running the installer, so your site URL is saved ashttps://.
Step 3 — Create MySQL database and user
- Open Manage My Databases (under Databases).
- Under Create New Database, enter a name like
farming. cPanel automatically prefixes it — the final name will resemblecpaneluser_farming. - Under MySQL Users, set up a user with a secure password and copy the full prefixed username.
- Under Add User To Database, select the user and database, click Add, then grant ALL PRIVILEGES.
- Record these three values exactly as shown in cPanel:
- Database name — e.g.
cpaneluser_farming - Username — e.g.
cpaneluser_admin - Password — store securely
- Database name — e.g.
Important: the Add User To Database step is critical — skipping it causes Access denied (1045) errors during installation.Step 4 — Upload files
- Open File Manager and navigate to
public_html/(your domain's document root). - Enable Settings → Show Hidden Files so
.htaccessand.envare visible. - Delete any default
index.htmlinpublic_html/if it exists. - Upload the package
source.zipand Extract it, or upload the/source/contents via FTP. - After extraction,
public_html/must contain:app/,public/,vendor/, a root.htaccess, andartisanat the project root level.
Important: the root.htaccessredirects all requests to thepublic/folder — you do not need to change the document root manually on most hosts.
Step 5 — Set folder permissions
In File Manager select storage, click Permissions, set 775 and tick Recurse into subdirectories. Repeat for bootstrap/cache.
Note: the installer checksstorage/framework,storage/logs,storage/appandbootstrap/cache, so recursing matters. If you miss this, the installer offers a Fix Permissions button that repairs it for you.
Optional — pointing the domain at/public: the root.htaccessalready routes requests intopublic/, so this is not required. If you prefer the stricter setup, open Domains, click Manage next to an addon or subdomain and set its document root topublic_html/public. cPanel usually locks the primary domain topublic_html, which is exactly why the root.htaccessexists.
Step 6 — Run the web installer
Open your browser and go to https://yourdomain.com/install. You will see the FarmiCrop installer.
- Welcome — the start screen. Your application key is generated automatically here; there is nothing to edit by hand.
- Requirements — all checks should pass (green). If any fail, enable the missing extension under Select PHP Version → Extensions.
- Permissions — confirms the storage folders are writable. Use Fix Permissions if a row is red.
- License — paste the license key from Active Purchase Key. It is checked against the domain you are installing on, so the domain must match the one you registered.
- Site Info — enter your site name and application URL. The URL is pre-filled; confirm it reads
https://. - Database — enter the credentials from Step 3. The connection is tested before you can continue.
- Install — runs migrations and seeders, then caches the config. Takes up to a minute. Do not refresh.
- Done — you will see a button to log in.
Wizard field examples for the Database step:
| Field | Value |
|---|---|
| Host | 127.0.0.1 or localhost |
| Port | 3306 |
| Database | cpaneluser_farming |
| Username | cpaneluser_admin |
| Password | your MySQL password from Step 3 |
Log in with the default account created during seeding:
- Email:
admin@example.com - Password:
12345678
Change the default password immediately after your first login. Using the default credentials in production is a serious security risk.
Step 7 — Setup automatic email alerts via cPanel Cron
FarmiCrop uses Laravel's scheduler for background tasks. Set up one cron job in cPanel and Laravel decides which task to run when.
- From the cPanel home screen, open Advanced → Cron Jobs.
- Under Add New Cron Job, choose Once Per Minute from the Common Settings dropdown — this fills all five fields with
*. - For the command, enter the following (replace
CPANELUSERwith your cPanel account username):
/usr/local/bin/php /home/CPANELUSER/public_html/artisan schedule:run- Click Add New Cron Job.
Tip: open File Manager, locate theartisanfile (root of your project), right-click → Properties to copy the full path. The PHP binary path also differs between hosts — most cPanel servers use/usr/local/bin/php, but some use/usr/bin/phpor a version-specific path such as/opt/cpanel/ea-php82/root/usr/bin/php. Check Select PHP Version or ask your host if the job does not run.
That's it — FarmiCrop now runs its scheduled tasks automatically. Laravel internally schedules each job at its correct frequency (daily 08:00, monthly, etc.).
Document root set topublic_html/public? No problem — your Laravel code still lives at thepublic_htmlroot, so the cron path remains/home/CPANELUSER/public_html/artisan(don't add/public/).
Fallback for hosts without cron: if your provider lacks cron jobs, FarmiCrop also exposes a webhook trigger URL. Log in as admin → Settings → System tab → copy your Cron URL. Sign up free at cron-job.org, create a cronjob, paste the URL, set Every 15 minutes and save.
Troubleshooting on cPanel
"Access denied for user" (SQLSTATE 1045)
- Verify the database name and username match cPanel exactly, including the account prefix.
- Confirm you completed the Add User To Database step with ALL PRIVILEGES granted.
- Reset the MySQL password in cPanel and re-enter it in the installer's Database step. Passwords containing special characters are a common cause.
"403 Forbidden"
.htaccesswas not extracted. Enable Show Hidden Files in File Manager and confirm one exists both at thepublic_html/root and insidepublic/.- If you changed the document root manually, confirm it points to
public_html/public.
"500 Internal Server Error"
- Check Metrics → Errors in cPanel for the actual message.
- Check
storage/logs/laravel.logvia File Manager. - Usually a permissions problem — set
storage/andbootstrap/cache/to 775 recursively.
Migration fails after the Database step passed
- Delete
bootstrap/cache/config.phpif present, then retry the installer. - Confirm the MySQL user still holds ALL PRIVILEGES — some hosts reset this when the password changes.
- Raise
max_execution_timeto 300 under Select PHP Version → Options; a timeout mid-migration looks like a failure.
Page loads without CSS
- The site URL was saved as
http://. Update it under Settings → General after enabling SSL.
Scheduled tasks never run
- Confirm the Step 7 cron job exists and the path to
artisanis correct. - Verify the PHP binary path — see the tip in Step 7, as it differs between hosts.
Modification & Development Setup
For buyers who want to edit the source: IDE, PHP/Composer, Node/npm, Wayfinder, npm run build and deploying your changes.
This page is for buyers who want to change the code — edit a Vue page, add a field, adjust a colour, or add a language. The steps on the previous pages install the app as shipped and need no tooling; this one sets up a local development environment.
Do you actually need this? If you only want to change your site name, logo, currency, roles or email settings, do it inside the app under Settings — no code and no tooling required. Come back here only when you want to modify the source itself.
Never edit code directly on your live server. The files inpublic/build/are compiled output. Editing a.vuefile on the server changes nothing until it is rebuilt, and running a build on shared hosting usually fails or exhausts memory. Always work locally, then upload the result — see Step 8.
Step 1 — Install a code editor (IDE)
Any editor works, but these understand Laravel, Vue and TypeScript out of the box:
- VS Code — free, recommended. Download from code.visualstudio.com. Useful extensions: Vue - Official (Volar), PHP Intelephense, Tailwind CSS IntelliSense, ESLint, Prettier.
- PhpStorm — paid, the strongest Laravel support. Install the Laravel Idea plugin if you have it.
- Cursor / Windsurf — VS Code forks with AI built in; the same extensions apply.
Tip: open the project by its root folder (the one containingartisan), not a subfolder. Path aliases such as@/components/...only resolve when the editor seestsconfig.jsonat the top level.
Step 2 — Install PHP and Composer
The backend is Laravel 13, which requires PHP 8.3 or higher.
- Install PHP 8.3+:
- Windows — the simplest route is Laravel Herd, which bundles PHP, Composer and a local web server in one installer. Alternatively use XAMPP or Laragon.
- macOS — Laravel Herd, or
brew install php. - Linux — install
php8.3plus the extensions listed under Server Requirements.
- Install Composer (PHP's package manager) from getcomposer.org — Herd already includes it.
- Confirm both are on your PATH by opening a new terminal:
php -v
composer -VBoth must print a version. If php is "not recognised" on Windows, add the PHP folder to your system PATH and reopen the terminal.
Step 3 — Install Node.js and npm
The frontend is Vue 3 + Vite, built with Node. Install the current LTS release (Node 20 or 22) from nodejs.org. npm ships with it — there is nothing separate to install.
node -v
npm -vNote: Node is a build-time requirement only. Your production server never needs Node — it only serves the compiled files from public/build/.Step 4 — Set up the project locally
- Unzip the package
source.zipinto a local folder and open it in your editor. - Install the PHP dependencies:
composer install- Install the JavaScript dependencies:
npm install- Create your environment file and application key:
cp .env.example .env
php artisan key:generate- Open
.envand set your local database credentials (DB_DATABASE,DB_USERNAME,DB_PASSWORD), then create the schema:
php artisan migrate --seed- Link the storage folder so uploaded media is reachable:
php artisan storage:linkOn Windows usecopy .env.example .envinstead ofcpif you are in Command Prompt or PowerShell rather than Git Bash.
Step 5 — Generate the Wayfinder route helpers
This app uses Laravel Wayfinder, which turns your PHP routes and controllers into typed TypeScript functions that the Vue pages import. Those generated files are what make store(), update() and .form available in the frontend.
php artisan wayfinder:generate --with-formThe--with-formflag is required — do not omit it. This project'svite.config.tsenablesformVariants: true, so the Vue pages rely on the.formvariant of each route helper. Running a barephp artisan wayfinder:generatestrips those variants app-wide and the build then fails with errors such as "Property 'form' does not exist". If that happens, simply re-run the command above with the flag.
Regenerate whenever you add, rename or remove a route or controller method. You rarely need to run it by hand — npm run dev and npm run build both trigger Wayfinder automatically through the Vite plugin, with the form variants included.
Step 6 — Run the development server
Open two terminals in the project root:
php artisan servenpm run devVisit http://localhost:8000. Vite serves the assets with hot reload, so saving a .vue file updates the browser instantly.
Keepnpm run devrunning while you work. If you stop it and the page then looks unstyled or throws a Vite manifest error, either restart it or runnpm run buildonce to produce static assets.
Step 7 — Where to change things
| What you want to change | Where to look |
|---|---|
| A page or screen | resources/js/pages/ — mirrors the route names |
| Shared UI components | resources/js/components/ (components/ui/ holds the shadcn primitives) |
| Sidebar menu and grouping | resources/js/components/NavMain.vue |
| Colours, fonts, dark mode | resources/css/app.css — CSS variables for both themes |
| Text and translations | lang/en/ plus the matching JSON namespaces per locale |
| Business logic | app/Services/ |
| Validation rules | app/Http/Requests/ |
| Routes | routes/web.php |
| Permissions and roles seed | database/seeders/ |
Adding a language? Copylang/en/to a new locale folder (for examplelang/de/), translate the values — keeping every key unchanged — and register the locale so it appears in the language switcher. Locales load as separate lazy chunks, so a new language does not slow down the initial page load.
Step 8 — Build for production and upload
When your changes are ready, compile the assets:
npm run buildThis writes the optimised bundles into public/build/. Then upload to your server:
- Upload the source files you edited (for example anything under
app/,resources/,routes/,lang/). - Upload the entire regenerated
public/build/folder, replacing the old one. This step is the one people forget — without it your frontend changes will not appear, because the browser still loads the previous bundle. - If you changed config, routes or added migrations, clear the caches and run any new migrations:
php artisan migrate --force
php artisan optimize:clear
php artisan optimizeNo SSH on your host? Log in as admin and use Settings → System to clear the application cache, and upload files through cPanel File Manager as usual.
Always back up first. Take a copy of your database and your current files before uploading modified code, so you can roll back if something breaks.
Optional — code quality checks
The project ships with the standard Laravel and Vue tooling already configured:
npm run lint # ESLint, auto-fixes
npm run format # Prettier
npm run types:check # vue-tsc, TypeScript errors
./vendor/bin/pint # Laravel Pint, PHP formatting
php artisan test # Pest test suiteRun npm run types:check before uploading. It catches broken imports and missing Wayfinder helpers that a running dev server may not surface until that exact page is opened.Troubleshooting
"Property 'form' does not exist" during build
- Wayfinder was generated without form variants. Re-run
php artisan wayfinder:generate --with-form, or justnpm run build, which does it correctly.
npm install fails
- Check
node -vreports Node 20 or newer. - Delete
node_modulesandpackage-lock.json, then runnpm installagain.
composer install reports a platform requirement error
- Your PHP is older than 8.3, or an extension is missing. Run
php -vandphp -mand compare against Server Requirements.
Changes do not appear on the live site
- You uploaded the source but not the rebuilt
public/build/folder — repeat Step 8. - Run
php artisan optimize:clear; a cached config, route or view file can mask an update. - Hard-refresh the browser to clear the old cached bundle.
Blank page after uploading
- Open
storage/logs/laravel.logfor the real error. - Confirm the PHP version on the server matches the one you developed against.
Manual
How to use FarmiCrop day to day — every screen in the app, in the order you will meet them.
This section explains how to use FarmiCrop once it is installed. Each page below matches a group in the app's sidebar, so you can follow along with the menu in front of you.
Everything is farm-scoped. Almost every screen shows data for the farm currently selected in the switcher at the top of the sidebar. Switch farms and the whole app — dashboard, lists, reports — reloads for that farm. If a menu looks empty, check which farm is selected first.
Roles
FarmiCrop ships with five roles. What each person sees in the sidebar depends on the permissions attached to their role:
- Admin — full access, including settings and roles.
- Manager — day-to-day running of a farm: crops, harvest, sales, staff.
- Supervisor — field-level work: attendance, supply usage, issues.
- Worker — their own attendance and payouts.
- Accountant — expenses, sales, wage payouts and reports.
Menus hide themselves when a role lacks permission, so two people can see very different sidebars on the same farm. Adjust this under Settings → Roles.
Getting Started
First login, creating your first farm, and the order to set things up.
After installing, log in with the admin account. The first thing to do is create a farm — until one exists and is selected, most of the sidebar stays hidden.
Create your first farm
- Click the farm switcher at the very top of the sidebar.
- Choose Add farm.
- Give it a name, then set its area unit and other basics.
- Save. The new farm is selected automatically and the full menu appears.
The same dropdown is where you switch between farms, edit a farm, or delete one. Everything you do from then on belongs to the selected farm.
Recommended setup order
Some records depend on others existing first. This order avoids dead ends:
- Farm → Fields — add your fields, with soil and irrigation types.
- Crops — add crop categories, then crops, then seasons.
- Payments — add the payment methods you use.
- Suppliers & Supplies — add suppliers and the supplies you buy.
- Workforce — add farm staff so attendance can be recorded.
- Harvest — set up grades and storage locations.
- Clients — add the buyers you sell to.
Once that base data exists you can start a crop cycle, which is where the day-to-day work begins.
Tip: you do not have to complete everything up front. Each list screen lets you add a missing record on the spot, but setting up in this order means fewer interruptions later.
Dashboard
The at-a-glance view of the selected farm.
The Dashboard is the landing page after login. It summarises the selected farm for a period you choose at the top of the page.
What you see
- KPI row — the headline numbers for the period.
- Finance — income against expenses.
- Sales and Expenses — recent movement in each.
- Harvest — what has come in.
- Crop cycles — what is currently growing and at which stage.
- Attendance — who was present.
- Supply stock and usage trend — what is running low and how fast it is being consumed.
- Issues — open problems needing attention.
- Activity — a running feed of recent changes.
Filtering
Use the filter bar at the top to change the period, or narrow the whole dashboard to specific fields. Every card below updates together.
No farm selected? The dashboard tells you so instead of showing figures. Pick a farm from the switcher to continue.
Farm & Fields
Fields, soil types, irrigation types and per-farm settings.
The Farm menu holds the physical setup of the selected farm — the land itself and how it is described.
Fields
A field is a named piece of land you plant on. Add one with its area, soil type and irrigation type. Fields are what crop cycles are attached to, so add these before planning any planting.
Soil Types
Your own list of soil descriptions — loam, clay, sandy and so on. Create the ones you use, then pick them when adding a field.
Irrigation Types
How water reaches a field — drip, sprinkler, flood, rain-fed. Same idea: define them once, then choose per field.
Farm Settings
Settings that apply to this farm only, separate from the app-wide Settings area. Use it to adjust how this particular farm behaves without affecting your other farms.
Note: soil and irrigation types are lists you control. If a field form does not offer the option you need, add it in the matching list first.
Crops & Cycles
Crops, categories, seasons and the crop cycle workflow.
The Crops menu is where you define what you grow, and then track each planting from sowing through to harvest.
Crop Categories
Broad groupings — vegetables, grains, fruit. Create these first so crops can be filed under them.
Crops List
The individual crops you grow, each under a category. Crops can also carry varieties, so you can be as specific as your record-keeping needs.
Seasons
Named periods you plant within, such as a monsoon or winter season. Seasons let you compare the same crop across years in reports.
Crop Cycles
A crop cycle is one planting of one crop on one field, and it is the backbone of the app. Harvest batches, supply usage and much of the reporting hang off it.
To start one, open Crop Cycles → Add, then choose the field, the crop and the season, and set your planned dates.
Cycle stages
Each cycle moves through these stages, and you advance it as work happens on the ground:
- Planned — created but not yet in the ground.
- Sowing — planting is under way.
- Growing — the crop is in the field.
- Ready to harvest — mature and waiting to be picked.
- Harvested — picking is done.
- Closed — the cycle is finished and settled.
A cycle can also be marked Cancelled if the planting is abandoned.
Closed and cancelled cycles are final. They stop accepting new activity, which keeps historical figures stable. Make sure harvest batches and supply usage are recorded before you close a cycle.
Every stage change is recorded, so you can look back at when a cycle moved and who moved it.
Suppliers & Supplies
Suppliers, supply items, stock movements and recording usage.
The Suppliers menu covers everything you buy and consume — seed, fertiliser, pesticide, fuel — and keeps a running stock level for each.
Suppliers
The businesses you buy from, with their contact details. Purchases reference a supplier, so add yours before recording stock coming in.
Supply Categories
Groupings for supplies — fertiliser, seed, fuel. Keeps long supply lists manageable and makes reports more readable.
Supplies
The individual items you stock, each with a unit of measure and a current quantity. This is the master list; stock levels update themselves as you record movements and usage.
Stock Movements
Every change to a supply's quantity is a movement, and each is one of these types:
- Purchase — new stock arriving from a supplier.
- Usage — stock consumed on a crop cycle.
- Return — stock sent back.
- Wastage — stock spoiled or lost.
- Replace out / Replace in — a paired swap, used when stock is exchanged.
Recording a purchase here is how stock gets into the system.
Supply Usage
Use this to log what was applied to a crop cycle — which supplies, how much, and on what date. A usage record can list several supplies at once, and each one reduces stock and adds to that cycle's costs.
Tip: record usage against the correct crop cycle. This is what makes per-cycle cost and profit figures accurate in the reports.
Workforce
Farm staff, daily attendance and wage payouts.
The Workforce menu manages the people working this farm, what days they worked, and what they are paid.
Farm Staff
The workers assigned to the selected farm, each with their wage arrangement. Add your staff here before recording attendance — the daily sheet lists exactly these people.
Attendances
Attendance is recorded on a daily sheet: pick a date and mark everyone at once, rather than editing one record at a time. Each person is marked as one of:
- Present — worked that day.
- Absent — did not attend.
- Sick — off sick.
- Leave — approved time off.
- Holiday — a non-working day.
- Off — a scheduled rest day.
Workers can see their own attendance under My attendance.
Wage Payouts
A payout gathers what is owed to staff for a period into one document, built from the attendance already recorded. Each payout moves through an approval flow:
- Draft — being prepared, still editable.
- Pending — submitted and awaiting approval.
- Approved — signed off, ready to pay.
- Paid — money has gone out.
A payout that was raised in error can be Reversed, which undoes it without deleting the record.
Record attendance first. Payouts are calculated from attendance, so a missing day means an underpayment. Check the daily sheet is complete for the whole period before creating a payout.
Workers can review their own history under My Payouts.
Harvest
Harvest batches, grades, storage locations and recording losses.
The Harvest menu records what comes off the field, its quality, where it is stored, and anything lost along the way.
Grades
Your quality bands — Grade A, Grade B, reject. Define these first, since each harvest batch is graded and buyers usually pay different prices per grade.
Storage Locations
Where harvested produce is kept — a shed, cold store or warehouse. Add yours before recording batches so each one can be placed.
Harvest Batches
A batch is one lot of produce taken from a crop cycle. Record the crop cycle it came from, the quantity, the grade and the storage location.
Batches are what you later sell, so quantities here feed straight into sales and stock on hand.
Harvest Losses
Produce lost rather than sold is recorded separately, with a reason. Keeping losses here instead of quietly reducing a batch means your yield and loss figures both stay honest, and the reports can show where produce is going missing.
Tip: record harvest against the correct crop cycle. Yield per cycle, and therefore profitability per cycle, depends on it.
Equipment
Machinery, categories, usage logs and maintenance.
The Equipment menu tracks the machinery on the farm — tractors, pumps, tools — along with how much it is used and what it costs to keep running.
Equipment Categories
Groupings such as vehicles, pumps or hand tools. Create these first so equipment can be filed under them.
Equipment List
Each machine you own, with its category and current status. Equipment can be metered — by hours or by distance — so you can track use over time rather than just ownership.
Usage and maintenance
Against each item you can record:
- Usage logs — when a machine was used and for how long, building up its meter reading.
- Maintenance logs — servicing and repairs, with the type of work and its cost.
Together these tell you what a machine actually costs to run, which is what the equipment report is built from.
Tip: log maintenance as it happens. A machine's running cost is only as accurate as the repair records behind it.
Expenses & Payments
Recording costs, expense categories and payment methods.
Expenses capture money going out that is not already tracked as supply purchases or wages — fuel, rent, transport, repairs.
Expense Categories
Your own cost headings. Reports group by these, so a little thought here makes the profit and loss far more readable later.
Expenses List
Each cost recorded with its date, amount, category and payment method. An expense can be tied to a crop cycle, which is what lets the app work out the true cost of a planting.
Expenses carry a status, so a cost can be entered, reviewed and approved rather than simply appearing in the books.
Payment Methods
Found at the top level of the sidebar rather than inside a group, because the same methods are used by expenses, sales and wage payouts alike. Add the ways money moves on your farm — cash, bank transfer, mobile money — and they become available everywhere.
Tip: attach expenses to a crop cycle wherever you can. Costs left unattached still hit the farm's profit and loss, but they cannot be traced to the planting that caused them.
Clients & Sales
Buyers, recording sales and tracking payment.
Clients and Sales cover the money coming in — who buys from you, and what they have taken and paid for.
Clients
The buyers you sell to, with their contact details. Add a client before recording a sale to them, and their whole trading history stays in one place.
Sales
A sale records produce leaving the farm. Each one has a client, a date, a payment method and one or more lines — typically a harvest batch, a quantity and a price.
Because sale lines point at harvest batches, selling produce draws down the stock you recorded at harvest.
Payment status
Every sale carries a payment status so you can see what is still owed:
- Unpaid — nothing received yet.
- Partial — part payment received.
- Paid — settled in full.
- Cancelled — the sale did not go ahead.
Tip: keep payment status current. The finance figures on the dashboard and the profit and loss report both rely on it to separate money earned from money actually received.
Issues
Logging problems on the farm and tracking them to resolution.
Issues is the place to record problems on the farm — pest outbreaks, disease, broken equipment, anything needing follow-up.
Raising an issue
Create an issue with a category and a severity, and describe what is wrong. Issues can be tied to the field or crop cycle affected, so the history of a problem stays with the land it happened on.
Tracking it
Each issue carries a status as it is worked through, from first report to resolved. Open issues appear on the dashboard, so nothing quietly gets forgotten.
Tip: set severity honestly. It is what sorts the genuinely urgent from the routine when several issues are open at once.
Reports & Audit Log
The eight built-in reports, exporting them, and the audit trail.
Reports turn the records you have been keeping into figures you can act on. All of them cover the selected farm and a period you choose.
Available reports
- Sales — what was sold, to whom, and what is still owed.
- Harvest — yield by crop, cycle and grade, alongside losses.
- Expenses — costs broken down by category.
- Profit & Loss — income against total costs for the farm.
- Crop Cycles — how each planting performed.
- Supplies — what was consumed and what it cost.
- Workers — attendance and wage totals per person.
- Equipment — usage and maintenance costs per machine.
Exporting
Every report can be exported to Excel or PDF from the buttons on the report page. Exporting is permission-controlled separately from viewing, so a role can be allowed to read a report without being able to take the data off the system.
Audit Log
The audit log records who changed what and when across the farm's records. Use it to answer questions after the fact — who altered a payout, when a cycle was closed, why a figure moved.
Reports are only as good as the records behind them. If a profit figure looks wrong, check that supply usage, expenses and harvest were all attached to the right crop cycle.
Staff & Settings
Company-wide staff accounts, roles, permissions and app settings.
The Company group sits apart from the rest of the menu: it is organisation-wide rather than farm-specific, and stays reachable even with no farm selected.
Staff
The user accounts that can log in, each with a role. This is different from Farm Staff under Workforce — Farm Staff are the workers whose attendance and wages you track, while Staff here are people with access to the system.
Settings
App-wide configuration, arranged in tabs:
- General — site name and basics.
- Branding — logo and favicon.
- Theme — colours and appearance.
- Currency — the currency amounts are shown in.
- Mail — SMTP details. Set this up before expecting any email to send.
- Roles and Permissions — who can see and do what.
- Notifications — which events notify whom.
- Server — environment information.
- Cron — your scheduler URL and status.
- Pusher — real-time updates.
- Payroll — how wages are calculated.
- Cache — clear cached data after configuration changes.
Roles and permissions
Roles decide what appears in each person's sidebar. Menus with no permission are hidden entirely rather than shown and blocked, so the quickest way to change what someone can reach is to adjust their role under Settings → Roles.
Mail and Cron are the two that catch people out. Email will not send until SMTP is configured, and scheduled work will not run until the cron job from the installation guide is in place.