Coffee Wet-Mill (Pulping Station), Dry-Mill Hulling & Nairobi Coffee Exchange (NCE) Cupping ERP: Cherry Intake, Parchment Drying, AA/AB/PB Grading & DSS Settlement

How to build a Coffee Cooperative Wet-Mill, Commercial Dry-Mill, and Green-Coffee Export ERP for Kenya and East Africa: red cherry hopper weighing and grower passbooks, fermentation tank pH and skin-drying moisture control, parchment-to-clean-coffee hulling outturn across AA/AB/PB/E/C/TT/T screen grades, SCA Q-Grader cupping spider charts, EUDR farm polygon traceability, and Direct Settlement System (DSS) splits.

Coffee cooperative societies, estate pulping stations (wet mills), licensed commercial dry mills, and specialty green-coffee exporters across Nyeri, Kirinyaga, Murang’a, Kiambu, Embu, Meru, Machakos, Kericho, Bungoma, and Trans Nzoia process some of the world’s highest-scoring washed Arabica coffees (SL28, SL34, Ruiru 11, Batian). Yet across the value chain, manual cherry passbooks, unmonitored parchment drying tables, opaque dry-mill hulling outturn reports, and complex Nairobi Coffee Exchange (NCE) Direct Settlement System (DSS) splits create cherry-to-parchment conversion leakages, over-dried or high-moisture parchment that bleaches green beans and depresses cupping scores, disputes over Milling Loss % and grade distribution (AA vs. AB vs. C/T), and non-compliance with European Union Deforestation Regulation (EUDR) farm-level geolocation mandates.

At devManue, we engineer specialized Coffee Wet-Mill, Commercial Dry-Mill & NCE Auction / Specialty Export ERP platforms that provide unbroken digital custody from the smallholder’s coffee trees and wet-mill cherry hopper to dry-mill optical color sorters, SCA cupping tables, NCE auction catalogs, and direct bank/mobile-money grower settlements.

1. Wet-Mill Cherry Intake, Floatation Cherry Sorting & Fermentation Tank Lot Tracking

Premium Kenyan coffee quality is locked in—or destroyed—within the first 24 hours at the wet mill (factory). Our wet-mill module digitizes cherry reception and wet-processing batch control:

  • Digital Cherry Hopper Weighing & Cherry Grade Separation (Cherry I vs. Cherry II / Mbuni): As farmers deliver ripe red cherry to the factory intake hopper, digital scales integrated with grower membership cards record exact kilograms of Cherry Grade I (ripe red) separately from under-ripe/over-ripe Cherry Grade II and sun-dried Mbuni, updating the farmer’s SMS/digital passbook in real time.
  • Pulper Disc Calibration, Density Floatation & Fermentation Tank Batching: After disc or drum pulping separates skins from mucilage-coated parchment, water density channels float off lighter Lights (P3) from dense prime Firsts (P1) and Seconds (P2). Each day’s cherry intake is assigned a unique Outturn Batch ID tracked through fermentation tanks (monitoring 16–36 hour mucilage breakdown, water recirculation, and washing channel grading).
  • Raised Drying Table Moisture Telemetry & Conditioning Bin Custody: Tracks parchment batch placement across skin-drying tables and raised African drying beds, logging daily portable moisture-meter readings until parchment reaches the statutory 10.5% to 11.5% moisture window before bagging into conditioning store bins.
Stage 01→
Cherry Intake & Passbook
Digital Hopper Scale, Cherry I/II/Mbuni Split & EUDR Farm Polygon Link
Stage 02→
Pulping & Drying Tables
P1/P2/P3 Density Floatation, Fermentation Batch & 10.5% Moisture Target
Stage 03→
Dry-Mill Hulling & Sort
Pre-Cleaner, Parchment Huller, Catador, Screen Grading (AA/AB/PB) & Color Sort
Stage 04→
SCA Q-Grader Cupping
Sample Roaster, 10-Attribute SCA Spider Chart & Reserve Price Valuation
Stage 05✓
NCE Auction & DSS Split
Catalog Lot Warrant, NCE Hammer Price & Automated DSS Grower Payout

2. Commercial Dry-Mill Hulling Outturn, Screen-Size Grading (AA/AB/PB) & Milling Loss Engine

When conditioned parchment arrives at a licensed commercial dry mill accompanied by a coffee movement permit, growers and cooperative managers demand transparent visibility into parchment hulling loss (typically 18%–22% husk weight) and the exact yield of high-premium grades (AA, AB, PB) versus lower grades (C, TT, T, UG).

Our dry-mill execution engine links every hopper tip on the hulling line—spanning destoners, hullers/polishers, cylindrical/oscillating screen graders (Screen 18 for AA, Screen 15/16 for AB, pea-berry separators for PB), gravity tables (Catadors separating light TT and T), and bichromatic/trichromatic optical color sorters—to generate an auditable Milling Outturn Statement and calculate Direct Settlement System (DSS) net payouts:

from decimal import Decimal, ROUND_HALF_UP

class CoffeeMillingOutturnAndDSSSettlementEngine:
    """
    Computes dry-mill parchment-to-clean-coffee hulling loss, screen grade
    distribution (AA, AB, PB, C, TT, T), and NCE Direct Settlement System (DSS)
    statutory & grower payout allocations.
    """
    @staticmethod
    def calculate_milling_outturn_and_dss_distribution(
        parchment_intake_kg: Decimal,
        intake_moisture_pct: Decimal,
        clean_grade_weights_kg: dict,  # e.g. {"AA": 4200, "AB": 5100, "PB": 850, "C": 620, "TT": 380, "T": 250}
        grade_auction_prices_usd_per_50kg: dict,
        exchange_rate_kes_per_usd: Decimal,
        milling_fee_per_tonne_parchment_usd: Decimal,
        cherry_intake_for_outturn_kg: Decimal,
        cooperative_retention_pct: Decimal,  # Capped by regulation (e.g. <= 20%)
    ) -> dict:
        total_clean_coffee_kg = sum((Decimal(str(v)) for v in clean_grade_weights_kg.values()), Decimal("0.00"))
        milling_loss_kg = parchment_intake_kg - total_clean_coffee_kg
        milling_loss_pct = ((milling_loss_kg / parchment_intake_kg) * Decimal("100.00")).quantize(
            Decimal("0.01"), rounding=ROUND_HALF_UP
        )
        cherry_to_clean_ratio = (cherry_intake_for_outturn_kg / total_clean_coffee_kg).quantize(
            Decimal("0.01"), rounding=ROUND_HALF_UP
        )
        # Compute gross auction USD value across grades (priced per 50kg bag)
        gross_auction_usd = Decimal("0.00")
        for grade, weight_kg in clean_grade_weights_kg.items():
            bags_50kg = Decimal(str(weight_kg)) / Decimal("50.00")
            price_per_50kg = Decimal(str(grade_auction_prices_usd_per_50kg.get(grade, "0.00")))
            gross_auction_usd += bags_50kg * price_per_50kg

        gross_auction_usd = gross_auction_usd.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)
        milling_charge_usd = ((parchment_intake_kg / Decimal("1000.00")) * milling_fee_per_tonne_parchment_usd).quantize(
            Decimal("0.01"), rounding=ROUND_HALF_UP
        )
        net_distributable_kes = ((gross_auction_usd - milling_charge_usd) * exchange_rate_kes_per_usd).quantize(
            Decimal("0.01"), rounding=ROUND_HALF_UP
        )
        coop_factory_retention_kes = (net_distributable_kes * (cooperative_retention_pct / Decimal("100.00"))).quantize(
            Decimal("0.01"), rounding=ROUND_HALF_UP
        )
        direct_grower_pool_kes = (net_distributable_kes - coop_factory_retention_kes).quantize(
            Decimal("0.01"), rounding=ROUND_HALF_UP
        )
        rate_per_kg_cherry_kes = (direct_grower_pool_kes / cherry_intake_for_outturn_kg).quantize(
            Decimal("0.01"), rounding=ROUND_HALF_UP
        )
        return {
            "total_clean_coffee_kg": total_clean_coffee_kg,
            "milling_loss_pct": milling_loss_pct,
            "cherry_to_clean_coffee_ratio": cherry_to_clean_ratio,
            "gross_nce_auction_proceeds_usd": gross_auction_usd,
            "direct_grower_pool_kes": direct_grower_pool_kes,
            "net_payout_rate_per_kg_cherry_kes": rate_per_kg_cherry_kes,
        }

3. SCA Q-Grader Cupping Lab, Green-Bean Defect Analysis & Bulking/Blending Recipes

Every milled outturn lot is sampled automatically into the dry-mill or exporter cupping laboratory:

  • Green Bean Physical Analysis: Logs screen retention percentages, bean density (g/L), water activity (aw < 0.60), moisture content, and Category 1 / Category 2 defect counts (full black, full sour, pod/cherry, insect-damaged, floater, shell, or parchment).
  • SCA 100-Point Sensory Cupping Protocol: Q-Graders score roasted samples on tablets across Fragrance/Aroma, Flavor, Aftertaste, Acidity (phosphoric/malic/citric brightness), Body, Balance, Uniformity, Clean Cup, Sweetness, and Overall—generating interactive spider charts and setting auction reserve prices.
  • Export Bulking, GrainPro Liner Stuffing & EUDR Geolocation Dossiers: For exporters blending multiple auction lots into 300-bag (19.2 MT) shipping containers in Sisal/Jute bags with hermetic GrainPro / Ecotact liners, the ERP compiles the exact farm GPS polygons of every contributing smallholder into a downloadable GeoJSON dossier compliant with EU Deforestation Regulation (EUDR) due diligence.
Coffee Wet-Mill, Dry-Mill & NCE Export MetricLegacy Spreadsheets & Manual TallyingdevManue Custom Enterprise ERP
Wet-Mill Cherry Intake & PassbooksHandwritten society passbooks & manual cherry totals prone to disputesDigital hopper scales, instant SMS cherry receipts & Outturn Batch IDs
Dry-Mill Hulling & Grade YieldDelayed manual hulling reports with unexplained >23% milling lossReal-time hulling line mass-balance across AA, AB, PB, E, C, TT & T
SCA Cupping & Reserve PricingPaper cupping sheets disconnected from auction catalog pricingDigital SCA Q-Grader spider charts auto-calculating lot reserve prices
EUDR Traceability & DSS PayoutsMissing farm GPS polygons & slow post-auction manual payoutsGeoJSON farm polygon linkage & automated DSS grower/factory splits
// High-Throughput Engineering • Systems Architecture Consulting

Scaling Python & Django APIs or Resolving Concurrency Bottlenecks?

We partner with engineering founders and tech leads to architect resilient distributed systems, optimize async worker pools, design scalable databases, and eliminate production latency spikes.

All Insights
Chat on WhatsApp