Skip to content

Overview

Warehouse 3PL is a third-party logistics (3PL) warehouse management system built as a custom Frappe app on top of ERPNext. It extends ERPNext's Stock module with a full set of 3PL-specific doctypes, workflows, and automation to manage multi-client warehouse operations from a single platform.

Workspace

What is a 3PL?

A third-party logistics (3PL) provider stores and fulfills inventory on behalf of multiple clients (brands, manufacturers, e-commerce sellers). The warehouse operator:

  • Receives goods from clients' suppliers
  • Stores the goods in a shared physical facility
  • Picks, packs, and ships orders on behalf of clients
  • Bills clients for each service activity performed

The key challenge is that the goods belong to the clients, not the warehouse operator. The operator must track inventory precisely per client, isolate data between clients, and bill every touchpoint accurately.

System Architecture

warehouse_3pl/                    ← Custom Frappe app
├── warehouse_3pl/
│   ├── doctype/                  ← 24 custom doctypes
│   │   ├── warehouse_job_record/ ← Central job tracking (Enhanced Desk UI)
│   │   ├── asn/                  ← Advance Shipment Notice
│   │   ├── receiving/            ← Receiving (GRN)
│   │   ├── putaway_task/         ← Directed putaway
│   │   ├── client_order/         ← Outbound sales orders
│   │   ├── wave/                 ← Wave picking batches
│   │   ├── pick_task/            ← Pick instructions
│   │   ├── pack_task/            ← Pack instructions
│   │   ├── billing_transaction/  ← Activity-based billing log
│   │   ├── rate_card/            ← Per-client pricing
│   │   ├── inventory_policy/     ← Rule engine config
│   │   ├── warehouse_location/   ← Bin master
│   │   └── client_item/          ← Client SKU mapping
│   └── hooks.py                  ← ERPNext integration hooks
└── ...

The app sits on top of the standard ERPNext stack:

Zero-Value Accounting

One of the foundational design decisions is zero-value stock accounting.

When goods are received into the warehouse, they are posted to stock at ₹0 / $0 value. This is because:

  1. The goods belong to the client, not the warehouse operator
  2. The operator has no cost basis in the inventory
  3. The operator earns revenue through service fees (receiving, storage, pick, pack, ship) — not by buying and reselling goods

INFO

All Stock Entries created by the system use valuation_rate = 0. ERPNext's standard accounting entries still fire, but the balance sheet impact is zero. The operator's P&L is driven entirely by Billing Transactions.

Clients can optionally supply their own item valuations for insurance or reporting purposes, but this does not affect the operator's books.

Key Modules

ModulePurposePrimary Doctypes
Job ManagementCentral tracking hub for engagementsWarehouse Job Record
InboundReceive goods from suppliersASN, Receiving, Putaway Task
OutboundFulfill client ordersClient Order, Wave, Pick Task, Pack Task
BillingActivity-based charge loggingBilling Transaction, Rate Card
MastersConfiguration and setupInventory Policy, Warehouse Location, Client Item
Stock (ERPNext)Inventory ledgerStock Entry, Stock Ledger Entry, Batch

System Architecture

Document Flow

Inbound

Outbound

Billing

Custom Doctypes

The app defines 24 custom doctypes:

DoctypeCategoryPurpose
Warehouse Job RecordJob ManagementCentral umbrella document — links all activities for a client engagement
Job Storage InfoJob ManagementChild table — storage details within a job
Job Vehicle InfoJob ManagementChild table — vehicle/container tracking
Job Operational InfoJob ManagementChild table — operational log entries
Job Stock MovementJob ManagementChild table — stock in/out tracking
Job VoucherJob ManagementChild table — linked financial vouchers
ASNInboundAdvance Shipment Notice — pre-alerts expected receipts
ASN ItemInboundLine items within an ASN
ReceivingInboundGoods Receipt Note — records actual receipt
Receiving ItemInboundLine items within a Receiving
Putaway TaskInboundDirected bin assignment for received stock
Client OrderOutboundClient's outbound fulfillment request
Client Order ItemOutboundLine items within a Client Order
WaveOutboundBatches multiple Client Orders for picking
Wave OrderOutboundLinks Wave to Client Orders
Pick TaskOutboundPer-bin pick instruction for warehouse operators
Pack TaskOutboundPacking instruction after picking is complete
Billing TransactionBillingSingle activity charge record
Rate CardBillingPer-client pricing schedule
Rate Card ItemBillingIndividual rates within a Rate Card
Inventory PolicyConfigRule engine settings per client/zone/item group
Warehouse LocationConfigPhysical bin master (Zone/Aisle/Rack/Level/Bin)
Client ItemConfigMaps client SKUs to internal ERPNext items
Warehouse ZoneConfigZone definitions with temperature and type
Stock BalanceReportingDenormalized view of current stock per client/item/location

ERPNext Extensions

The app adds custom fields to standard ERPNext doctypes:

DoctypeCustom Fields Added
Customeris_3pl_client (checkbox), client_code (short ID), default_rate_card (link)
Warehousezone_type (Ambient/Cold/Frozen/Hazmat), location_type (Bulk/Rack/Floor), 3pl_managed (checkbox)
Itemtemperature_zone, velocity_class (A/B/C), lot_tracked (checkbox), client_item_id
Batchclient (link to Customer), expiry_date (for FEFO), po_number
Stock Entry3pl_reference_doctype, 3pl_reference_name, client (for filtering)
Delivery Noteclient_order (link), wave (link), billing_logged (checkbox)

Tech Stack

ComponentVersion / Detail
Frappe Frameworkv15 (Python-based web framework)
ERPNextv15 (ERP application layer)
Python3.10+
DatabaseMariaDB 10.6+
Cache / QueueRedis 6+
FrontendVue 3 + Frappe UI (standard ERPNext desk)
APIREST (Frappe standard) + custom whitelisted methods

TIP

The system runs on a standard Frappe bench. See frappe.io/bench for installation docs. No Docker or custom infrastructure is required.

Built on Frappe/ERPNext