Full P2P implementation on XeerSoft Cloud ERP as sole Implementation Consultant: gathered procurement requirements, configured master data for 180+ materials and 10+ vendors, designed 2-level approval workflow, and applied statistical modelling to solve chronic stockouts at Newton Sixth Form School.
Newton's uniform and textbook procurement ran on intuition — 22% of intake seasons hit XS/XXL stockouts. I rebuilt it as a statistically-planned, approval-controlled procure-to-pay system on XeerSoft Cloud ERP.
Business Context & Problem
Newton Sixth Form managed procurement for school uniforms (~180 SKUs) and textbooks (~40 titles) without a structured system: purchase requests were uncontrolled, approval was informal, and uniform stockouts occurred every intake season due to intuition-based ordering.
Three core issues identified
· Chronic XS/XXL stockout rate at 22% of intake seasons, root cause: planning parameters set by intuition, not statistical models
· Textbook over-ordering at 8–12% buffer above enrolment → ฿28–45K annual write-off from obsolete editions
· No approval threshold: any staff could raise unlimited purchase requests
My Role & Accountability
I joined as sole Implementation Consultant. The challenge wasn't simply to configure an ERP module: it was to diagnose why the existing process was failing, design a system that solved root causes, and ensure adoption across 15+ procurement staff.
I split the work into three streams running in parallel: (1) Master Data Configuration for 180+ materials and 10+ vendors on XeerSoft, (2) Statistical Modelling to calculate scientifically-grounded reorder parameters, and (3) Workflow Design for 2-level purchase approval authorization.
Consulting Approach
Before configuring a single screen I fixed the consulting spine of the build: the method that decides the numbers, the tools that hold them, and the logic the developers implement. Every interactive exhibit further down is an artifact of one of these three.
Methodology
Plan by statistics, not intuition
The root cause was intuition-based ordering. I matched a demand model to how each SKU actually behaves, then sized and timed every order from it.
Item master structured category → class → size/subject, each with its planning class + ROP
Power BI for KPI read-back; a Poisson/EOQ workbook to set parameters
Logic
Rules a developer can build to
I wrote the system's behaviour as decision rules in the FSD — not prose — so the build is traceable and testable line by line.
Approval: ≤฿50K → Dept Head, >฿50K → Director (FSD-P1-01)
Traceability: 9-char serial + Learn Balance Code per unit, set at issue
Control: reorder fires when on-hand < ROP; 3-way match on receipt
Read the rest of this page as proof of the spine above: the Procurement Simulation runs the methodology live, the Order Entry catalog is the configured tooling, and the FSD logic is what the developers received.
Solution Design · Demand Model Selection
Every stock item asks the same question: how much safety stock guards against a stockout at a 97% service level? The honest answer depends on how much the item actually sells — so I chose the demand model by volume, not by product type. The three panels show why.
Poisson PMF 97% reorder point Normal approximation impossible (demand < 0)
The model is chosen by demand volume, not by product. At very low volume a Normal curve even predicts impossible negative demand (the red 2.3% at λ=4), so low-volume SKUs use Poisson — safety stock from the mean alone, which is robust when there's too little sales history to estimate σ reliably. As volume rises the two converge (λ=19.5 → reorder 28 vs 27.8; λ=63 → 78 vs 77.9), so high-volume sizes use the simpler Normal-Z.
Planning Rules · Model-Selection Logic
Three planning rules, each matched to how its items behave. The Purchase Requisition catalog below tags every line with the rule that governs it.
Safety stock from the mean alone; robust when sales history is too thin to estimate σ
Normal-Z
Mid / high-volume sizes & steady consumables
Enough history to estimate σ; a service-level Z gives a tighter reorder point
Modified EOQ
Textbooks (~40 titles)
Order size balances holding vs ordering cost, with an edition-risk penalty to curb obsolete-edition write-off
Capital equipment (laptops, tablets, scanners) is deliberately not demand-planned — it's irregular and high-value, so it's controlled by the value-based approval routing instead. Alongside this: a 2-level approval workflow (≤ ฿50K → Dept Head, >฿50K → Director), ABC stock flagging, ~180 uniform SKUs and ~40 textbook titles configured, a vendor master for 10+ suppliers, and the full P2P cycle (Purchase Requisition → Purchase Order → Goods Receipt → Invoice, 3-way match).
How I'd defend this in interview
"We only run statistical planning on recurring stock items, and we match the distribution to each SKU's demand volume — Poisson where data is too sparse to estimate σ, Normal-Z where it isn't. Capital equipment isn't forecast at all; it's irregular and high-value, so it's controlled by value-based approval routing."
P2P Process Flow · Designed for XeerSoft
XeerSoft Module Flow
The full P2P process as configured in XeerSoft, driven by module screens and menu navigation (no transaction codes). Each step maps to a module → function path in the live system.
#
Process Step
XeerSoft Module → Function
1
Create Purchase Requisition
Procurement › Purchase Requisition › Create
2
PR Approval · 2-level
Workflow Authorization › Approval Rule
3
Create Purchase Order
Procurement › Purchase Order › Create
4
Goods Receipt
Inventory › Goods Receipt
5
Invoice Matching · 3-way match
Procurement › Invoice Matching
6
Stock Monitoring
Inventory › Stock Balance / Reorder Report
7
Vendor Evaluation
Procurement › Vendor Scorecard
8
Master Data
Inventory › Item & Vendor Master
Purchase Requisition · Order Entry
Build a requisition from the configured catalog and watch the planning class and approval routing respond — the specified behaviour I designed, not the proprietary XeerSoft UI. The catalog is the item master I set up across six classes (Uniforms, PE Kit, Subject Kit, Stationery, Textbooks, Equipment). Each stocked line is tagged by its planning model (Poisson for low-volume sizes & minority specialty; Normal-Z for steady consumables; Modified EOQ for textbooks) with a live stock signal against its reorder point; capital equipment is value-routed, not demand-planned. Every unit carries a 9-character serial and a Learn Balance Code (LB######) engraved to the owning student at issue. Submitting applies the 2-level approval rule (FSD-P1-01: ≤ ฿50,000 → Dept Head; > ฿50,000 → Director) — add an Equipment line and watch routing escalate to Director.
🔒 Illustrative reconstruction · order-entry UI rebuilt to match the configured master data · original XeerSoft screens under NDA · serial / Learn-Balance codes and stock levels illustrative; prices and structure per author.
// FSD-P1-01 · Workflow Authorization · 2-level PR approvalON purchase_requisition.submit:
total = SUM(pr.line_items.amount)
IF total ≤ 50,000 → approver ∈ { Dept Head, Director }
ELSE → approver = Director only // block Dept-Head-only approval// FSD-P1-02 · Goods-Receipt GL mapping fix (IT-asset category)ON goods_receipt.post:
gl = lookup(GL_determination, item.category)
IF gl is empty → block posting; "account determination missing"
// resolution (config): map category 'IT Asset' → GL 160000// FSD-P1-03 · Report · Size-Mix vs statistical targetFOR EACH sku:
IF on_hand < safety_stock → STOCKOUT
ELSE IF on_hand > target × 1.2 → OVERSTOCK
ELSE → OK
Live Spec Simulation
An interactive simulation that runs the FSD logic above directly in your browser: it reproduces the specified behaviour I designed, not the proprietary XeerSoft UI.
Drag on-hand to watch status recompute: STOCKOUT if below safety stock, OVERSTOCK if above target × 1.2.
SKU
On-hand
Safety
Target
Status
Equipment catalogue · pick & quantity
Capital / equipment items at Thai-market reference prices; the PR total auto-routes by the ฿50K rule (FSD-P1-01).
Purchase Requisition · auto-routed
฿0
Requester→Dept Head ≤ ฿50K→Director > ฿50K→PO
Lines0
Required approver–
Result–
Interactive simulation of the specified logic · not the proprietary XeerSoft interface.
Delivery model · role boundary
On XeerSoft Cloud ERP I worked as Functional Consultant / Business Analyst, owning requirements, configuration, FSD authoring, UAT and defect management. The custom logic below was implemented by XeerSoft’s in-house development team against my specifications.
The pseudocode shown is the specified expected behaviour (my FSD deliverable), not vendor source code, and deliberately platform-neutral so it reads the same to a XeerSoft or generic ERP reviewer.
Validation, UAT & Defect Control
I did not sign off the build as one pass/fail. I decomposed the P2P scope into 10 sub-unit tests, each run as a manual test case of ~10 ordered steps validated against 5 complex conditions, with one written specific assurance per sub-unit (the exact thing the test guarantees). This is the breakdown behind the UAT & defect-fix window in the delivery timeline below — the part that is easy to claim and hard to show.
📋 Manual test criteria · how every sub-unit was validated
Each sub-unit test is a manual procedure: log in under the correct role, drive the transaction step by step, and confirm the posting, workflow and data outcome at each gate. Every test carries 5 complex conditions — partial / over-tolerance / variance / missing-config / period-control paths — not just the happy path. A sub-unit only closes when its specific assurance holds under all five and a regression retest is clean.
Flagship worked test case · full manual procedure 10 steps · 5 conditions
Role: Warehouse / Receiving · tied to the live UAT blocker in the delivery timeline below — a Goods Receipt that silently failed to post for a non-stock item category. This is the procedure that surfaced it.
Manual procedure · 10 steps
Log in as Warehouse role; open the XeerSoft Goods Receipt screen against open PO #PO-2024-0117Receipt screen.
Confirm PO line items, ordered qty (120 units) and the default storage location.
Enter received qty = 100 (partial delivery); set the standard goods-receipt posting type Std receipt.
Attach delivery-note reference; set posting date to the current open period.
Set stock type unrestricted; verify batch / serial not required for this item.
Post the receipt; capture the goods-receipt document number.
Verify the inventory GL (debit) and receipt/invoice clearing (credit) postings were generated.
Open the XeerSoft Invoice Matching screen Invoice review; enter the vendor invoice for 100 units.
Run the 3-way match (PO price × receipt qty × invoice qty/price); confirm within tolerance.
Post the invoice; confirm receipt/invoice clearing nets to zero and AP liability is raised.
Complex conditions · 5 paths
C1Split delivery — second receipt for the remaining 20 units; the running receipt/invoice clearing balance must reconcile across both receipts.
C2Over-delivery beyond tolerance (125 of 120) must be blocked or warned per the tolerance key, never posted silently.
C3Price variance > 5% on the invoice vs PO must raise a price-variance block and route to the buyer.
C4Non-stock / IT-asset category with no account determination — the silent stopper this test was built to catch.
C5Closed-period posting — a back-dated receipt into a closed period must be rejected and forced to the current period.
◆ Specific assurance
Guarantees that no goods movement posts without a valid inventory + receipt/invoice clearing account pair, that the 3-way match holds quantity and price within the configured tolerance key, and that receipt/invoice clearing nets to zero after invoice posting. A receipt that cannot derive a GL account is hard-stopped with an error, not silently skipped — the exact failure mode caught in UAT cycle 1 and closed as DEF-P1-01.
Sub-unit test register · the full decomposition 10 components
UT-P1-01Purchase Requisition · create & field validation9 steps
Mandatory fields (cost centre, account assignment) enforced on save
Multi-line PR with mixed material + free-text items
Zero / negative quantity rejected; UoM mismatch caught
Duplicate PR for same item within 24h flagged
Account-assignment category drives the right field set
Assurance: a PR cannot be saved without a complete, valid account assignment, and no quantity/UoM combination can pass that the downstream PO would reject. PASS
Amount edited above threshold after submit must re-trigger release
Approver-on-leave delegate path routes correctly
Reject → rework → resubmit re-enters at level 1
Assurance: no PO can be approved above ฿50K without a recorded director approval, and any value change re-evaluates the approval route from scratch. PASS · after DEF-P1-02
UT-P1-03Purchase Order · create & approval route9 steps
PR → PO conversion carries account assignment intact
PO price from contract / info record vs manual override
Approval blocked until route is fully approved
Partial PR-to-PO (split across vendors)
Changing an approved PO re-opens the approval route
Assurance: a PO cannot be sent to a vendor until its approval route is complete, and edits to an approved PO revoke that approval rather than silently shipping. PASS
Partial / split receipt reconciles the running receipt/invoice clearing balance
Over-delivery beyond tolerance blocked, not posted
Posting type drives correct stock treatment
Missing account determination hard-stops (no silent skip)
Closed-period receipt rejected and re-dated
Assurance: detailed above — no movement posts without a valid inventory + receipt/invoice clearing account pair. PASS · after DEF-P1-01
UT-P1-05Invoice Matching · 3-way match10 steps
Qty + price both within tolerance → auto-post
Price variance > 5% → block + route to buyer
Qty variance → match to received, not ordered
Invoice before receipt → parked, not posted
Duplicate invoice number on same vendor blocked
Assurance: nothing pays out unless PO, receipt and invoice agree on both quantity and price within tolerance; everything outside tolerance lands on a human worklist. PASS · after DEF-P1-03
UT-P1-06Reorder point · Poisson (low-volume SKU)8 steps
λ < 25 SKUs (XS, XXL) use Poisson, not Normal
97% service level → SS = ⌈Z·√λ⌉
No negative / fractional reorder point produced
Thin sales history (single season) still yields a point
Lead-time change re-derives the reorder point
Assurance: low-volume sizes get a defensible reorder point from the mean alone, and the model never proposes an impossible (negative) stock target. PASS
UT-P1-07Reorder point · Normal-Z (mid-volume)8 steps
Stable S–L sizes use Normal-Z at 97%
SS = Z·σ·√LT computed on field values
Convergence with Poisson checked at λ ≈ 21
Demand spike trims to a sane safety cap
Rounding to whole units, never below safety
Assurance: the high-volume sizes hold a 97% service level with the simpler model, and the Poisson/Normal handoff is verified at the volume where they meet. PASS
UT-P1-08Reorder point · EOQ + edition-risk penalty9 steps
Textbooks use modified EOQ, not plain reorder
Edition-obsolescence penalty shrinks the order
Soon-to-be-obsolete edition flagged → reduced qty
New-edition cutover does not double-order
Write-off risk reflected in the order quantity
Assurance: textbook orders are penalised for edition risk so the system does not over-buy stock that is about to be written off. PASS · after DEF-P1-04
UT-P1-09Vendor master & delivery scorecard8 steps
Lead-time / on-time fields drive the scorecard
Partial GRs of one PO line count as one late event
Blocked vendor cannot be selected on a new PO
Duplicate vendor record detection
Scorecard recomputes on each closed receipt
Assurance: vendor performance reflects reality — one late line is one late event, not several — so scorecards are trustworthy for sourcing. PASS · after DEF-P1-05
UT-P1-10PR-approval custom report (RICEFW)7 steps
Approval status, approver, timestamp all captured
Filter by amount band / status / date range
Pending-too-long items surfaced (ageing)
Export totals reconcile to the PR list
Authorisation: buyers see only their scope
Assurance: the custom report is an audit trail — every approval is attributable and the figures reconcile back to source PRs. PASS
Test execution timeline · UAT cycle by working day
Goods receipt for the IT-asset item category silently failed to post — no error, no receipt document.
HIGH
No GL account determination for that item accounting category — posting had no inventory / offset account.
Mapped the asset category → inventory GL 160000 + receipt/invoice clearing, and added a hard-stop error when determination is missing.
2
✓ PASS
DEF-P1-02
UT-02 PR approval
Editing a PR amount above ฿50K after first submit did not re-trigger director approval.
HIGH
Approval route was evaluated only on create, not on value change.
Re-evaluate the approval route on any value edit and reset prior approvals before re-routing.
3
✓ PASS
DEF-P1-03
UT-05 3-way match
An invoice with 7% unit-price variance auto-posted instead of blocking.
MED
Tolerance key upper limit was set too wide (10%).
Tightened the price tolerance to 5% and routed over-tolerance invoices to the buyer worklist.
2
✓ PASS
DEF-P1-04
UT-08 EOQ reorder
Textbook reorder point ignored edition risk and over-ordered obsolete editions.
MED
Safety-stock formula used plain EOQ with no edition-risk penalty term.
Added an edition-risk penalty to EOQ so flagged editions order down toward run-out.
4
✓ PASS
DEF-P1-05
UT-09 vendor scorecard
Late-delivery count double-counted across partial GRs of one PO line.
LOW
Scorecard counted each partial receipt as a separate late event.
Dedupe on the PO line; count only the first late event per line.
1
✓ PASS
5 defects raised to the XeerSoft dev team across the UAT window, ~12 working days of fix-and-retest in total. Two were go-live blockers (silent goods-receipt failure, approval bypass); all five closed with a clean regression retest before the intake-season Go-Live. The discipline is the point: every defect has a named symptom, a root cause, a fix I specified, and a retest result — nothing closed on assertion.
Statistical Modelling
Rather than guess safety stock values, I applied three different statistical models based on SKU demand patterns, and entered the calculated parameters directly into XeerSoft inventory planning fields.
Model selection by SKU type
· Poisson Distribution for low-volume SKUs (λ < 25): XS and XXL uniform sizes at 97% service level
· Normal Z-score for mid-range sizes (S–L) with stable demand patterns
· Modified EOQ with Edition-Risk Penalty for textbooks subject to edition obsolescence
◆ Why Poisson Distribution?
An XS or XXL shirt doesn't sell in a steady stream. It sells as a few separate, countable events over a season: rare, independent arrivals that Poisson is built to describe. The choice between Poisson and the Normal model comes down to one thing, how much the size sells.
Countable and low: whole units, never fractional, never negative.
Right-skewed at low volume: a symmetric Normal curve misfits the tail and can even imply negative demand.
One parameter: mean = variance = λ, so a single number sets the reorder point, SS = ⌈Z·√λ⌉. No long history needed.
Poisson (uses mean only)Normal approximation97% reorder point
λ = 4 very low volume · illustrative
Normal assigns 2.3% to demand < 0 (impossible)
λ = 21 PE Shirt XS · real SKU
97% reorder: Poisson 30 · Normal 30 (nearly equal)
λ = 78 PE Shirt M · real SKU
97% reorder: Poisson 95 · Normal 95 (identical)
units of demand over the lead time · bars = Poisson, dashed = Normal approximation
The model is chosen by demand volume, not by product. At very low volume the Normal curve even predicts impossible negative demand, so the low-volume tails (XS, XXL) use Poisson: safety stock from the mean alone, robust when there is too little sales history to estimate σ reliably. As volume rises the two converge, so high-volume sizes (S–L) use the simpler Normal-Z. The λ = 21 and λ = 78 panels are the same XS and M SKUs from the worked example below (reorder 30 and 95).
Reorder Point & EOQ · Worked Example
Turning the models into the actual numbers entered into XeerSoft's Reorder-Point Planning fields. The inputs below are reconstructed so they reproduce the safety stock and reorder points behind the 97% service level (the same ROPs the order screen above flags against); the achieved outcomes (stockout 22% → 3%, write-off ฿45K → ฿8K) are the real results.
🔒 Worked example · inputs reconstructed to reproduce the achieved 97% service level and reorder points · original working data not retained (confidential) · figures approx.
SKU
Model
Demand
Lead time
λ / σ_LT
Safety stock
Reorder point
PE Shirt · XSlow-vol
Poisson
~3 /wk
~7 wk
λ = 21
9
30
PE Shirt · M
Normal-Z
~13 /wk
~6 wk
σ_LT ≈ 8.8
17
95
PE Shirt · XXLlow-vol
Poisson
~3 /wk
~7 wk
λ = 21
9
30
// service level 97% → Z = 1.88 (chosen SL for the XS / XXL tails)Poisson (low-volume, λ < 25): SS = ⌈Z·√λ⌉ ROP = λ + SS
XS: λ = 21 → SS = ⌈1.88·√21⌉ = 9 → ROP = 30
Normal-Z (stable demand): SS = ⌈Z·σ_LT⌉ σ_LT = σ·√LT ROP = μ_LT + SS
M: μ_LT = 78, σ_LT ≈ 8.8 → SS = 17 → ROP = 95
→ entered per-SKU into XeerSoft Reorder-Point Planning fields
// Modified EOQ with edition-risk penalty · textbook (AS/A-Level · ฿2,345)
D ≈ 120 /yr S ≈ ฿500 /order H = 25% · ฿2,345 ≈ ฿586 /yr
EOQ = √(2DS / H) = √(2·120·500 / 586) ≈ 14 copies
+ edition-risk (obsolescence) → H_eff ≈ ฿879 → EOQ* ≈ 12 copies→ smaller, more frequent lots = less stranded stock at edition change → write-off ฿45K → ฿8K
Methodology Simulation · MRP
The reorder-point and EOQ models above plan independent-demand items, whose demand comes from forecasts. But when an item's demand is derived from a parent through a bill of materials, you don't forecast it, you calculate it. That is Material Requirements Planning. Below is a full MRP run worked end-to-end on a 4-item, 3-level BOM, every number traced from the master schedule down to the shop-floor release.
Standard A/B/C/D worked example, used to demonstrate the MRP method itself, not a specific client BOM.
01 · Supply system basis
MRP is a push system: a master schedule pushes calculated requirements down the BOM and out as orders, rather than pulling against live consumption. The split that decides the planning method is the type of demand.
Independent demand
Forecast-driven
Originates outside the system (customers, term intake). Planned with reorder point / EOQ / statistics — the uniform and textbook SKUs above.
Dependent demand
Calculated via BOM
Derived from a parent item's schedule. Never forecast: it is exploded from the parent through the bill of materials. This is the job MRP does.
02 · The MRP overall
Inputs
MPS — A: 100 @W6 · 50 @W8BOM — A = 2B + 1C · B = 1DInventory — on-hand · lead time
→
EngineMRPexplode · net · lot-size · offset
→
Outputs
Planned order releasesper item · time-phasedreschedule signals
03 · Basic processing steps
01ExplodeBreak the parent's planned release into component gross requirements via the BOM (×2 B, ×1 C, ×1 D).
02NetSubtract projected on-hand and scheduled receipts to get the net requirement.
03Lot-sizeApply the lot rule. Here lot-for-lot: order exactly the net, no more.
04OffsetShift the order earlier by the item's lead time to get the planned order release.
04 · Exploding & netting
Each parent's planned release becomes the child's gross requirement, then on-hand is netted off:
Component
Source (parent release)
× per parent
= Gross req
On-hand
Net req
B
A: 80 @W5 · 50 @W7
×2
160 @W5 · 100 @W7
30
130 @W5 · 100 @W7
C
A: 80 @W5 · 50 @W7
×1
80 @W5 · 50 @W7
10
70 @W5 · 50 @W7
D
B: 130 @W3 · 100 @W5
×1
130 @W3 · 100 @W5
0
130 @W3 · 100 @W5
05 · Basic MRP record · time-phased
Item ALT 1 wk · on-hand 20 · lot-for-lot · level 0 (MPS / end item)
Week
1
2
3
4
5
6
7
8
Gross requirements
–
–
–
–
–
100
–
50
Scheduled receipts
–
–
–
–
–
–
–
–
Projected on-hand
20
20
20
20
20
0
0
0
Net requirements
–
–
–
–
–
80
–
50
Planned order receipt
–
–
–
–
–
80
–
50
Planned order release
–
–
–
–
80
–
50
–
Item BLT 2 wk · on-hand 30 · lot-for-lot · level 1 (= 2 per A)
Week
1
2
3
4
5
6
7
8
Gross requirements
–
–
–
–
160
–
100
–
Scheduled receipts
–
–
–
–
–
–
–
–
Projected on-hand
30
30
30
30
0
0
0
0
Net requirements
–
–
–
–
130
–
100
–
Planned order receipt
–
–
–
–
130
–
100
–
Planned order release
–
–
130
–
100
–
–
–
Item CLT 1 wk · on-hand 10 · lot-for-lot · level 1 (= 1 per A)
Week
1
2
3
4
5
6
7
8
Gross requirements
–
–
–
–
80
–
50
–
Scheduled receipts
–
–
–
–
–
–
–
–
Projected on-hand
10
10
10
10
0
0
0
0
Net requirements
–
–
–
–
70
–
50
–
Planned order receipt
–
–
–
–
70
–
50
–
Planned order release
–
–
–
70
–
50
–
–
Item DLT 1 wk · on-hand 0 · lot-for-lot · level 2 (= 1 per B)
Week
1
2
3
4
5
6
7
8
Gross requirements
–
–
130
–
100
–
–
–
Scheduled receipts
–
–
–
–
–
–
–
–
Projected on-hand
0
0
0
0
0
0
0
0
Net requirements
–
–
130
–
100
–
–
–
Planned order receipt
–
–
130
–
100
–
–
–
Planned order release
–
130
–
100
–
–
–
–
06 · Planned order release · summary
Item
BOM level
Planned order releases
A
0 · end item
W5 → 80 · W7 → 50
B
1
W3 → 130 · W5 → 100
C
1
W4 → 70 · W6 → 50
D
2
W2 → 130 · W4 → 100
07 · BOM tree & lead-time offset
BOM Tree · multi-level dependency, demand explodes downward
08 · Combined planning calendar
All planned order releases on one timeline. Read the staircase: the deeper the item, the earlier it must start, so the schedule cascades up from D toward the end item A.
Item
W1
W2
W3
W4
W5
W6
W7
W8
D
–
130
–
100
–
–
–
–
B
–
–
130
–
100
–
–
–
C
–
–
–
70
–
50
–
–
A
–
–
–
–
80
–
50
–
Each cell is a planned order release (quantity to start that week). The first batch fires at D W2 and finishes as A at W6; the second batch D W4 → A W8.
▸ Why lead times stack
Every BOM level adds its own lead-time offset, and the offsets compound down the tree. To have A ready in Week 6, the deepest branch has to start far earlier:
release D · W2 →(LT1) D ready W3 →(LT2) B ready W5 →(LT1) A ready W6
That is a 4-week cumulative lead time across three levels for what looks like a 1-week end item. The same compounding is exactly why the independent-demand SKUs above carry a 6–7 week planning lead time: the supplier offset plus every upstream step, stacked. Plan against the cumulative lead time, never the item's own.
Procurement Simulation
The MRP run above is the method in the abstract; this is the same explode → pool → cost → offset logic applied to the institute's real start-of-term procurement. Three headcounts drive the whole plan: change them (or pick a different device model) and the demand, cost and order timeline recompute live.
◇ Parameters · edit to recompute
Math / Science · total 100
Prices are Thai-market reference (2026), starting configurations; adjust per quote. Lead times in weeks. Everything below recomputes from these inputs.
01 · Demand explosion
Each headcount explodes into per-item quantities through its kit:
Item
Per unit
Headcount
Quantity
02 · Common-component pooling
Pens, folders and the teacher set are stationery-class items used across kits. Instead of ordering them per-kit, they net into one consolidated stationery PO (the Stationery vendor from the scorecard above): fewer POs, one delivery, volume pricing.
Pooled item
Source
Qty
Cost
03 · Cost breakdown
Item
Qty
Unit ฿
Line ฿
Estimated procurement total
฿0
04 · Lead-time offset timeline
Goods-ready is week 0 (term start). Order release = 0 − lead time:
−5−4−3−2−10 · ready
Laptops & tabletsLT5 · release −5
Lenovo · iPad · MacBook
LockersLT4 · release −4
Locker
Cutter & scannerLT3 · release −3
Paper cutter · scanner
Math & science kitLT2 · release −2
Casio · compass · lab coat · goggles
Stationery & consumablesLT1 · release −1
base kit · plan book · answer sheets
The longer the bar, the earlier the order must be placed. The Apple / laptop devices (LT5) start the whole procurement, five weeks before term.
05 · Flow
InputHeadcount
students · teachers · rooms
→
Map3 Kits
Student · Teacher · Classroom
→
ComputeExplode + Poolqty · net common
→
OutputOffset → PO
release −5 … 0 wk
06 · Insight
▸ The bottleneck is the Apple / laptop devices
The LT5 devices (Lenovo laptop, iPad, MacBook) are both the schedule bottleneck — ordered 5 weeks before term, earliest of anything — and the cost centre:
฿542,500 in LT5 devices = 98.6% of the Teacher kit · 83.1% of Teacher + Classroom spend
Everything else can wait until the last 1–2 weeks, but slip the device order and the whole term opening slips. Same compounding lead-time logic as the MRP run above: plan the long-lead, high-value items first — which is why those sit at the 6–7 week end of the planning horizon.
Configuration Parameters
XeerSoft · planning & approval configparameters
// Inventory Planning Parameters (XeerSoft)Planning Type: Reorder Point Planning
Lot Sizing: Lot-for-lot
Safety Stock: calculated per SKU via Poisson/Normal
Reorder Point: trigger for auto-replenishment
Service Level: 97% target for XS/XXL
// Approval Matrix (Workflow Authorization)Level 1: Dept Head ≤ THB 50,000
Level 2: Director > THB 50,000
Approval: Sequential, L1 approves before L2
Master Data Volume
Configured the full master data foundation for the P2P cycle from scratch on XeerSoft.
~180
Material Records
Uniforms + Textbooks
10+
Vendor Masters
Full price record integration
4 × 6
Uniform Variants
Types × Sizes (XS–XXL)
~40
Textbook Titles
Edition-tracked
Vendor Scorecard
Vendor master records were scored each cycle on delivery, quality, price and lead time, and the underperformers actively managed. Driving them up moved portfolio on-time delivery 68% → 87%.
🔒 Representative recreation · vendor names masked · per-vendor figures illustrative · portfolio on-time 68% → 87% is the real cohort result.
Vendor
Scope
On-time
Quality
Lead time
Score
Vendor A
Uniforms
92%
98%
35 d
4.6
Vendor B
Core textbooks
88%
96%
21 d
4.4
Vendor C
Imported texts
81%
95%
45 d
4.0
Vendor D
Stationery
90%
97%
14 d
4.5
Vendor E
Lab consumables
84%
94%
28 d
4.1
Weighted score = on-time 35% · quality 30% · price 20% · lead-time 15%. Cohort on-time delivery improved 68% → 87% after the scorecard rollout (real result); per-vendor values illustrative. Average on-time across the five = 87%.
Measured Results
The measurable outcome was not one isolated KPI; it was a controlled P2P operating model. Uniform stockouts moved from 22% to 3%, unauthorised POs from 30% to 0%, textbook write-off from ฿45K to ฿8K, and vendor on-time delivery from 68% to 87%. Those are the same audited results shown in the executive KPI cards and Power BI exhibit above.
How the project was actually run end-to-end after the consulting work above: the timeline and where it was at risk, how I specified the build for the developers and verified it, the weekly Agile cadence, and the stakeholder network I coordinated as the single point of accountability.
⏱ Schedule stakes · why the date mattered
Go-Live was gated to the June intake season: uniforms and textbooks had to be on shelf before the Jun–Jul intake. Slipping the date meant another full season at the old 22% stockout rate plus ฿28–45K of textbook write-off. The schedule was not flexible: the intake calendar set a hard, externally-fixed deadline.
Project timeline · month-by-month
Jan
Feb
Mar
Apr
May
Jun
Requirements & As-Is
1 mo
Master data (~180 items)
2 mo
Statistical modelling
2 mo
Config + workflow + FSD
2 mo
UAT & defect fixes
2 mo
Training + Go-Live
LIVE
DeliveredRisk / slippedRecoveredGo-LivePlanned / in progress
Schedule risk & recovery
✓
UAT blocker · Goods receipt could not post
During UAT, goods-receipt posting was blocked for the IT-asset item category because no GL account determination existed (FSD-P1-02), a silent stopper that would have frozen receiving. Resolved → I traced it to a missing mapping, specified the fix to dev (category → GL 160000), retested, and kept Go-Live on the intake date.
✓
Adoption risk · staff trusting the system over intuition
The statistical reorder points were correct, but procurement staff were used to ordering by gut feel: the real risk to the result was non-adoption, not configuration. Resolved → I ran weekly adoption reviews for the first 3 months post Go-Live until system-driven reorder points became the default.
Write every rule as a decision table (input → expected output), not prose.
Specify the data model field-by-field: keys, types, validation.
Define GL posting and workflow thresholds explicitly, with examples.
Enumerate edge & negative cases up front (multi-select, zero, partial, duplicate).
Agree a Definition-of-Done before the build starts.
How I verify the build (functional, not source-code review)
Functional trace: every FSD rule reproduced in the build.
Data model check: fields, keys and validation match the spec.
Posting check: correct GL accounts, debit/credit, contra logic.
Workflow check: routing & thresholds behave per the matrix.
Negative / edge tests before happy-path sign-off (the DEF-001 lesson).
Regression after every fix: nothing closes without a retest.
Weekly Agile cadence
MON
Backlog & defect triage by severity
TUE
Spec clarification with dev
WED
Build structure review vs FSD
THU
Test / retest fixed items
FRI
Demo + stakeholder sign-off
2× / wk
Dev structure reviewsconfirm
12 wk
Weekly post-live adoption reviews
0
Unauthorised POs since Go-Live
Stakeholder network & RACI
Chatree · sole consultant single point of accountability across ~15 procurement staff · dept heads + director · 10+ vendors · remote XeerSoft dev team
Stakeholder
Count
Their part
RACI
You · Consultant/BA
1
Requirements, config, FSD, UAT, training
A / R
Director & Dept Heads
2+
Approval workflow authority (฿50K rule)
C / A
Procurement staff
~15
Day-to-day users; trained & on-boarded
I / R
Vendors
10+
Master data, lead-time, scorecard
C
XeerSoft dev team
remote
Built config logic from my FSD
R
I was the only consultant, but not working alone. I was the single node connecting approvers, ~15 users and the vendor dev team, and the only person with end-to-end visibility of requirements, build and adoption.
Consultant Takeaway
The biggest learning was that ERP success is 30% configuration and 70% adoption. The statistical models were rigorous, the workflow was clean, but the real win came from training procurement staff to trust system-driven reorder points instead of intuition. Weekly review sessions for the first 3 months post Go-Live were critical to making the change stick.