← Manual home

V8 · Settlement

How a settled month is computed — from meters and nominations through matching, pricing, the ledger and the statement you read.

You are here
1Setup
→
2Strategy
→
3Deal
→
4Nominate
→
5Market day
→
6Settle
→
7Statement

1. What settlement does

In plain words — the problem settlement solves

After a day or a month closes, every party needs a number they can trust:

Settlement is the platform’s routine that answers those questions. It takes meters, nominations (when used), and the contract terms you already signed, and turns them into:

  1. quantities (matched / delivered / spill / shortfall),
  2. money lines (energy, wheeling, WER, fees, adjustments),
  3. a double-entry ledger that sums to zero, and
  4. a statement each party can read from their own seat.

Nothing here invents energy or invents rand. If a figure appears on a statement, it came from a meter (or an agreed substitute), a carve of a shared meter, a contract rule, or a network tariff table — and every credit has a matching debit somewhere (§8).

The settlement rhythm — what “a period closes” means
Period open
→meters / nominations land
Engine runs
→match · price · ledger
Period settled
→you read
Statement

How often a period closes is set on the deal (Settlement Frequency — daily or monthly). Inside each period the engine still thinks in short intervals (typically 20 minutes), then rolls them up.

Three shop fronts — how each is settled

Deals always sit on concrete shop fronts from V2:

Shop front Everyday meaning What settlement looks at for them
Generator Site An IPP plant that injects energy Generation meters (and, when the plant is shared, the allocation carve that says how much of the meter each deal may claim — §5 · §6)
Off-taker Site A factory, mall, data centre… that consumes Consumption meters; residual grid purchases sit outside the deal
Trader Pool A book that buys and sells for a portfolio The pool’s buy-leg PPAs (cost) and sell-leg PPAs (revenue); settlement of each leg is ordinary; the trader’s margin is the commercial roll-up (§10)
Every settlement period is always “one contract × one closed window” — but the parties on that contract are always these shop fronts
Generator Sitesupply series
↔︎PPA / VPPA
Off-taker Sitedemand series
Generator Sitesell into pool
↔︎buy-leg
Trader Poolmiddle book
↔︎sell-leg
Off-taker Siteretail buyer

Physical vs virtual (one sentence each). A physical deal wheels energy on the network — losses and use-of-system charges apply. A virtual deal is a money hedge (strike vs credit) — the buyer still draws the grid; matching still uses overlap of supply and demand shapes (V7 §9). Both kinds run through the same five-stage pipeline (§2).

One-to-one — the simple case

The easiest picture is one plant ↔︎ one buyer under one contract.

Example (demo direct line): IPP2 Atlantis Wind → OffTaker C Midrand DC on PPPA-202607-138209764.

For each interval:

  1. Read the plant meter (supply) and the site meter (demand).
  2. Match = the smaller of the two.
  3. Apply losses → delivered at the buyer (physical).
  4. Price that energy; write network lines; post the ledger.

Nobody else is claiming that plant meter for this deal. Conservation is local and obvious: what the plant put in equals matched-to-this-buyer + spill (and losses sit on the delivered path).

One-to-one — one Generator Site, one Off-taker Site, one PPA
IPP2 Atlantis Windmeter MTR-NERSA-GEN-1002
→one physical PPA
OffTaker C Midrand DCmeter MTR-OTS-…c_private
One interval, one-to-one (illustrative) — plant 500 · site 420 · 5% loss
11:00match
Generator Site500 kWhmetered injection
min→match 420 · spill 80
Off-taker Site420 → 399 delivered× 0.95 loss factor
Matched420 kWhmin(500, 420)
Spill80 kWhplant above this buyer
Delivered399 kWh420 × 0.95

Many-to-one — one plant shared by many buyers

Often one Generator Site sells to many Off-taker Sites and/or Trader Pools at once. The plant has one generation meter. You cannot let every buyer’s contract pretend the whole meter is theirs — that would invent energy.

So the platform first carves the meter among the plant’s active deals (the Global Allocation Hierarchy — taught in V4, consumed here in §5 / §6). Only after that carve does each PPA run its own Match against its own buyer demand.

Many-to-one from the plant — one Generator Site, many buy-side shop fronts
One Generator Siteone injection meter
⇉allocation carve
Trader Pool Abuy-leg PPA
⇉
Off-taker Site Bdirect PPA
⇉
Off-taker Site Cdirect PPA

Toy numbers (one interval). Plant meter = 100 kWh. Three claimants after the hierarchy rules: 30 + 20 + 50 = 100 ✓. Each deal then matches only against its carve:

Deal’s carve That buyer’s demand Matched for that deal
30 kWh 25 kWh 25 (5 kWh residue inside the carve)
20 kWh 40 kWh 20 (buyer still short 20 from the grid / other supply)
50 kWh 50 kWh 50
Shared plant meter — carve first, then each PPA matches on its own slice
Step AAllocate the 100 kWh meter
Whole plant meter100 kWh
↓ hierarchy carve (PRIORITY → PRO_RATA → FIXED)
Trader Pool A30 kWh carve
30
Off-taker B20 kWh carve
20
Off-taker C50 kWh carve
50
Carve slices sum to meter

Careful. Opening Off-taker C’s settlement and seeing “50 kWh supply” does not mean the plant only made 50. It means this contract’s share was 50. The rest of the meter belongs to other members’ periods.

Many-to-many — buyers fed by several sources

The mirror picture: one Off-taker Site (or one Trader Pool on the buy side) can hold many contracts at once — several Generator Sites and/or several sell-side Trader Pools. Each contract still settles separately. The site’s total meter is not “owned” by one PPA; each deal only claims the energy its own match produced.

Example shape:

Settlement does not merge those into one blob. You get one period per contract. The mall’s “total bill story” is the sum of: each PPA’s statement + ordinary utility for the residual.

Many-to-many — one Off-taker Site consuming from several sources
Generator Site Xdirect PPA
→
Off-taker Siteone consumption meter
Trader Pool T1sell-leg PPA
→
Generator Site Yanother direct PPA
→

Trader Pool in the middle. A pool is often both many-to-one and many-to-many at once:

Trader Pool — many sources in, many customers out; each arrow is its own settled contract
IPP Abuy-leg
→
Trader Poolbook
→
Off-taker 1sell-leg
IPP Bbuy-leg
→
→
Off-taker 2sell-leg

What the routine produces (and what you open)

You open… You are looking at…
Contracts → one agreement Six tabs on one page: Overview, Settlements, Ledger, Statements, Disputes, Termination (§12)
Settlements One contract’s windows — energy, money, status chips
A window (period detail) How that window was resolved, matched, priced and written to the book
Ledger How the windows add up, month by month (§12.4)
Statements The sendable document for your seat (§9)
Allocations (IPP) Why a shared plant meter was carved before settlement (V4 · §6)

Status chips (DRAFT / FINAL / re-run, and so on) tell you whether the period is still provisional or locked for the statement — taught in §11.

The five stages (preview)

Every period walks the same spine. Later chapters zoom each stage; you only need the names here:

Settlement pipeline — pure stages; the database is written once at the end
1Resolvemeters → series
→
2Matchmin + losses
→
3Pricetariff · TOU
→
4Adjustspill · bank · short
→
5LedgerΣ = 0

When a Generator Site is shared, an Allocate step sits between Resolve and Match so each contract only sees its carve (§5). §2 walks both paths: Example A Atlantis Midrand day (one-to-one, Allocate skipped) and Example B GEN-1 Acme / Borg peak carve (Allocate on).

Where this is taught next. Periods, intervals, frequency, and why shared plants settle in the same window (§1.1) · matching and conservation (§1.2) · the full pipeline with both examples (§2).


1.1 Periods, intervals and frequency

Settlement thinks in three nested clocks. Mix them up and the screens look contradictory; keep them straight and every number has a home.

Clock Everyday meaning Who chooses it
Settlement Frequency How often a statement bucket closes — daily, weekly, bi-monthly, monthly, quarterly Joint term on the deal (V7)
Settlement period One contract × one closed calendar window of that frequency — the row you open under Settlements Created when that window closes and the engine runs
Interval The fine grain inside the period — usually the same 20-minute (or hourly) buckets the meters use Meter / network cadence (V1 §7 · V2 §7)
Three nested clocks — frequency chooses the bucket; the period is one contract’s closed bucket; intervals fill the bucket
Frequency
→closes a window
Period
→filled by
Intervals
→rolled up to
TOU · totals

A monthly deal still matches every 20 minutes for the whole month — then shows you the month total. Frequency is not “how often the maths runs at fine grain”; it is “how often a statement bucket closes.”

What each concept is (nothing assumed)

Settlement Frequency. Written on the signed deal. It answers: when do we close the books for this contract? Most wheeled PPAs are MONTHLY; some books prefer DAILY so cash and disputes stay short. Both sides must agree — it is a joint term.

Settlement period. The concrete artefact for this contract in that closed window. Example: physical PPA PPPA-… × 9 Jul 2026 (daily), or the same PPA × July 2026 (monthly). On that period you see matched / delivered / spill / shortfall, money lines, status (DRAFT → FINAL…), and the content hash (§11).

Interval. One short slice of time inside the period. The engine does not invent a single monthly average and call it a day. For each interval it:

  1. reads supply and demand for that slice,
  2. matches (after any shared-meter carve — below and §5),
  3. applies losses / price / adjustments for that slice,

then rolls up intervals into TOU bands (peak / standard / off-peak) and the period totals on the screen.

Inside one period — every interval is settled, then rolled up
One periode.g. one day
Interval 00:00match · price20 min
→
Interval 00:20match · price20 min
→
… 72× …same day
→
Roll-upTOU · totalswhat you read

One contract, one period row — but shared plants settle together

Each buyer still opens their own settlement period for their PPA. That does not mean the plant’s meter is carved in isolation.

When several contracts claim the same Generator Site meter, the platform groups them into a supply allocation set and runs Allocate once for that closed window before Match. Each member then gets its own period row — but all members of the set use the same calendar window and the same carve.

They must also share the same Settlement Frequency. The runner groups by {frequency, generation meter}: a daily deal and a monthly deal on the same plant are not in one set, because their closed windows are not the same shape.

Shared Generator Site — many buyer periods, one Allocate pass for the closed window
Generator Siteone meter · one window
↓Allocate once
carve A + carve B + …Σ = meter
Buyer A periodown PPA row
·same window
Buyer B periodown PPA row
·same window
Buyer C periodown PPA row

The mirror case — several sellers into one Off-taker Site meter — is a demand allocation set: same idea, consumption carved once for the window, then each seller’s period matches against its share (§5).

Why the same period matters (worked picture)

Imagine one wind plant meter reads 100 kWh in an interval, and two buyers claim it. Buyer A’s demand shape wants 70, Buyer B’s wants 50. Pro-rata to demand (illustrative) might carve 58 to A and 42 to B — summing to 100.

Correct — all claimants carved in the same closed window
Same windowPlant meter · 100 kWh
Shared meter100 kWh
↓ Allocate once (e.g. pro-rata to demand)
Buyer A period58 kWh carve
58
Buyer B period42 kWh carve
42
AB58 + 42 = 100 ✓

If each buyer were settled alone, each run would see the full 100 and could match as if the whole plant were theirs — energy sold twice, and no way to prove Σ shares = meter.

Wrong — claimants settled apart; each run sees the whole meter
BrokenSame 100 kWh claimed twice
Buyer A alonesees 100
100 claimed
Buyer B alonesees 100
100 claimed
100 + 100 ≠ 100 ✗ — conservation broken

Common question — do all buyers on a Generator Site settle in the same period?

Short answer. Yes for a shared plant meter. Every buyer PPA that claims that meter (at the same Settlement Frequency) must be carved in the same closed window, in one supply allocation set. Otherwise a correct allocation is impossible.

How the platform keeps frequencies aligned. The first AGREED (or SIGNED / ACTIVE) contract on a Generator Site locks that site’s Settlement Frequency. Every later proposal and PPA — physical or virtual — that sources energy from the same plant must use that same frequency. Advisors and Proposal Studio prefill and restrict the field; negotiation wizards show it as locked; send / accept / AGREED transitions reject a mismatch. (Meter intervals — the 20-minute fine grain — are not a negotiated term; only the statement frequency is.)

In plain words. Allocation is a single pie-cutting step: the plant meter is the pie; each claimant’s demand (or priority tier) is how the knife is guided. You cannot cut a fair pie if some claimants are missing from the table — or if each claimant gets a private copy of the whole pie on a different day.

So:

  1. The engine groups those PPAs into one allocation set for the window.
  2. Allocate runs once → each contract receives only its carve.
  3. Each contract still gets its own settlement period row (quantities, money, statement for that seat).
  4. Those rows all cover the same [period_start, period_end) for that frequency.

If they were settled separately — or on mismatched frequencies so they never group — each run would see the full meter and conservation would break. The same rule applies on the demand side when several sellers share one Off-taker Site meter.

Where the carve is taught next. Flat allocation sets and claim sets — §5. Priority / hierarchy waterfalls — §6. Matching after the carve — §1.2.

1.2 Matching and conservation

Matching answers one plain question for every short interval inside a settlement period:

Of the energy the plant put in, and the energy the buyer took out, how much can this deal honestly claim?

The answer is never “whatever we hoped for.” It is the overlap — the smaller of the two sides — after any shared-meter carve (§5). That overlap is matched energy. Everything else is residue: spill or shortfall. Getting those three ideas right is what makes a statement trustworthy.

The three quantities — in everyday words

Word Everyday meaning Formula (after Resolve / Allocate)
Matched Energy both sides can claim under the deal min(supply, demand)
Spill Plant made more than the deal could take supply − matched (when supply > demand)
Shortfall Buyer needed more than a firm promise delivered unmet firm quantity (not every deal has this)

Supply comes from the generator meter (or that contract’s carve of a shared plant meter). Demand comes from the buyer’s consumption meter (or a nomination when the meter is late — §3). Neither side invents kWh.

Matching is the overlap — only the overlapping slice is “under the deal”
One intervalSupply 500 · Demand 420
Plant supply500 kWh
420 matched 80 spill
Buyer demand420 kWh
420 matched (all covered)
MatchedSpillmatched = min(500, 420) = 420

Why matching matters

  1. You only pay (or get paid) for what overlapped. A windy plant and a quiet factory do not create a deal volume equal to the plant — only the hours (and intervals) where both were “on” count.
  2. Physical losses apply to matched energy, not to the whole plant meter (§4). Delivered at the buyer is typically matched × (1 − loss factor).
  3. Virtual hedges use the same overlap idea for the CfD quantity (V0 §5 · V7 §9) — even though no electrons are wheeled on the hedge leg.
  4. Shared plants carve first, then match (§5). Each contract matches against its carve, not the whole meter.

Spill — leftover supply, and why you care

Spill is plant energy that did not find a home under this deal in that interval. It is not a bug. Wind and solar often make more than the buyer was consuming at that moment.

Why it is important:

Shortfall — missed firm promise, and why you care

Shortfall is different. It only bites when the contract promised a firm quantity or shape (for example BASELOAD, SHAPED, or ToP-style obligations) and the matched / delivered volume falls short of that promise after excused windows (grid curtailment, force majeure, and so on — as negotiated).

Deal flavour Typical residue when shapes miss
As-generated (common wheeled PPA) Spill on the plant; buyer residual load stays on the grid — usually no contractual shortfall penalty
Firm / ToP / shaped Spill still possible; shortfall remedies can fire if the firm promise was missed (§7)

Why shortfall matters:

Shortfall (illustrative firm hour) — promise 400, matched 280 → 120 short
Firm promiseDemand / obligation 400 kWh
What the deal covered280 matched
280 matched 120 shortfall
MatchedShortfall

Conservation — nothing invented, nothing lost in the books

Conservation means the arithmetic closes:

  1. Energy (this contract, this interval / period).
    supply = matched + spill
    and, when a firm promise applies,
    firm obligation = matched + shortfall (after excuses).
  2. Shared meter (many contracts).
    Σ carves = plant meter before each contract matches (§5–§6).
  3. Money.
    Every credit has a matching debit — the ledger sums to zero (§8).

If any of those fail, the period is wrong — not “approximately fine.”

Conservation chain for one physical deal
Meter / carve
→Match
Matched + spill
→losses
Delivered
→price
Ledger Σ = 0

Spill is still real energy — it just is not under this deal’s matched line. Delivered is matched after network loss. Cash is a separate zero-sum proof.

Worked day — IPP2 Atlantis Wind → OffTaker C (demo)

Data. full_demo · seed 42 · stage S09 (settlement matrix) · physical PPPA-202607-138209764 · period 2026-07-09 · DRAFT · one-to-one (no shared carve on this thread period).

Quantity Value Where it comes from
Resolved supply (IPP2 meter MTR-NERSA-GEN-1002) 41,418.44 kWh Generation meter for the day
Resolved demand (OffTaker C meter) 38,933.333 kWh Consumption meter for the day
Matched 38,933.333 kWh min(41,418.44, 38,933.333)
Spill 2,485.107 kWh 41,418.44 − 38,933.333
Physical loss (6%) 2,336.000 kWh 38,933.333 × 0.06
Delivered at buyer 36,597.333 kWh 38,933.333 × 0.94

Match in plain words. The plant made more than the data centre used that day. The deal can only claim the buyer’s 38,933.333 kWh. The extra 2,485.107 kWh is spill for this contract — still on the plant’s books for the spill rule, not silently folded into “matched.”

Two conservation proofs (same period):

  1. Supply: 41,418.44 = 38,933.333 matched + 2,485.107 spill ✓
  2. Matched path: 38,933.333 = 36,597.333 delivered + 2,336.000 loss ✓
9 Jul 2026 thread period — supply conserved into matched + spill
IPP2 Atlantis Wind41,418.44 kWh supply
Matched to OffTaker C38,933.333
38,933 matched 2,485 spill
MatchedSpill41,418.44 = 38,933.333 + 2,485.107 ✓
After Match — physical loss turns matched into delivered
9 JulDRAFT
Matched38,933.333kWh
6% loss→2,336 kWh
Delivered36,597.333kWh at buyer
→
Spill (separate)2,485.107spill rule · §7

This thread deal is as-generated: the 2,485 kWh spill is the residue to watch; there is no firm shortfall line just because OffTaker C still bought residual grid energy outside the PPA.

Follow along. Seat: IPP2 Atlantis Wind (IPP app). Path: Contracts → PPPA-202607-138209764 → Settlements → 9 Jul 2026 → Energy balance. Read supply, demand, matched, spill, delivered, loss in that order — then open Ledger for the cash zero-sum (§8).

Where residue becomes money. Spill credits, banking and shortfall remedies — §7. Shared-meter carves before Match — §5. Full pipeline stages — §2.

1.3 What you will be able to explain

By the end of this volume you can open any settled period on ContractSettlementLive and answer: which shop fronts are on the deal, whether this period was one-to-one or sat under a shared carve, where each quantity came from, which pipeline stage produced each line, why the ledger sums to zero, and what the status chip means if the period is re-run.

Where this is taught next. The five stages — Resolve → Match → Price → Adjust → Ledger — are the spine of the volume (§2). Physical vs virtual deal kinds — V0 §5; losses on the physical path — §4; virtual CfD walkthrough — §14.

2. The five-stage pipeline

Settlement is not a black box. After a period closes, the engine walks the same five pure stages for every contract — physical or virtual, one-to-one or shared. Nothing is written to the database until the last stage succeeds. If anything fails mid-way, you get an error, not a half-baked statement.

In plain words, the five stages answer five questions:

# Stage Everyday question What you get
1 Resolve What energy series does each side honestly have for this window? Uniform interval series (supply + demand), each tagged with its source
2 Match How much of that energy can this deal claim? Matched · spill · shortfall · (physical) delivered after losses
3 Price What does that energy cost under the signed tariff? Money on the energy quantity (TOU, escalation, floors/caps…)
4 Adjust What do we do with the leftovers and missed promises? Spill credits, banking, shortfall remedies, curtailment deemed energy…
5 Ledger Who owes whom — and do the books balance? Double-entry line items that sum to zero

Those five names are the product’s real stages (WB.Wheeling.Settlement.Pipeline). Later chapters zoom one stage at a time; this chapter is the spine — shown on two casts so you can see both paths.

Settlement pipeline — five pure stages; the database is written once after Ledger
1Resolvemeters → series
→
2Matchmin + losses
→
3Pricetariff · TOU · esc.
→
4Adjustspill · bank · short
→
5LedgerΣ = 0 lines

Why “pure” matters. Each stage is a calculation: inputs in, outputs out. Topology (who sits on which network — which loss / UoS tables apply) is resolved alongside Match. Persist happens once after Ledger. That is why a DRAFT period either appears complete or not at all — you never see “priced but not matched.”

Stage Taught in depth What the screen usually shows from it
Resolve §3 Provenance / which source won
Match (+ losses) §1.2 · §4 Matched · delivered · spill
Price §7 Energy money lines
Adjust §7 Spill / bank / shortfall lines
Ledger §8 · §9 Signed line items · party statement

Where Allocate fits

Allocate is not a sixth stage. The five stages stay Resolve → Match → Price → Adjust → Ledger. When several contracts claim the same meter in the same closed window, the runner inserts an Allocate step between Resolve and Match so each contract only sees its carve. Conservation: Σ shares = metered for the interval (§5 · §6).

Same five stages — Allocate only appears when a meter is shared
1Resolveone-to-one path
→
2Matchfull series
→
3Price
→
4Adjust
→
5Ledger
1Resolveshared meter
→
·Allocatecarve Σ = meter
→
2Matchper carve
→
3Price
→
4Adjust
→
5Ledger
Data flow — from meters to a statement you can read
Meters / noms
→Resolve
Series
→Allocate?
Carve / full
→Match
Quantities
→Price · Adjust
Money
→Ledger
Σ = 0

Allocate? runs only for a supply or demand allocation set (shared meter). Example A skips it; Example B runs it once for the set.

Two casts used in this chapter

Throughout this volume we return to these two sealed / teaching casts. When a later chapter says “back to the Atlantis Midrand day” or “the GEN-1 Acme / Borg peak carve,” it means that cast and those numbers.

Example A — one-to-one Example B — shared + Allocate
Story One plant, one buyer, one physical PPA One plant meter, two buyer PPAs
Cast Atlantis Midrand day GEN-1 · Acme + Borg
Allocate? Skipped Yes — PRO_RATA_DEMAND
Pipeline walk §2.1 §2.2
UI evidence §12.2 Example A §12.2 Example B
Full day / carve home §13 §5

§2 vs §12.2. This chapter is the conceptual spine — stage by stage, with conservation checks. §12.2 is the same two examples on the settlement detail page — what you read on screen after the pipeline has run.


2.1 Example A — One-to-one (Allocate skipped)

One Generator Site, one Off-taker Site, one physical PPA for the closed window. The plant meter is not shared, so Allocate never runs — Match sees the full resolved series.

Data. full_demo · seed 42 · stages S04/S09 · sealed period 2026-07-09 · PPPA-202607-138209764 · status DRAFT · topology cross_municipal · re-derived via SettlementExplorer.detail/2 (same read model as ContractSettlementLive). Full day walkthrough: §13. UI walk: §12.2 Example A.

Atlantis Midrand day
Seller IPP2 Atlantis Wind (Generator Site)
Buyer OffTaker C Midrand DC (Off-taker Site)
Agreement PPPA-202607-138209764 — physical · AS_GENERATED · DAILY
Tariff FIXED 85.0 c/kWh on delivered energy
Meters Gen MTR-NERSA-GEN-1002 · Load MTR-OTS-thin_offtaker_c_private
Loss factor 6.0000 %
Window one settlement period = 9 Jul 2026 (daily frequency)
Example A — one Generator Site, one Off-taker Site, one physical PPA
IPP2 Atlantis WindMTR-NERSA-GEN-1002
→PPPA-…138209764
OffTaker C Midrand DCMTR-OTS-…c_private

Resolve → Match → Price → Adjust → Ledger

1. Resolve. Both meters were usable, so Resolve took METERED on both sides. No nomination, no provisional placeholder. (Resolution rail detail — §3.)

Side Shop front Source that won Resolved quantity (day total)
Supply IPP2 Atlantis Wind Meter MTR-NERSA-GEN-1002 554,104.234 kWh
Demand OffTaker C Midrand DC Meter MTR-OTS-thin_offtaker_c_private 38,933.333 kWh
Example A — Resolve turns two meters into two series
9 JulResolve
Generator Site554,104.234kWh metered supply
rail→METERED
Supply seriesreadyfor Match
9 JulResolve
Off-taker Site38,933.333kWh metered demand
rail→METERED
Demand seriesreadyfor Match

(Allocate skipped — one claimant on the plant meter.)

2. Match. Overlap only, then the deal’s loss factor:

Step Result
Matched 38,933.333 kWh (min(554,104.234, 38,933.333))
Spill 515,170.901 kWh (supply − matched)
Loss @ 6% 2,336.000 kWh
Delivered 36,597.333 kWh (matched × 0.94)

Conservation: 554,104.234 = 38,933.333 matched + 515,170.901 spill ✓, and 38,933.333 = 36,597.333 delivered + 2,336.000 loss ✓ (§1.2).

3. Price. FIXED 85.0 c/kWh on delivered TOU bands:

TOU Delivered kWh Amount
Peak 8,773.333 R 7,457.33
Standard 19,301.333 R 16,406.13
Off-peak 8,522.667 R 7,244.27
Seller energy 36,597.333 +R 31,107.73

4. Adjust. As-generated: the large spill (515,170.901 kWh) follows the deal’s spill rule (forfeit / bank / credit — §7). No firm shortfall line just because the buyer still drew residual grid energy outside the PPA.

5. Ledger. Seller energy +R 31,107.73 · buyer energy −R 31,107.73; network wheeling / transmission / ancillary / distribution pairs also net to zero (§8). Full line list — §13.4. Buyer seat net ≈ −R 47,210.56; seller seat net +R 31,107.73.

Example A — Atlantis Midrand day skips Allocate
1Resolve554k / 39k
→
2Match38,933 · del 36,597
→
3Price85 c
→
4Adjustspill rule
→
5Ledger+R 31,107.73

Follow along. Seat: IPP2 Atlantis Wind (IPP app). Path: Contracts → PPPA-202607-138209764 → Settlements → 9 Jul 2026 → Energy balance, then Ledger. Same reading order as this walk: Resolve quantities first, Match next, price and signed cash lines last.

Where this is taught next. Resolution rail and sealed Resolve — §3.1 · §3.2. Nomination-first re-run — §3.3. Screen evidence for this day — §12.6. Complete ledger — §13.


2.2 Example B — One-to-many with Allocate

Same five stages. Different supply story: two buyer PPAs claim one Generator Site meter in the same closed window. The runner inserts Allocate between Resolve and Match so each contract only Matches its carve — never the whole meter (§5).

Data. Teaching peak-band roll-up (aligned with the §5 Acme / Borg carve and §12.2 Example B). Shared plant meter GEN-1 · method PRO_RATA_DEMAND · loss 6 % on each physical match. Not the Atlantis Midrand day — that day stays one-to-one.

GEN-1 Acme / Borg peak carve
Shared meter GEN-1 (Generator Site plant meter)
Claimants PPA → Acme · PPA → Borg
Method PRO_RATA_DEMAND (demand ratio 70:35 = 2:1)
Loss factor 6 % on each physical match
Window same closed peak-band roll-up for both PPAs
Example B — one shared plant meter, two buyer PPAs
GEN-1 plantshared meter 84,000
↘PPA → Acme
Acme sitedemand 70,000
GEN-1 plantsame meter
↗PPA → Borg
Borg sitedemand 35,000

Resolve → Allocate → Match → Price → Adjust → Ledger

1. Resolve. Shared supply once; each buyer still resolves its own demand:

Side Series kWh
Shared plant meter Resolved supply 84,000
Buyer Acme site Resolved demand 70,000
Buyer Borg site Resolved demand 35,000

Allocate (once for the set — not a sixth stage). Demand ratio Acme:Borg = 70:35 = 2:1, so the 84,000 kWh pie splits:

Claimant Carve of GEN-1 Check
PPA → Acme 56,000
PPA → Borg 28,000
Σ 84,000 = meter ✓
Example B — Allocate carves the shared meter before either deal Matches
After ResolveGEN-1 · 84,000 kWh
Shared plant meter84,000 kWh
↓ Allocate PRO_RATA_DEMAND (Acme:Borg = 2:1)
Acme carve→ Match vs Acme demand
56,000
Borg carve→ Match vs Borg demand
28,000
AcmeBorg56,000 + 28,000 = 84,000 ✓

2. Match (per contract, against its carve, not the whole 84,000):

Contract Supply (carve) Demand Matched min Unmet (grid / other) Delivered × 0.94
Acme PPA 56,000 70,000 56,000 14,000 52,640
Borg PPA 28,000 35,000 28,000 7,000 26,320

Each carve is fully claimed (matched = carve), so per-contract spill on the carve is 0. The buyers’ leftover demand (14,000 / 7,000) is residual grid or other supply — not a second claim on GEN-1.

3. Price. Each PPA prices its delivered quantity under its signed tariff (TOU / escalation / floors — §7). Acme’s energy money is on 52,640 kWh; Borg’s on 26,320 kWh. Opening Acme’s settlement and seeing supply 56,000 does not mean the plant only made 56,000 — it means this contract’s share was 56,000.

4. Adjust. Spill / bank / shortfall rules run per deal on that deal’s residue. Here the carve was fully matched, so the interesting residue is unmet buyer demand outside the PPA — not a double-sell of the meter (§7).

5. Ledger. Each period page posts its own double-entry lines so that page’s ledger sums to zero. Acme’s page and Borg’s page are separate books that together still explain the shared meter (56,000 + 28,000 = 84,000 ✓).

Example B — Allocate sits between Resolve and Match; each PPA then finishes alone
1Resolve84k shared
→
·Allocate56k + 28k
→
2Matchper carve
→
3Priceper tariff
→
4Adjustper deal
→
5LedgerΣ = 0 each

Where this is taught next. Resolve + Allocate shares for this cast — §3.4. Flat allocation sets and claim sets — §5. Priority / hierarchy waterfalls — §6. Same cast on the detail page — §12.2 Example B.


2.3 Side by side

Example A (one-to-one) Example B (shared + Allocate)
Cast Atlantis Midrand day · PPPA-…138209764 GEN-1 · Acme + Borg PPAs
Allocate? No Yes — once for the set
Supply into Match Full plant 554,104.234 That deal’s carve (56,000 or 28,000)
Headline Match Matched 38,933.333 · Delivered 36,597.333 Acme 56,000→52,640 · Borg 28,000→26,320
Conservation to check matched + spill = supply Σ carves = meter, then each matched ≤ carve
Screen story §12.2 A §12.2 B
Same pipeline destination — two supply stories
Meters
→Resolve
Series
→Allocate?
Full / carve
→Match
Quantities
→Price · Adjust · Ledger
Σ = 0

Example A takes the full series into Match. Example B carves first, then each contract Matches only its slice.


2.4 One interval, end to end

The Atlantis Midrand day is a full day roll-up. The same five stages also run on every 20-minute slice inside that day. Here is a small illustrative interval so you can see the arithmetic without the full-day totals — same stage names, toy kWh for one slice (one-to-one path, like Example A).

Data. Illustrative 20-minute physical slice (teaching numbers, not a sealed explorer row). Stages and reading order match Example A.

Fact Value
Interval 11:00–11:20 SAST
Supply (generator meter) 500 kWh
Demand (buyer meter) 420 kWh
Loss factor 5 % (delivered = matched × 0.95)
Energy price (peak) 142.5 c/kWh
  1. Resolve — supply 500, demand 420.
  2. Match — matched = min(500, 420) = 420 kWh; spill = 80 kWh; delivered = 420 × 0.95 = 399 kWh.
  3. Price — 399 × 142.5 c = R 568.575 energy (buyer → seller).
  4. Adjust — spill 80 kWh follows the deal’s spill rule (forfeit / bank / credit — §7); no shortfall on an as-generated deal.
  5. Ledger — seller +R 568.575 energy · buyer −R 568.575 energy (+ any network / WER lines for the interval). Energy legs net to zero; network legs net Eskom / municipality against the bearing party.
One interval — Resolve → Match → Price (Allocate omitted on one-to-one)
11:00slice
Resolve500 / 420supply · demand
Match→420 · spill 80
Delivered399× 0.95 loss
Price→R 568.575
LedgerΣ = 0± energy pair

Note. Shared-meter periods (Example B) run Allocate before Match so each PPA only sees its share of the metered kWh — otherwise two buyers would each match against the full meter (§2.2 · §5).

The energy proof is local and complete: 500 = 420 matched + 80 spill ✓, then 420 = 399 delivered + 21 loss ✓. The cash proof is separate: +R 568.575 + (−R 568.575) = R 0.00 for the energy pair before the network counter-entries are included.

Follow along (full day). Seat: IPP2 Atlantis Wind (IPP app). Path: Contracts → PPPA-202607-138209764 → Settlements → 9 Jul 2026 → Energy balance, then Ledger — that is Example A, the Atlantis Midrand day.

3. Where the numbers come from

Your first dispute is usually not about a formula. It is about a number: why did the settlement use 40,000 kWh when the trading desk nominated 38,000 kWh? Resolve answers that question before Match, Price or the ledger can change it. Settlement never invents a quantity; it selects the best available interval series for each side of the deal, tags every interval with the source that won, and hands that series downstream.

In plain words:

  1. Find every linked meter, nomination and contracted profile that could speak for supply or demand in this closed window.
  2. Pick the highest-priority usable source per side, per interval (the resolution rail below).
  3. Hand those series to the rest of the pipeline — either the full series (one-to-one) or, after Allocate, each contract’s carve (shared meter).

This chapter is the Resolve zoom. The conceptual five-stage spine with both casts is §2; the same numbers on the settlement detail page are §12.2.

Example A — one-to-one Example B — shared + Allocate
Story One plant, one buyer, one physical PPA One plant meter, two buyer PPAs
Cast Atlantis Midrand day GEN-1 · Acme + Borg
Resolve focus Two meters → two full series Shared supply once + each buyer’s demand
Allocate? Skipped Yes — PRO_RATA_DEMAND
Pipeline §2.1 §2.2
UI evidence §12.2 Example A §12.2 Example B

3.1 The resolution rail

The rail is evaluated independently for supply and demand, interval by interval. It is a precedence rule, not an average and not a forecast. Think of it as four trays stacked by trustworthiness: settlement takes the first tray that has usable data for that interval, records which tray won, and moves on.

Resolution rail for a settlement interval — the first usable source wins; a late meter creates a new eligible result.
METERED
→missing or unusable
NOMINATION
→no series
CONTRACTED
→data late
PROVISIONAL

A usable meter outranks the desk’s nomination. The rail records its source so you can explain the result later.

Priority Source When settlement uses it Everyday reading
1 Metered The linked generation or consumption meter has usable readings for the interval. “What the meter actually said.”
2 Nomination The grid-facing seat is meterless, or its reading is unavailable, and the submitted nomination covers the interval. “What the desk said would happen.”
3 Contracted The PPA supplies a capacity or profile promise for a shaped leg. “What the signed deal promised.”
4 Provisional The required data is late. The period is visibly provisional and can be re-settled. “Placeholder until data arrives.”

A trader seat often has no consumption meter at all: its nominated or contracted series is therefore its demand input. Settlement consumes that series; it does not re-forecast it.

Both running examples start on this rail. On Example A, both sides win METERED for the sealed day (§3.2). On Example B, the shared plant and each buyer site likewise resolve from their meters before Allocate carves (§3.4). When a higher tray arrives late, the rail substitutes on a fresh eligible run — that story is §3.3.

Where this is taught. Meter linkage and interval quality are taught in V2 §7. Strategy and Market Operations own how nominations are authored; settlement only applies their submitted series.


3.2 Example A — Atlantis Midrand day (Allocate skipped)

One Generator Site, one Off-taker Site, one physical PPA. The plant meter is not shared, so after Resolve the full supply series goes straight into Match — Allocate never runs (§2.1 · §12.2 Example A).

Data. full_demo · seed 42 · stages S04/S09 · sealed period 2026-07-09 · PPPA-202607-138209764 · status DRAFT · topology cross_municipal · re-derived via SettlementExplorer.detail/2 (same read model as ContractSettlementLive). Full day walkthrough: §13.

Atlantis Midrand day
Seller IPP2 Atlantis Wind (Generator Site)
Buyer OffTaker C Midrand DC (Off-taker Site)
Agreement PPPA-202607-138209764 — physical · AS_GENERATED · DAILY
Meters Gen MTR-NERSA-GEN-1002 · Load MTR-OTS-thin_offtaker_c_private
Loss factor 6.0000 % (applied at Match, not at Resolve)
Window one settlement period = 9 Jul 2026

What Resolve did on the sealed day

Both meters were usable for the closed window, so Resolve took METERED on both sides. No nomination tray, no provisional placeholder. The day totals that Match then sees:

Side Shop front Source that won Resolved quantity (day total)
Supply IPP2 Atlantis Wind Meter MTR-NERSA-GEN-1002 554,104.234 kWh
Demand OffTaker C Midrand DC Meter MTR-OTS-thin_offtaker_c_private 38,933.333 kWh
Example A — Resolve turns two meters into two series (Allocate skipped)
9 JulResolve
Generator Site554,104.234kWh metered supply
rail→METERED
Supply seriesreadyfor Match
9 JulResolve
Off-taker Site38,933.333kWh metered demand
rail→METERED
Demand seriesreadyfor Match

What Match receives (and what Resolve does not do)

Resolve stops at “which series?” It does not take the overlap, apply losses, or invent spill. Those are Match’s job on the full series:

Step (after Resolve) Result Where taught
Matched 38,933.333 kWh (min(554,104.234, 38,933.333)) §2.1
Spill 515,170.901 kWh §1.2
Delivered @ 6% 36,597.333 kWh §4

Conservation on the sealed day: 554,104.234 = 38,933.333 matched + 515,170.901 spill ✓.

Example A — after Resolve, Match sees the full series
1Resolve554k / 39k
→
2Matchfull series
→
3–5Price…§2.1 · §12.2

Follow along. Seat: IPP2 Atlantis Wind (IPP app). Path: Contracts → PPPA-202607-138209764 → Settlements → 9 Jul 2026 → Energy balance and audit strip. You should see source-derived supply 554,104.234 and demand 38,933.333, then matched / delivered from Match — same cast as §12.2 Example A.


3.3 When the rail changes: nomination first, meter later

The sealed Atlantis Midrand day above already has both meters. This subsection is the demand-side rail story on the same cast: what happens when the off-taker meter is late and a nomination stands in, then the meter arrives. Teaching supply for this walk is a smaller usable IPP reading (so you can see Match move when demand changes); demand ends on the same 38,933.333 kWh that the sealed day uses. It does not replace the sealed full-day supply 554,104.234 in §3.2 / §2.1.

Data. full_demo · seed 42 · stage S09 (settlement matrix) · Atlantis Midrand day · physical PPPA-202607-138209764 · period 2026-07-09 · DRAFT. Teaching supply for the re-run walk below.

At the first run, the IPP meter has reported but the off-taker meter is late. The trader has lodged a 38,000 kWh nomination for the day. You need to know both what the first result means and what changes once the meter arrives.

Input First run Re-settlement
IPP2 Atlantis Wind meter MTR-NERSA-GEN-1002 41,418.44 kWh 41,418.44 kWh
Trader/off-taker nominated demand 38,000.000 kWh reference only
OffTaker C meter MTR-OTS-thin_offtaker_c_private missing 38,933.333 kWh
Physical loss factor 6% 6%
Demand side — nomination wins first; the late meter displaces it on re-settle
NOMINATION
38,000
→meter arrives
METERED
38,933.333

Supply stayed METERED both times. Only the demand source moved up the rail.

First Resolve takes supply from the IPP meter and demand from the nomination: resolved demand = 38,000.000 kWh. Match therefore begins with min(41,418.44, 38,000.000) = 38,000.000 kWh. The period is created as DRAFT with provisional: true — the engine does not pretend the nomination is a meter reading. (Status PRELIMINARY is the “offered for review” stamp a party closer sets with the eye control on the period header — §11.2.)

When the off-taker reading lands, the rail changes only the demand source: resolved demand = 38,933.333 kWh. The fresh Match is min(41,418.44, 38,933.333) = 38,933.333 kWh; delivered energy is 38,933.333 × (1 − 0.06) = 36,597.333 kWh before display rounding. Supply remains conserved: 41,418.44 = 38,933.333 matched + 2,485.107 spill ✓. The additional 933.333 matched kWh is not a manual correction; it is the result of a higher-priority source becoming available.

First run (nom demand) After meter
Resolved demand source NOMINATION METERED
Resolved demand 38,000.000 38,933.333
Matched 38,000.000 38,933.333
Delivered × 0.94 35,720.000 36,597.333
Soft cue DRAFT + provisional new DRAFT (prior REVERSED)

The soft prior becomes REVERSED and a new period is calculated. FINAL and DISPUTED periods never take this automatic path; they require an explicit correction workflow (§11).

Do not add a late meter to a nominated result. The rail substitutes the higher-priority source on a fresh eligible run, so every matched kWh has one provenance path.


3.4 Example B — GEN-1 Acme / Borg with Allocate

Same Resolve rail. Different supply story: two buyer PPAs claim one Generator Site meter in the same closed window. Resolve still runs once for the shared meter (and once per buyer demand). Then the runner inserts Allocate between Resolve and Match so each contract only Matches its carve — never the whole meter (§2.2 · §5 · §12.2 Example B).

Data. Teaching peak-band roll-up (aligned with the §2.2 / §5 Acme / Borg carve). Shared plant meter GEN-1 · method PRO_RATA_DEMAND · loss 6 % on each physical match. Not the Atlantis Midrand day — that day stays one-to-one.

GEN-1 Acme / Borg peak carve
Shared meter GEN-1 (Generator Site plant meter)
Claimants PPA → Acme · PPA → Borg
Method PRO_RATA_DEMAND (demand ratio 70:35 = 2:1)
Loss factor 6 % on each physical match

Resolve — shared supply once, each demand alone

Side Series Source (typical) kWh
Shared plant meter Resolved supply METERED on GEN-1 84,000
Buyer Acme site Resolved demand METERED on Acme load 70,000
Buyer Borg site Resolved demand METERED on Borg load 35,000

Resolve does not split the plant. It only answers “what did GEN-1 say?” and “what did each buyer site say?” Splitting is Allocate’s job.

Example B — Resolve sees one shared supply series and two demand series
GEN-1 plantresolved supply 84,000
↘PPA → Acme
Acme sitedemand 70,000
GEN-1 plantsame resolved series
↗PPA → Borg
Borg sitedemand 35,000

Allocate — carve before either deal Matches

Demand ratio Acme:Borg = 70:35 = 2:1, so the 84,000 kWh pie splits under PRO_RATA_DEMAND:

Claimant Share of demand Carve of GEN-1 Check
PPA → Acme 70,000 / 105,000 ≈ ⅔ 56,000
PPA → Borg 35,000 / 105,000 ≈ ⅓ 28,000
Σ 105,000 84,000 = meter ✓
Example B — Allocate turns one resolved meter into two Match inputs
After ResolveGEN-1 · 84,000 kWh
Shared plant meter84,000 kWh
↓ Allocate PRO_RATA_DEMAND (Acme:Borg = 2:1)
Acme carve→ Match vs Acme demand
56,000
Borg carve→ Match vs Borg demand
28,000
AcmeBorg56,000 + 28,000 = 84,000 ✓

Match inputs per carve

Each contract Matches against its carve, not the whole 84,000:

Contract Supply into Match Demand into Match Matched min Delivered × 0.94
Acme PPA 56,000 (carve) 70,000 56,000 52,640
Borg PPA 28,000 (carve) 35,000 28,000 26,320

Opening Acme’s settlement and seeing supply 56,000 does not mean the plant only made 56,000 — it means this contract’s share of the resolved GEN-1 series was 56,000. Borg’s page shows 28,000. Together they still explain the meter (56,000 + 28,000 = 84,000 ✓).

Example B — Resolve → Allocate → Match (per carve)
1Resolve84k shared
→
·Allocate56k + 28k
→
2Matchper carve
→
3–5Price…per PPA page

Where this is taught next. Flat allocation sets and claim sets — §5. Priority / hierarchy waterfalls — §6. Same cast on the detail page — §12.2 Example B.


3.5 Side by side — what Match receives

Resolve’s job ends when each side has a sourced series. The difference between the two casts is what supply number Match is allowed to see.

Example A (one-to-one) Example B (shared + Allocate)
Cast Atlantis Midrand day · PPPA-…138209764 GEN-1 · Acme + Borg PPAs
Resolve supply Full plant 554,104.234 (METERED) Shared meter 84,000 (METERED once)
Resolve demand Buyer 38,933.333 (METERED) Acme 70,000 · Borg 35,000
Allocate? No Yes — 56,000 + 28,000 = 84,000
Supply into Match Full 554,104.234 That deal’s carve (56,000 or 28,000)
Headline Match Matched 38,933.333 · Delivered 36,597.333 Acme 56,000→52,640 · Borg 28,000→26,320
Conservation to check first matched + spill = supply Σ carves = meter, then each matched ≤ carve
Screen story §12.2 A §12.2 B
Same Resolve rail — two supply stories into Match
Meters / noms
→Resolve
Series
→Allocate?
Full / carve
→Match
Quantities

Example A takes the full series into Match. Example B carves first, then each contract Matches only its slice. Pipeline spine — §2.3.


3.6 Reading provenance on screen

Provenance lives on the Settlement detail page — one composed screen per period (header eyebrow Settlement · …, agreement ref as the title). There are no tabs; you scroll. The same page is walked end-to-end in §12; this subsection is only “how do I open it?” and “where do I look for Resolve / Allocate?”.

How you open it

From the org home, open the Contracts register, then:

  1. Find the agreement (e.g. PPPA-202607-138209764).
  2. Choose Settlements on that row — the Settlements list opens (“Monthly settlement summary”).
  3. Click the period you care about (e.g. 9 Jul 2026).

You land on /org/deals/contracts/:ppa_id/settlements/:period_id (ContractSettlementLive). Full nav and layout — §12.1 · §12.2.

What to look at

Block on the page What it tells you about provenance
Header (status chip + Preliminary / Finalise when soft) Whether this version can auto-re-run (DRAFT / PRELIMINARY vs FINAL / DISPUTED), and the party-closer controls that advance the stamp (§11.2).
Energy balance Supply · Demand · Matched · Delivered by TOU — the quantities Resolve (and Allocate, when it ran) handed to Match.
Audit Topology, calculated_at, content hash — cite this when you dispute a version.

If a value surprises you, ask “which source won?” (and, on a shared plant, “is this the full meter or my carve?”) before asking “which price was used?” That order stops a pricing review from masking an input-data issue.

Example A — full meter Example B — carve
Open Same path: Contracts → Settlements → period on that PPA Same path, but open Acme’s (or Borg’s) agreement period
Energy balance Supply 554,104.234 — the full plant meter (nobody else claimed it) 56,000 (Acme) or 28,000 (Borg) — this deal’s carve, not a second meter
How 56,000 got there — Resolve on GEN-1 (84,000) plus Allocate PRO_RATA_DEMAND
Screen walk §12.2 Example A §12.2 Example B

Follow along. Seat: IPP2 Atlantis Wind (IPP app). Path: Org → Contracts → Settlements on PPPA-202607-138209764 → 9 Jul 2026. You should see Settlement detail with Energy balance supply 554,104.234 / demand 38,933.333, status DRAFT (or PRELIMINARY before closure), and an Audit strip with calculated_at / content hash after a re-run. For the shared-meter story, open the buyer PPA’s period instead and expect Supply to be the carve — §12.2 Example B.


3.7 Resolution questions to ask

Ask for the interval, the source type and the source identifier — not only the displayed total. A meter-backed total needs the meter identifier and reading-quality context; a nomination-backed total needs the submitted series and its cut-off; a contracted total needs the relevant PPA profile. On a shared plant, also ask for the allocation method and the carve — otherwise a 56,000 supply line looks like a 56,000 plant.

That evidence lets both parties reproduce Resolve (and Allocate, when it ran) before they argue about the downstream price.

Question Example A answer shape Example B answer shape
Which source won on supply? METERED · MTR-NERSA-GEN-1002 METERED · GEN-1, then Allocate share
Which source won on demand? METERED · MTR-OTS-…c_private METERED · that buyer’s load meter
What did Match see as supply? Full 554,104.234 Carve 56,000 or 28,000
Did Allocate run? No Yes — PRO_RATA_DEMAND · Σ = 84,000

Do not add a late meter to a nominated result. The rail substitutes the higher-priority source on a fresh eligible run, so every matched kWh has one provenance path (§3.3).

Meter confidence in Resolve

Wheeling resolution reads only current meter revisions and carries their quality, vintage and feed reference. Changing ACTUAL to ESTIMATED changes the input hash even when kWh is unchanged. All-actual input hashes retain the existing encoding. Recomputed content hashes include the new confidence roll-ups; stored hashes on existing periods are never rewritten.

4. Losses and use-of-system charges

Physical wheeling moves energy across a real network. Two things follow: some energy is lost in transit, and the network operator charges for the path. This chapter is how those facts appear on a settlement — not a tariff textbook (that is V2 §8).

4.1 Loss factors — every type, how they are calculated, and how Match uses them

When the plant sends 100 units down the wire, the buyer does not always receive 100. Wires heat up, transformers leak a little, and each network publishes a loss factor that turns “matched at the deal” into delivered at the buyer. Settlement then prices the physical energy lines on delivered, not on the raw match. The gap matched − delivered is the loss volume on the energy-balance card (§12).

This section names every loss type the platform knows, shows how topology decides which ones apply, explains how Match turns them into one period %, and walks physical vs virtual with the same running casts as §2 (Atlantis Midrand day and GEN-1 Acme/Borg).

Honest product note. The contract stores named loss / UoS flags, optional negotiated *_value rates, and a pack-level binding_mode (FIXED or PUBLISHED) on uos_loss_factors. FIXED (the default for existing deals) still applies a single combined loss % from active DLF + TLF + MLF values (§4.1.3) — the teaching haircut sealed demos use. PUBLISHED re-resolves the NERSA-style chain (TLF-Gen at injection → TLF-Load × DLF at delivery) and dimensioned UoS (capacity / demand / admin) from site dimensions + tariff tables for the period date. Municipal buyers can bind MunicipalWheelingConfig (embedded vs separate losses, explicit UoS, WEPS-less-losses). A period stores both loss_factor_pct and a richer loss_resolution audit map. Statements are only “invoice-grade” when sites, binding mode, and published rows for that date are complete.

4.1.1 The seven named items — three losses, four network charges

On a physical PPA the deal carries an embedded pack uos_loss_factors. Each item is a pair: a boolean (“does this apply on this topology?”) and an optional *_value (the rate or factor entered in negotiation).

Short name Full name What it is, in everyday language Role in settlement today
TLF Transmission Loss Factor Loss on the high-voltage Eskom transmission backbone (long-haul wires between regions). Loss % — if tlf is true and tlf_value is set, it joins the Match loss stack.
DLF Distribution Loss Factor Loss on the Eskom distribution network (the local MV/LV wires that feed most sites). Loss % — same: joins the Match stack when dlf + dlf_value are set.
MLF Municipal Loss Factor Loss on a municipal distribution network (City of Johannesburg, Cape Town, …). Loss % — joins the Match stack when mlf + mlf_value are set.
TUoS Transmission Use of System Money charge for using Eskom transmission (capacity / path access — not “missing kWh”). R-line / UoS — see §4.2. Not added into Match’s loss %.
ETUoS Embedded Transmission Use of System Transmission UoS flavour for embedded generators / special connection cases. R-line / UoS — §4.2. Not in Match loss %.
DUoS Distribution Use of System (Eskom) Money charge for using Eskom distribution. R-line / UoS — §4.2. Not in Match loss %.
MDUoS Municipal Distribution Use of System Money charge for using the municipal wires. R-line / UoS — §4.2. Not in Match loss %.

Remember the split:

Two different jobs — do not mix them
Loss factorsTLF · DLF · MLFshrink kWh at Match
separate≠
UoS chargesTUoS · ETUoS · DUoS · MDUoSR-lines after Price

4.1.2 Which losses apply — topology decides

Applicability is derived from the seller site and buyer site, not typed in as a free-form percentage. Each side of the deal contributes what its connection deserves:

How the site connects Contributes (loss + UoS name)
Eskom Transmission TLF + TUoS
Eskom Distribution DLF + DUoS
Municipal MLF + MDUoS
No site (pure trader book with no connection point) nothing

The deal’s flags are the union of both sides. Extra rule: if both sides are municipal but different municipalities, the path also crosses Eskom transmission → add TLF + TUoS.

Seller network Buyer network Loss flags that turn on Everyday reading
Eskom Tx Eskom Tx TLF Same transmission world — transmission loss only.
Eskom Tx Eskom Dx TLF + DLF Long-haul then local Eskom wires.
Eskom Dx Eskom Dx DLF Both on distribution — distribution loss.
Eskom Tx Municipal TLF + MLF Transmission then municipal last mile.
Eskom Dx Municipal DLF + MLF Eskom Dx then municipal.
Municipal Municipal (same city) MLF Stays inside one municipal network.
Municipal Municipal (different cities) MLF + TLF Municipal → Eskom Tx → other municipal.
Trader (no site) Any site buyer’s contribution only Only the connected side’s losses.
Any site Trader (no site) seller’s contribution only Same idea the other way.
Trader ↔︎ Trader — none No wheeled path; no loss pack.
Topology → named losses (then Match sums the active % values)
1SitesTx / Dx / Munix
→
2FlagsTLF · DLF · MLF
→
3Valuesnegotiated fractions
→
4Match %sum → loss_factor_pct

You see the path chips on the proposal / settlements Seller→Buyer card (§3.6 · §12). Those chips are the same topology story that lit the flags.

4.1.3 How Match calculates the one number you see

Physical PPA — formula used at Match

  1. Read each active loss value (stored as a fraction, e.g. 0.0200 = 2%):
    • if dlf == true and dlf_value set → contribute dlf_value × 100 percent
    • if tlf == true and tlf_value set → contribute tlf_value × 100 percent
    • if mlf == true and mlf_value set → contribute mlf_value × 100 percent
  2. Sum those percents → loss_factor_pct (snapshotted on the SettlementPeriod).
  3. For every 20-minute interval:
matched   = min(supply_kWh, demand_kWh)
losses    = matched × (loss_factor_pct / 100)
delivered = matched − losses
          = matched × (1 − loss_factor_pct / 100)

Spill and unmet are computed from supply vs demand before the loss step; losses apply only to the matched slice.

One interval — Match then lose (physical)
Supply500kWh
min→
Matched420overlap
6% loss→25.2 kWh
Delivered394.8priced kWh

Virtual PPA — no loss pack

A virtual hedge has no uos_loss_factors. Match treats the loss factor as 0%:

delivered = matched
losses    = 0

Eskom’s retail / hedge tariff already carries network economics on that side of the book — settlement does not invent a second physical loss haircut. See the worked virtual month (§14).

4.1.4 Worked Example A — Atlantis Midrand day (physical, one-to-one)

Same cast as §2.1 / §12.2:

Cast IPP2 Atlantis Wind → OffTaker C Midrand DC
Contract PPPA-202607-138209764 · physical · 9 Jul 2026
Matched 38,933.333 kWh
Loss factor on the period 6.0000 %
Delivered 36,597.333 kWh
Loss volume 2,336.000 kWh

How 6% can be built from named factors (teaching stack that matches the sealed period — same arithmetic as seeded settlement packs):

Factor Flag Value (fraction) As %
DLF on 0.0200 2%
TLF on 0.0100 1%
MLF on 0.0300 3%
Sum → Match 6%

TUoS / MDUoS may also be flagged on the deal for rand lines; they do not change this 6%.

Levy on the day:

Step kWh Check
Matched 38,933.333 from Resolve + Match
Losses @ 6% 38,933.333 × 0.06 = 2,336.000
Delivered 38,933.333 − 2,336.000 = 36,597.333
Identity 38,933.333 = 36,597.333 + 2,336.000 ✓

Seller energy cash is priced on delivered (here at 85 c/kWh → +R 31,107.73 on the sealed day — §13).

Atlantis Midrand day — matched → loss → delivered
Matched38,933.333kWh
DLF 2% + TLF 1% + MLF 3%→6%
Delivered36,597.333− 2,336 loss

4.1.5 Worked Example B — GEN-1 Acme/Borg (physical, after Allocate)

Same cast as §2.2: shared meter, then each carve Matches alone. Losses apply per deal on that deal’s matched kWh — not once on the whole plant meter.

Assume both Acme and Borg physical deals use the same 6% stack for this teaching peak:

Acme carve Borg carve
Matched (after Allocate) 56,000 kWh 28,000 kWh
Losses @ 6% 3,360 1,680
Delivered 52,640 26,320

Conservation still holds on the plant: 56,000 + 28,000 = 84,000 meter. Losses are not double-counted on the shared meter; they sit on each contract’s matched path.

Allocate first, then lose on each carve
GEN-1 meter84,000
Allocate→
Acme match56,000→ 52,640 del.
Borg match28,000→ 26,320 del.

4.1.6 Topology galleries — how the levy changes with the path

Use one matched slice of 10,000 kWh everywhere so you can compare paths. Values below are illustrative teaching rates (fractions like the contract stores). Swap in the deal’s real *_values when you audit.

A. Eskom Transmission → Eskom Distribution (TLF + DLF)

Typical IPP on Tx into an Eskom Dx customer.

Factor Value %
TLF 0.0100 1%
DLF 0.0500 5%
Match total 6%
kWh
Matched 10,000
Loss 600
Delivered 9,400
flowchart LR
  IPP["IPP on Eskom Tx"] -->|"TLF 1%"| TX["Transmission"]
  TX -->|"DLF 5%"| DX["Eskom Dx buyer"]
  DX --> DEL["Delivered 9400"]
B. Eskom Distribution → Eskom Distribution (DLF only)

Both ends on Dx — only distribution loss in the union.

Factor Value %
DLF 0.0400 4%
Match total 4%

Delivered from 10,000 matched → 9,600 (loss 400).

C. Eskom Transmission → Municipal (TLF + MLF)

Last mile is the city network.

Factor Value %
TLF 0.0100 1%
MLF 0.0300 3%
Match total 4%

Delivered → 9,600.

flowchart LR
  IPP["IPP on Eskom Tx"] -->|"TLF"| TX["Eskom Tx"]
  TX -->|"MLF"| MUN["Municipal buyer"]
  MUN --> DEL["Delivered 9600"]
D. Same-municipality path (MLF only)

Seller and buyer in the same municipal network — no extra Tx flag.

Factor Value %
MLF 0.1024 10.24% (illustrative Cape-style)
Match total 10.24%

Delivered from 10,000 → 8,976 (loss 1,024).

E. Cross-municipal path (MLF + TLF)

Different municipalities → municipal losses plus transmission for the hop between cities.

Factor Value %
MLF 0.0300 3%
TLF 0.0100 1%
Match total 4%

Delivered → 9,600. (UoS picks up TUoS as well — rands in §4.2.)

flowchart LR
  A["Munix A seller"] -->|"MLF"| M1["City A"]
  M1 -->|"TLF + TUoS"| TX["Eskom Tx"]
  TX --> M2["City B"]
  M2 -->|"MLF"| B["Munix B buyer"]
F. Virtual PPA (no loss factors)
Factor %
(none) 0%

Delivered from 10,000 matched → 10,000. No loss volume on the energy-balance card for the hedge leg.

Side-by-side (10,000 kWh matched)
Topology Match loss % Delivered Loss kWh
A · Tx → Dx 6% 9,400 600
B · Dx → Dx 4% 9,600 400
C · Tx → Munix 4% 9,600 400
D · Same Munix 10.24% 8,976 1,024
E · Cross Munix 4% 9,600 400
F · Virtual 0% 10,000 0
Atlantis Midrand day (real sealed) 6% from 38,933.333 → 36,597.333 2,336

4.1.7 How to read it on the screen

  1. Open Settlement detail (/org/deals/contracts/:ppa_id/settlements/:period_id — §3.6).
  2. Energy balance — matched, delivered, loss %, surplus, unmet.
  3. Confirm matched = delivered + losses (physical) or delivered = matched (virtual).
  4. Seller→Buyer card — topology chips tell you why TLF / DLF / MLF were in play.
  5. UoS / WER rand lines are a separate story → §4.2.

Careful — when a statement is invoice-grade. Engine support for the TLF-Gen → TLF-Load × DLF chain, site-dimension lookups, dimensioned UoS, and municipal branches is wired. A period is only as good as its inputs: generator transmission zone, off-taker TLF distance band / voltage / notified capacity, binding_mode: PUBLISHED (or a municipal config), and tariff rows effective on the period date. Otherwise Match stays on the FIXED teaching haircut and the ledger may still show flat NetworkRate c/kWh layers. Check the period’s loss_resolution snapshot on Settlement detail when auditing.

4.2 Use-of-system and WER lines

On both-Eskom topologies the ledger typically posts:

Municipal legs add municipal UoS where the topology says so; the path chips on the proposal (V5 §1) preview which operators appear.

4.2.1 Non-bypassable levies

Two national levies sit beside the network bundle and cannot be contracted away: the electrification / affordability subsidy (:electrification_subsidy) and an explicit NERSA regulatory levy (:regulatory_levy). Both are effective-dated NetworkRate rows — illustrative c/kWh in the demo estate, pending published NERSA figures — never hardcoded constants. The settlement ledger charges each once per physical period on delivered kWh, anchored on Eskom Transmission (the same operator :wer_credit already uses). Virtual PPAs do not post them.

non_bypassable? is a boolean on the rate row, not a function of the category atom. A future determination can make a category mandatory for one operator and not another, or stop being one, without a deploy. The demo estate flags :wheeling, :ancillary, and both new levies non-bypassable; :wer_credit stays false — a credit paid to the buyer is not a charge anyone might try to escape.

The claim is checked, not merely labelled. LevyConservation walks settled periods and requires a non-zero line for every in-force non-bypassable rate that applies on that period’s date. A period settled before a levy existed is not flagged for missing it. Billing Preflight refuses a run over an unconserved month; a monthly worker raises rather than only logging. Settlement detail, the statement PDF/HTML, and the billing document viewer show a plain Non-bypassable badge on those lines — derived from the register, not copied onto every line.

Eskom maintains the two levy categories on Wheeling Charges (/eskom/loss-factors) as a fourth table beside DLF / TLF / UoS. The flag on that table is fixed Yes; it is not a checkbox.

4.3 Reading an Eskom bill alongside settlement

The sample bill below is a teaching bill (2 MWh month, half wheeled) — illustrative rates, same structure as a Megaflex-style account. Use it to see which lines are “grid” vs “wheeled”.

Data. Illustrative rates · not a seeded full_demo statement.

Component Basis Amount (excl. VAT)
Eskom energy (residual grid) 1,000 kWh × R 1.50 R 1,500.00
DUoS network 2,050 kWh × R 0.20 R 410.00
TUoS network 2,050 kWh × R 0.10 R 205.00
Distribution losses (IPP path) 1,050 kWh × R 0.05 R 52.50
Ancillary 2,050 kWh × R 0.03 R 61.50
Affordability / legacy 2,050 kWh × R 0.02 R 41.00
Administration 30 × R 50 R 1,500.00
Subtotal R 3,770.00
VAT 15 % R 565.50
Total R 4,335.50

Here 1,000 kWh was matched at the generator; with a 1.05 delivery factor the wheeled equivalent at the customer is 1,050 kWh. Settlement’s job is to produce the PPA / WER / platform lines that sit beside this bill — not to replace Eskom’s invoice.

Where tariffs are catalogued. V2 §8.

5. Shared meters — allocation and claim sets

One generation meter can feed several PPAs. One demand meter can be served by several sellers. A generator can also sell physically to one buyer and hedge virtually to another on the same electrons. Without an explicit carve, each contract would see the whole meter — and the same kWh would be sold twice.

Settlement prevents that with two groupings that run before Match:

Grouping What is shared Everyday picture Conservation rule
Allocation set Same side, same physical meter Cut one pie among several physical PPAs Σ shares = metered
Claim set One generator, physical and virtual claims Cut one pie so wheeling and a CfD never both take the whole plant Σ physical + Σ virtual ≤ generation

Allocate is not a sixth pipeline stage. The five stages stay Resolve → Match → Price → Adjust → Ledger. When a meter (or generator source) is shared, the runner inserts Allocate between Resolve and Match so each contract only Matches its carve (§2).

Allocate appears only when energy is shared — then Match runs per carve
1Resolveread the meter once
→
·Allocatecarve Σ = meter
→
2Matchper carve only
→
3Price
→
4Adjust
→
5LedgerΣ = 0

5.1 Why allocation matters — what depends on it, what breaks without it

Think of the plant meter as a single pie. Several contracts may want a slice. Allocation is the kitchen knife that cuts the pie once, so every slice adds back to the whole.

What depends on a correct carve

Downstream stage What it receives after Allocate What goes wrong if the carve is missing or wrong
Match Only this deal’s share of supply (or demand) Each deal Matches against the full meter → double-sell
Price Money on matched / delivered energy Over-priced energy on volumes that never existed
Adjust Spill, shortfall, banking on the true residue Spill/bank rules fire on phantom kWh
Ledger / statements Party line items that must sum to zero Seller “earns” more than the plant generated; books look balanced per deal while the plant is oversold
Network / WER Charges and credits on delivered wheeled energy Network operator pays or charges on inflated wheeled volumes
Trader books / chain reconciliation Procured vs sold headroom Portfolio looks funded when the upstream plant was double-claimed (§10)

The consequence of skipping Allocate (broken world). Two buyers each want 80 kWh. The plant generated 100 kWh. Settled separately, each deal would Match min(100, 80) = 80 → 160 kWh sold from a 100 kWh meter. Ledgers can still sum to zero inside each PPA — which is why a balanced ledger is not proof that the plant was not oversold. Only the set-level conservation check proves the pie was cut once.

Without Allocate — each PPA sees the whole meter (double-sell)
BrokenGEN meter · 100 kWh
Shared plant100 kWh
↓ each deal Matches independently (no carve)
Physical PPAclaims 80
80 matched 20 leftover on meter
Second PPAalso claims 80
80 matched 20 leftover
First claimSecond claimΣ matched = 160 > 100 ✗
With Allocate — one carve, then Match (conservation holds)
CorrectGEN meter · 100 kWh
Shared plant100 kWh
↓ Allocate pro-rata to demand (80:80) → 50 + 50
Physical PPAcarve 50
50 matched 30 unmet demand → grid
Second claimcarve 50
50 matched 30 unmet → grid / CfD shape
Carve ACarve BΣ matched = 100 = meter ✓

Careful. A short statement is often an allocation problem, not a meter problem. Before you escalate “the meter is wrong,” compare four facts in order: generator meter → set total → your member carve → your counterparty demand (§6.13).

5.2 Concepts in plain words

Term Plain meaning Platform name
Shared meter One physical meter that more than one active PPA points at (generation or consumption refs) Meter key on the allocation set
Allocation set The group of physical PPAs that must be carved together on that meter Allocation set
Supply set Buyers sharing one generation meter — carve the plant’s output side: :supply · Pipeline.run_set/3
Demand set Sellers sharing one consumption meter — carve the buyer’s load side: :demand · Pipeline.run_demand_set/3
Carve / share The slice of the meter this PPA may take into Match Allocated supply or allocated demand series
Method The recipe for cutting the pie (by demand, by %, by weights…) Multi-buyer alloc method / hierarchy rules
Conservation Slices add back to the whole: nothing invented, nothing sold twice Σ shares = metered (or ≤ for claim sets)
Claim set Every physical and virtual claim on one generator, carved together Claim set · Pipeline.run_claim_set/3
Hierarchy waterfall Ordered tiers (VIP first, then fair share, then fixed caps) instead of a flat split Taught in §6 · authored in V4

Process, step by step (every shared case):

  1. Resolve the shared meter once — one generation series or one consumption series for the closed window.
  2. Resolve each member’s other side — each buyer’s demand, or each seller’s supply / nomination.
  3. Allocate — apply the method; write a carve per member; prove conservation.
  4. Match per member — min(carve, other side) (then losses on physical delivered energy).
  5. Price → Adjust → Ledger — ordinary stages, but on the carve, not the whole meter.

Netting grain is per interval (typically 20 minutes); teaching tables below often show TOU-band totals that are the sum of those interval carves.

5.3 Allocation methods — how the pie is cut

For a supply allocation set (one gen meter, several buyers), the deal or stored allocation set can name a method:

Method Everyday recipe Engine today
PRO_RATA_DEMAND Split output in proportion to each buyer’s demand that interval Default. No stored weight row required.
FIXED_PCT Contracted percentages of output (e.g. 60% / 40%) Needs weights on the allocation set
FIXED_MW Cap by MW entitlement (documented intent) Weights path today — treat as contracted shares unless hierarchy owns the cap
PRIORITY_STACK Ranked fill (documented intent) True ranked fill lives on the Global Allocation Hierarchy (§6), not this enum alone
TOU_SPLIT Different buyers take different TOU bands Enum reserved — not a distinct carve path yet

For a demand allocation set (one consumption meter, several sellers), the engine carves load pro-rata to each seller’s supply that interval — the mirror of PRO_RATA_DEMAND. Stored FIXED / PRIORITY weights are wired for supply sets today.

When an in-force Global Allocation Hierarchy covers the physical members, settlement consumes the PRIORITY → PRO_RATA → FIXED waterfall instead of the flat method (§6). Hierarchy is skipped when virtual claims are present on the same generator — the claim set uses a demand-proportional carve across all claims so physical and virtual stay under one roof.

5.4 Scenario map — which set am I in?

Four topologies — only the first three are meter allocation / claim sets
A · Supply allocation set
1 gen meterplant output
⇉carved to
N buyer PPAseach own demand
B · Demand allocation set
1 demand meterfactory load
⇉carved across
N seller PPAseach own supply
C · Claim set
1 generatorphys + virt
⇉joint carve
Physical + Virtualno double-sell
D · Not a meter set
Trader booknoms / portfolio
⇉Σ sell ≤ procured
Independent legsno shared meter
# Scenario Set type Method in the worked walk Full commercial bible
A1 One IPP → two offtakers Supply allocation set PRO_RATA_DEMAND §5.5 · pipeline §2.2
A2 One IPP → two traders Supply allocation set FIXED_PCT §5.6
B1 Two IPPs → one offtaker Demand allocation set Pro-rata to supply §5.7
C1 Physical + virtual on one plant Claim set Pro-rata to each claim’s demand §5.8
C2 Unequal claim demands Claim set Same rule, skewed carve §5.9
C3 Physical claims only Degenerate claim set Settles like a supply set §5.10
D Trader portfolio (no shared meter) Not Allocate Portfolio invariant §5.11
H Hierarchy tiers on an IPP book Hierarchy (not flat set) PRIORITY → PRO_RATA → FIXED §6

Data. Teaching numbers below align with the multi-party worked examples (June 2026 band roll-ups, illustrative rates) and the claim-set engine tests (100 kWh plant). Loss factor in allocation walks: 5% delivered = matched × 0.95 unless a figure says otherwise (pipeline Example B in §2.2 uses 6% for screen parity).


5.5 Scenario A1 — One plant, two factories (PRO_RATA_DEMAND)

The reader’s problem. Karoo Solar One has one generation meter GEN-1. It signed two physical PPAs — to Acme and Borg. Each factory has its own consumption meter. Without a carve, both PPAs would treat GEN-1 as exclusive supply.

Topology

Supply allocation set — one gen meter, two buyer PPAs
Karoo SolarGEN-1 shared
↘PPA-A1
AcmeCON-A · own demand
Karoo Solarsame GEN-1
↗PPA-A2
BorgCON-B · own demand
PPA-A1 PPA-A2
Seller Karoo Solar One (GEN-1) Karoo Solar One (GEN-1)
Buyer Acme (CON-A) Borg (CON-B)
Set Supply allocation set on GEN-1 same
Method PRO_RATA_DEMAND same

Step 1 — Resolve supply once

TOU GEN-1 generated kWh
Peak 84,000
Standard 198,000
Off-peak 0 (solar)
Total 282,000

Step 2 — Resolve each buyer’s demand

TOU Acme (CON-A) Borg (CON-B) Ratio
Peak 140,000 70,000 2 : 1
Standard 150,000 75,000 2 : 1
Off-peak 40,000 20,000 2 : 1
Total 330,000 165,000 2 : 1

Step 3 — Allocate (cut the pie by hunger)

Per band: Acme share = gen × Acme_demand / (Acme_demand + Borg_demand).

Peak worked: 84,000 × 140,000 / 210,000 = 56,000 · 84,000 × 70,000 / 210,000 = 28,000.

TOU Gen Acme carve Borg carve Σ check
Peak 84,000 56,000 28,000 84,000 ✓
Standard 198,000 132,000 66,000 198,000 ✓
Off-peak 0 0 0 0 ✓
Peak band — PRO_RATA_DEMAND carve of GEN-1 (Acme : Borg = 2 : 1)
AllocateGEN-1 peak · 84,000 kWh
Shared meter84,000 kWh
↓ pro-rata to demand (2 : 1)
PPA → Acme56,000
56k Acme
PPA → Borg28,000
28k Borg
Acme shareBorg share

Step 4 — Match each PPA against its carve

Demand exceeds the carve in every daytime band, so matched = allocated. Each factory still draws residual load from the grid outside the PPA.

Acme matched Acme delivered (−5%) Borg matched Borg delivered (−5%)
Peak + standard 188,000 178,600 94,000 89,300

Conservation: 188,000 + 94,000 = 282,000 = total generation ✓.

Step 5 — What money and network see

Price, losses, WER and the Σ = 0 ledger all run per PPA on the carve. Illustrative IPP energy receivable across both legs ≈ R 292,410 (teaching rates). Full cash walk — §2.2 (peak).

Why this method. When factories are hungrier in different hours, the plant follows who actually consumed, not a frozen percentage. A night with zero solar still allocates zero — you cannot invent energy with a ratio.

Follow along. Seat: IPP with a multi-buyer plant (IPP app). Path: Contracts → either buyer PPA → Settlements → period → Energy balance. Confirm the supply figure is the carve, not the full plant meter; then open the sister PPA and confirm the two carves add to the meter.


5.6 Scenario A2 — One plant, two traders (FIXED_PCT)

The reader’s problem. The same plant sells to Trader X (60%) and Trader Y (40%). Traders nominate demand — they have no factory meter on this leg. The commercial deal is a capacity split, not demand-following.

PPA-B1 PPA-B2
Buyer TraderPool X TraderPool Y
Contracted share 60% 40%
Method FIXED_PCT same
Demand Nominations Nominations

Step-by-step

  1. Resolve GEN-1 once (same 282,000 kWh month as A1).
  2. Allocate by weight: peak 84,000 × 0.60 = 50,400 to X · 33,600 to Y; standard 118,800 / 79,200. Totals: X 169,200 · Y 112,800 · Σ 282,000 ✓.
  3. Resolve nominations (example): X 180,000 · Y 123,000 — both above their carve.
  4. Match: matched = allocated (nomination shortfall is the trader’s downstream problem). Delivered (−5%): X 160,740 · Y 107,160.
  5. Price / ledger on each carve; no WER on a trader demand side for this teaching topology.
FIXED_PCT — contracted 60 / 40 of the same GEN-1 month
AllocateGEN-1 · 282,000 kWh
Shared meter282,000
↓ fixed weights 60% : 40% (not demand)
Trader X169,200
60% · 169.2k
Trader Y112,800
40% · 112.8k
X 60%Y 40%

Contrast with A1. If X nominates huge and Y nominates tiny, FIXED_PCT still gives X 60% of the plant. PRO_RATA_DEMAND would have handed almost everything to X. Choose the method that matches the signed commercial story.

Note. Unit-test shape: meter 100 kWh, weights 70/30 → carve 70/30 even when both buyers’ demands are equal — weights win over hunger.


5.7 Scenario B1 — Two plants, one factory (demand allocation set)

The reader’s problem. Acme has one consumption meter CON-1 but two seller PPAs — Karoo Solar (GEN-1) and Highveld Wind (GEN-2). The factory must not be “fully served” by each seller independently (240k + 240k against a 240k load).

Topology

Demand allocation set — one load meter, two seller PPAs
Karoo SolarGEN-1 own meter
→PPA-E1
Acme CON-1shared load
Highveld WindGEN-2 own meter
→PPA-E2
Acme CON-1same load

Step 1 — Resolve demand once

TOU CON-1 consumed kWh
Peak 90,000
Standard 120,000
Off-peak 30,000
Total 240,000

Step 2 — Resolve each seller’s supply

TOU Karoo (GEN-1) Highveld (GEN-2)
Peak 80,000 40,000
Standard 100,000 50,000
Off-peak 0 30,000
Total 180,000 120,000

Step 3 — Allocate load pro-rata to supply

Peak: Karoo share 90,000 × 80/120 = 60,000 · Highveld 30,000. Off-peak: Karoo has no solar → 0 · Highveld takes the full 30,000.

TOU Load Karoo allocated demand Highveld allocated demand Σ
Peak 90,000 60,000 30,000 90,000 ✓
Standard 120,000 80,000 40,000 120,000 ✓
Off-peak 30,000 0 30,000 30,000 ✓
Demand-set peak — carve CON-1 by each seller’s supply (2 : 1)
AllocateCON-1 peak · 90,000 kWh load
Shared factory meter90,000 kWh
↓ pro-rata to seller supply (80k : 40k)
vs Karoo60,000
60k demand carve
vs Highveld30,000
30k demand carve
KarooHighveld

Step 4 — Match min(seller supply, allocated demand)

Seller Matched Delivered (−5%) Spill (supply − matched)
Karoo 140,000 133,000 40,000
Highveld 100,000 95,000 20,000

Conservation: 140,000 + 100,000 = 240,000 = factory load ✓.

Why this matters. Without the demand set, each IPP would Match against the full 240,000 kWh load → up to 480,000 kWh of “buyer demand” invented from one meter. Spill/bank rules on each seller would also lie. With the carve, each seller’s residue is honest surplus against its slice of Acme.


5.8 Scenario C1 — Physical + virtual claim set (equal hunger)

The reader’s problem. The same generator sells a physical wheeled PPA to Offtaker Phys and a virtual CfD / hedge to Offtaker Virt. Both are active. Virtual settlement still needs a generation shape — if each engine saw the full plant, you would wheel and hedge the same electrons.

A claim set gathers every active physical and virtual claim on that generator, resolves generation once, and carves by each claim’s demand so:

physical_claim + virtual_claim ≤ generation for every interval.

Claim set — one generator, two contract types
Generator site100 kWh interval
↘Physical PPA
Offtaker Physdemand 80
Same sitesame electrons
↗Virtual PPA
Offtaker Virtdemand 80

Step-by-step (one teaching interval)

Input Value
Generation 100 kWh
Physical offtaker demand 80 kWh
Virtual offtaker demand 80 kWh
  1. Resolve generation once → 100.
  2. Allocate pro-rata to claim demand (80 : 80) → physical carve 50 · virtual carve 50.
  3. Match physical against its carve: min(50, 80) = 50 (then apply losses → delivered).
  4. Match virtual against its carve: min(50, 80) = 50 (CfD on that quantity — no wheeled delivery).
  5. Invariant: 50 + 50 = 100 ≤ 100 ✓.
  6. Ledger: each period still nets to zero on its own deal; the claim set is what keeps the plant honest across deal types.
Claim set — physical and virtual share one 100 kWh generation
Claim setGenerator · 100 kWh
One source100 kWh
↓ carve by claim demand (80 : 80)
Physical PPA50 matched
50 phys 30 residual load → grid
Virtual PPA50 matched
50 virt CfD 30 not in hedge qty
Physical carveVirtual carve

Broken world (no claim set): physical Matches 80, virtual Matches 80 → 160 from 100. Activation also guards over-commitment via source capacity checks; settlement’s claim set is the interval-by-interval enforcement.

Where this is taught next. Virtual money path — §14 · physical vs virtual orientation — V0 §5.


5.9 Scenario C2 — Unequal claim demands

Same generator, same two claim types, but hunger differs.

Input Value
Generation 100 kWh
Physical demand 90 kWh
Virtual demand 30 kWh

Carve: 100 × 90/120 = 75 physical · 100 × 30/120 = 25 virtual.

Claim Carve Match min(carve, demand)
Physical 75 75
Virtual 25 25
Σ 100 100 ✓
Claim set with skewed demand — 90 : 30 → 75 / 25 carve
Allocate100 kWh generation
Shared source100
↓ pro-rata to claim demand (90 : 30 = 3 : 1)
Physical75
75 phys
Virtual25
25 virt
Physical 75%Virtual 25%

Consequence. The virtual hedge does not get a free ride on leftover plant after the physical deal Takes what it wants in isolation — both claims are peers in one carve. If the commercial intent is “physical first, virtual on residual,” that story is a hierarchy / priority policy on the IPP book (§6 · V4), and claim sets with virtual members do not run the hierarchy waterfall today — they stay on the joint demand-proportional carve so both contract types remain under one conservation roof.


5.10 Scenario C3 — Physical-only on a generator

If the claim-set enumerator finds only physical PPAs (no active virtual), settlement still succeeds: the generator’s physical members are carved like a supply allocation set (or hierarchy, when in force). There is no second contract type to protect against — the invariant collapses to ordinary Σ physical shares = metered.

Situation What runs
One physical PPA, exclusive meter No Allocate — one-to-one path (§2.1)
Several physical PPAs, shared gen meter Supply allocation set (§5.5 / §5.6)
Physical + virtual on same generator Claim set (§5.8)
Hierarchy in force, physical only Waterfall then Match (§6)

5.11 What is not an allocation set

The reader’s confusion. You open a trader’s settlement page and see two sell PPAs in the same month. Sections 5.5–5.7 taught that “many PPAs” means Allocate carves a shared meter. So you look for an allocation set — and there isn’t one. That is not a bug. Two PPAs on a statement does not always mean one shared pie.

The bakery vs the warehouse

Use two everyday pictures:

Picture What is shared How honesty is enforced Settlement name
Bakery pie One physical meter (one oven’s output, or one factory’s load) Cut the pie once so slices add back to the whole Allocation set / claim set
Warehouse stock A trader’s book of energy they already bought Do not sell more out the front door than you brought in the back Portfolio rule (Σ sell ≤ procured)

In the bakery, every customer is pointing at the same cake on the counter. If you do not cut it, each customer walks away thinking they bought the whole cake. That is Allocate.

In the warehouse, the trader bought 200 crates from suppliers (procurement legs — often each with its own meter or nomination). They then sell 100 crates to Factory P and 85 crates to Factory Q. Those two sales are separate parcels leaving the warehouse. You do not carve Factory P’s meter across the two sales. You ask a different question: did we try to ship 185 crates when we only stocked 200? Headroom left = 200 − 185 = 15 crates. That check is portfolio conservation — taught in depth in §10.

Bakery (shared meter) vs warehouse (trader book) — different honesty checks
Bakery — allocation / claim set
One oven meter100 kWh pie
⇉cut once
Buyer A + Buyer Bslices sum to 100
Warehouse — portfolio (not Allocate)
Trader bookprocured 200
⇉ship ≤ stock
Sell P + Sell Q100 + 85 ≤ 200

Worked warehouse hour (no shared meter)

Trader T procured 200,000 kWh this month (buy legs from an IPP and/or another trader — each leg may have its own meter). T sells to two offtakers on separate consumption meters:

Leg What it is kWh
Buy (procurement) Energy T already secured 200,000
Sell → Pinnacle Own meter CON-P 100,000 nominated / matched
Sell → Quanta Own meter CON-Q 85,000 nominated / matched
Unsold headroom Still in the warehouse 15,000

Each sell PPA settles on its own path: Resolve that offtaker’s meter → Match against T’s nominated supply for that deal → Price → Ledger. There is no step that says “carve CON-P between Pinnacle and Quanta” — those meters are not shared. The only cross-deal rule is:

100,000 + 85,000 = 185,000 ≤ 200,000 procured ✓

Warehouse honesty — sales leave stock; they do not split one factory meter
PortfolioTrader T procured · 200,000 kWh
Stock in the book200,000
↓ independent sell legs (not a meter carve)
Sell → Pinnacle100,000
100k shipped
Sell → Quanta85,000
85k shipped
Unsold headroom15,000
15k still in stock
Sell PSell QHeadroom

Broken warehouse (oversell). If T tried to sell 120k + 100k = 220k from 200k stock, each sell statement might still look tidy alone — but the book is short 20k. That is a portfolio break, not an allocation-set failure. Chain reconciliation surfaces it (§10).

Side-by-side: when do I look for Allocate?

Ask one question: Are two or more active PPAs pointing at the same physical meter (or the same generator source for phys+virt)?

If you see… Shared meter / source? What to look for
One IPP meter → Acme and Borg Yes (gen) Supply allocation set (§5.5)
Karoo + Highveld → Acme’s one load meter Yes (demand) Demand allocation set (§5.7)
Physical + virtual on one plant Yes (generator) Claim set (§5.8)
Trader sells to P and Q on different meters No Portfolio / warehouse check (this section · §10)
Trader buys from two IPPs, each on its own gen meter No shared buyer meter Independent buy legs + book roll-up — still warehouse, not demand-set
Quick sorter — bakery or warehouse?
Open the PPAs
→Same meter refs?
Yes → bakery
→Allocate / claim
Carve Σ = meter
Open the PPAs
→Same meter refs?
No → warehouse
→Portfolio
Σ sell ≤ procured

Careful. A consolidated trader statement that lists two counterparties is not evidence that Allocate ran. Open meter refs on each PPA. If they differ, you are in the warehouse. If they match, you are in the bakery — go back to §5.4.


5.12 Hierarchy bridge — when the carve is a waterfall

The reader’s problem. Your plant meter shows 100 kWh. Your PPA only received 52.5 kWh into Match. The meter is not broken. You are not at the back of a flat “fair share” queue either. You are a member of a Global Allocation Hierarchy — a ranked guest list the IPP authored before settlement ever ran.

Metaphor: VIP rope, then the fair queue, then reserved tables

Imagine a restaurant with 100 seats tonight (the plant meter). Each guest sits under exactly one rule — VIP or fair queue or reserved table — not two badges at once:

  1. PRIORITY — the VIP rope. Named guests are seated first, up to their hunger. A VIP who needs 30 takes 30 seats. 70 seats remain.
  2. PRO_RATA — the fair queue. Peers share what is left by how hungry each is this hour. Demands 25 and 75 on 70 seats → 17.5 and 52.5.
  3. FIXED — reserved tables (other guests). Printed entitlements are seated last, only if seats remain. A “up to 60” card is a ceiling, not a gift certificate — and it belongs to FIXED-tier guests, not to someone already counted in the fair queue.
  4. MATCH — will you actually eat? Settlement then bills you on your carve (here 52.5), not on the whole 100-seat room.

That ordered fill is the waterfall. A flat allocation set (§5.5) is more like splitting one pizza by how hungry people are with no VIP rope. Hierarchy is the restaurant with a guest list. Full tier arithmetic — §6.

Restaurant metaphor — 100 seats; VIP first, then fair queue (demands 25 : 75)
Plant meter tonight100 kWh seats
PRIORITY · VIP rope
Priority buyer30 kWhseated to demand
70 kWh still open
↓
PRO_RATA · fair queue equal tier
Guest B · demand 2517.5 kWh
You (C) · demand 7552.5 kWh
70 × 25 : 75 → 17.5 : 52.5 · FIXED / surplus see 0

Conservation at the restaurant door: 30 + 17.5 + 52.5 = 100 ✓. No seats were invented; the VIP took theirs before the queue.

What settlement does with that guest list

Settlement does not rewrite the guest list. The IPP (or allocation run in V4) already decided who sits where. Settlement only:

  1. Receives your allocated series (your 52.5) instead of the raw 100 meter.
  2. Runs ordinary Match → Price → Adjust → Ledger on that carve.
Hierarchy owns the seating plan; settlement owns the bill
1PRIORITYVIP rope
→
2PRO_RATAfair queue
→
3FIXEDtable ceiling
→
4MATCHwill you eat?
After the waterfall — your carve (52.5) replaces the raw 100 meter at Match
Your seat offer52.5 kWh allocated
Hierarchy carve (not raw meter)52.5
↓ Match on the carve — then Price / Adjust / Ledger
Your settlement supply52.5
52.5 carve 47.5 never yours (VIP + peer)
Your carveRest of plant

The short statement came from rank + shared shortfall, not from a wrong meter. Step-by-step arithmetic — §6.6 · §6.9.

Flat set vs waterfall — pick the picture

Flat allocation set (§5.5) Hierarchy waterfall
Everyday picture Split one pizza by hunger (or by contracted %) Restaurant with VIP rope → fair queue → table ceiling
Who is first? Nobody — peers under one method PRIORITY members fill before others see leftovers
Your “100 kWh on the meter” You may receive a peer share of 100 You receive only what remains after higher tiers
Where authored Deal / allocation-set method IPP Global Allocation Hierarchy (V4)
Where settlement teaches the arithmetic This chapter’s A1 / A2 / B1 walks Full tier walks — §6.5–§6.10

Careful. Fixed entitlement is a cap, not a guarantee — and it applies to FIXED-tier guests only. A short fair-queue carve (52.5 from a 100 meter) needs the four-fact check in §6.13.

Note. When a virtual claim sits on the same generator as physical members, settlement keeps everyone under one claim-set roof (§5.8) and does not run this VIP waterfall for that joint carve today — so physical and virtual cannot accidentally double-book the dining room.

Where this is taught. Authoring ranks, HAF and allocation runs — V4 · IPP. Settlement’s hand-off and the full 100 kWh arithmetic — §6.

5.13 How to diagnose a surprising carve

Work top-down:

  1. Which set am I in? Supply, demand, claim, hierarchy, or portfolio (§5.4).
  2. What was the shared meter / source total for the interval or band?
  3. What method or tier rules cut the pie?
  4. What was my carve vs sister members? Do they sum to the meter?
  5. Only then Match: min(carve, my other side) and delivered after losses.
  6. Money last — Price / Adjust / Ledger cannot repair a wrong carve.
Investigation order — meter → set → carve → match → money
Meter / source
→Set type
Method / tiers
→Carve
Σ check
→Match
Delivered
→Ledger
Σ = 0

Where the carve is taught next. Hierarchy waterfall inside settlement — §6. Screen evidence for the Acme / Borg supply carve — §12.2 Example B. Full one-to-many pipeline with Allocate — §2.2.

6. The hierarchy waterfall inside settlement

Your statement can look short even when the generator meter is right. That usually means your PPA sits in a Global Allocation Hierarchy: the plant’s energy was poured through a ranked guest list before your contract reached Match. You never saw the whole meter. You only saw the slice the guest list left for you.

This chapter is the settlement reading of that guest list — the same restaurant / bakery ideas as §5.12, with every tier, formula and leftover explained in plain words. How the IPP authors ranks and entitlements lives in V4 · IPP. Settlement only consumes the result.

6.1 The problem in one picture

Broken expectation. Plant meter = 100 kWh. You open settlement and think “my supply is 100.” Match, price and the ledger all look “too small.” You escalate a meter fault.

What actually happened. You were never entitled to the whole pie. The hierarchy seated VIPs and peers first. Your carve was 52.5 kWh. Settlement then Matched that carve against your factory’s hunger. A balanced ledger on your PPA does not prove you should have received 100 — it only proves your deal’s books balance on the slice you got.

Two scopes — plant meter vs your member carve
Plant meter100 kWh whole pie
⇉hierarchy carve
Your PPA supply52.5 kWh only
→Match
Statementpriced on the carve

Bridge from §5. A flat allocation set (§5.5) splits one meter among peers under one method (hunger or contracted %). A hierarchy is the restaurant with a VIP rope: order matters, and lower tiers only see what higher tiers did not take (§5.12).

6.2 Concepts in plain words

Term Everyday meaning What to remember
Global Allocation Hierarchy The IPP’s seating plan for physical buyers on that plant One plan per plant (versioned over time); authored in V4
Member One physical PPA / offtaker seat on that plan Each member sits in exactly one tier — not VIP and fair queue
Tier A seating rule: PRIORITY, PRO_RATA, or FIXED Energy visits tiers in that fixed order
Rank VIP queue number (1 before 2 before 3…) Only PRIORITY uses rank
Demand D How hungry that member is this interval (meter, nomination, or profile) Caps what they can be given
Entitlement F FIXED member’s reserved-table size (kWh) A ceiling, not a gift certificate
Remainder R Seats still empty after the last guest was seated Starts as the whole meter; shrinks down the waterfall
Allocated series / carve The kWh offered to your PPA after the waterfall This replaces the raw meter as settlement supply
Surplus Empty seats after every guest was served IPP may sell elsewhere — not poured back to members that hour
Waterfall Pour the jug top → bottom: VIP → fair queue → reserved tables → leftover Same order every interval
One jug of generation — poured down the tiers, leftover is surplus
1meter
GenerationG this intervalthe whole jug
2waterfall
PRIORITYVIP ropefill ranks in order
→
PRO_RATAfair queueshare by hunger
→
FIXEDreserved tablesup to entitlement
3left over
Surplusunsold seatsnot re-poured

Conservation (the honesty check). For every interval:

Σ member carves + surplus = plant meter G

Nothing is invented. Nothing is sold twice inside the hierarchy.

6.3 Flat set vs hierarchy — when which picture applies

Flat allocation set (§5) Hierarchy waterfall (this chapter)
Picture Bakery: cut one pie among peers Restaurant: VIP rope → fair queue → reserved tables
Who goes first? Nobody — one method for all members PRIORITY ranks, then PRO_RATA, then FIXED
Your view of the meter A peer share of G Only what remains after higher tiers
Typical home Few PPAs, simple multi-buyer / multi-seller IPP book with firm vs flexible buyers
Virtual on the same plant Claim set peers (§5.8) Hierarchy is for physical members; phys+virt together use the claim set, not this VIP rope

6.4 What settlement receives

Allocate (here: the hierarchy run) sits between Resolve and Match — same place as in §5. The five stages do not grow a sixth name. Settlement’s Match stage never sees the raw plant meter for a hierarchy member. It sees that member’s allocated series.

Hierarchy owns the seating plan; settlement owns the bill
1Resolveread plant + demands
→
·HierarchyPRIORITY→PRO_RATA→FIXED
→
2Matchmin(carve, demand)
→
3Price
→
4Adjust
→
5LedgerΣ = 0
Hand-off fact Meaning
Carve replaces the meter Your supply input is the member series, not G
Losses come after Match Allocation is bus-bar (pre-loss) energy
Demand still matters at Match If hunger is below the carve, you only Match what you use; residue follows §7
Settlement does not edit rank Change VIP order in V4 Allocations — not on the statement screen

6.5 Tier 1 — PRIORITY (the VIP rope)

Everyday rule. Guests with a VIP ticket are seated in rank order. Rank 1 is filled to their hunger before rank 2 sees a single seat. Rank 2 before rank 3, and so on.

Formula (one VIP at a time). With running remainder R (starts as G):

carve = min(this guest’s demand, R) · then R = R − carve

Short-hour consequence. At most one VIP is partially served. Everyone below that rank gets zero for the interval — even if they were hungry. That is the commercial point of paying for firmness.

Worked VIP-only hour

Plant injects 1,000 kWh. Three PRIORITY guests, demands 600 / 500 / 400 (combined hunger 1,500 — more than the jug).

Rank Guest Demand Carve Why
1 A 600 600 Full — jug had enough
2 B 500 400 Only 1,000 − 600 = 400 left
3 C 400 0 Jug empty before C’s turn
Σ + surplus 1,000 Surplus 0 ✓
PRIORITY only — rank 1 full, rank 2 partial, rank 3 starved
Plant jug1,000 kWh
Rank 1 · VIP A
Demand 600600 kWhfull
400 kWh remains
↓
Rank 2 · VIP B
Demand 500400 kWhpartial — jug runs out
0 kWh remains
↓
Rank 3 · VIP C
Demand 4000 kWhstarved this hour

Note. A zero carve for rank 3 is not a meter error. The jug was real; the seating plan put C behind A and B.

6.6 Tier 2 — PRO_RATA (the fair queue)

Everyday rule. After VIPs are seated, everyone in the fair queue shares whatever seats remain, in proportion to how hungry each person is this interval — not by a frozen name-on-the-door percentage.

Formula. Let R₂ be what is left after PRIORITY. Let TD be the sum of fair-queue demands.

each carve = min(own demand, R₂ × own demand / TD)

Two moods:

Mood Condition What happens
Shortfall R₂ < TD (not enough seats for everyone’s hunger) Everyone scales by the same factor R₂ / TD — no favourite in the queue
Sufficiency R₂ ≥ TD Everyone gets full demand; leftovers flow to FIXED / surplus

Contrast with §5 bakery FIXED_PCT. Contracted 60/40 splits ignore hunger (§5.6). Hierarchy PRO_RATA follows same-interval demand, like PRO_RATA_DEMAND on a flat set — but only on the remainder after VIPs, not on the whole pie.

Worked fair-queue hour (after a VIP)

Data. Teaching interval aligned with §5.12 restaurant numbers · plant 100 kWh.

Input Value
Plant meter G 100 kWh
PRIORITY guest A demand 30 kWh
PRO_RATA guest B demand 25 kWh
PRO_RATA guest C (you) demand 75 kWh
Fair-queue total TD 100 kWh
  1. VIP A takes min(30, 100) = 30. Remainder R₂ = 70.
  2. Fair queue is short: 70 < 100, scale 70/100 = 0.70.
  3. B: 70 × 25/100 = 17.5. C: 70 × 75/100 = 52.5.
  4. Remainder after fair queue: 0. FIXED and surplus see nothing this hour.

Conservation: 30 + 17.5 + 52.5 + 0 surplus = 100 ✓.

VIP then fair queue — demands 25 : 75 on the remaining 70 seats
Plant meter100 kWh
PRIORITY · VIP rope
Guest A30 kWhseated to demand
70 kWh still open
↓
PRO_RATA · fair queue TD = 100, only 70 left
Guest B · demand 2517.5 kWh
You (C) · demand 7552.5 kWh
70 × 25 : 75 → 17.5 : 52.5

Why you see 52.5, not 100. The meter was 100. The VIP took 30. The fair queue had 100 of hunger for 70 seats. Your share of that hunger was 75%, so you received 75% of 70 — not 75% of 100.

6.7 Tier 3 — FIXED (the reserved table)

Everyday rule. Reserved-table guests are seated last, only if seats remain. Each holds a printed entitlement F (“up to 60 kWh/h”). That card is a ceiling, not a promise that 60 will appear.

Formula. Let R₃ be what is left after PRIORITY and PRO_RATA. Let TF be the sum of FIXED entitlements.

scale = min(1, R₃ / TF) · carve = min(entitlement × scale, demand)

Mood Condition What happens
Sufficiency R₃ ≥ TF Each FIXED guest gets full entitlement (still capped by their actual demand)
Shortfall R₃ < TF All entitlements shrink by the same scale — the shock absorber absorbs the pain
Surplus exists Energy left after FIXED Leftover becomes surplus — FIXED guests do not get a second helping above F

Worked reserved-table hour (shortfall)

Plant 100. No VIPs. No fair queue. Three FIXED guests each entitled to 50 (TF = 150). Demand for each is at least 50.

scale = 100 / 150 = ⅔ → each carve 33.333… · Σ = 100 · surplus 0.

FIXED shortfall — three reserved tables, only 100 seats for 150 of entitlement
FIXEDPlant · 100 kWh · TF = 150
Remainder into FIXED100
↓ scale = 100/150 = ⅔ on every entitlement
FIXED D33.3
⅓ of jug
FIXED E33.3
⅓ of jug
FIXED F33.3
⅓ of jug
DEF

Careful. “Entitled to 50” did not create 50. It created a fair shrink to ~33 when the jug was short. Entitlement without remainder is an empty reservation.

6.8 Surplus — empty seats after closing time

Whatever remains after PRIORITY, PRO_RATA and FIXED is surplus:

surplus = G − Σ all member carves (≥ 0)

Surplus is the IPP’s to sell (spot, trader, later market). It is not walked back up the guest list in the same interval. A hungry PRO_RATA member who was scaled down does not receive surplus “because seats were empty at FIXED.” Those are different rules for different guests.

Energy that survives the waterfall becomes surplus — not a second pour
G meter
→PRIORITY
PRO_RATA
→FIXED
Members seated
→leftover
Surplus

6.9 Full restaurant walk — then Match and losses

Data. full_demo · seed 42 · stage S09 (settlement matrix) · illustrative interval on the IPP2 Atlantis Wind book · teaching cast below (VIP A + fair-queue B & C). Loss 6% after Match for the delivered figure.

Step A — Hierarchy carve (seating)

Step Arithmetic Remainder
Start G = 100 100
PRIORITY A min(30, 100) = 30 70
PRO_RATA B 70 × 25/100 = 17.5
PRO_RATA C (you) 70 × 75/100 = 52.5 0
FIXED / surplus nothing left 0

30 + 17.5 + 52.5 = 100 ✓

Step B — Your settlement Match (will you eat?)

Your settlement supply is the carve 52.5, not the meter 100. Your factory demand this interval is 52.5 in the hierarchy inputs above — so Match is:

matched = min(52.5, 52.5) = 52.5

If, on another day, hierarchy used a higher nominated hunger than the metered load that later settles, Match can be lower than the carve; the unused carve residue then follows spill / bank rules in §7. Hierarchy itself never allocates above the demand it was given (carve ≤ D always).

Step C — Delivered after losses

Losses are not applied in the restaurant. They apply on the matched quantity in physical Match:

delivered = 52.5 × (1 − 0.06) = 49.35 kWh

(Teaching variant used elsewhere with demand 48 after a 52.5 carve: matched = 48, residue 4.5, delivered 48 × 0.94 = 45.12 — same pipeline; the shortfall vs carve is a Match story, not a meter story.)

Your path — carve becomes supply; Match and losses follow
You (C)from hierarchy to statement
Hierarchy carve52.5
↓ Match min(carve, demand) → then × (1 − loss)
Matched52.5
full carve used
Delivered @ 6% loss49.35
49.35 delivered 3.15 lost
MatchedDeliveredLoss

Price and ledger then run on delivered (and network lines) exactly as in a one-to-one deal — but the energy quantity already went through the guest list. A Σ = 0 ledger can still accompany a commercially disappointing carve; money balance ≠ “I should have got the whole plant.”

6.10 A second full cast — VIP + fair queue + reserved + surplus

To see every bucket in one hour, use a jug large enough that FIXED fills and something is still left over:

Role Guest Rule Demand / entitlement
VIP A PRIORITY rank 1 Demand 20
Fair queue B PRO_RATA Demand 30
Fair queue C PRO_RATA Demand 30
Reserved D FIXED Entitlement 40, demand 40
Plant G = 130
  1. PRIORITY: A = 20 · R₂ = 110
  2. PRO_RATA: TD = 60 · sufficiency (110 ≥ 60) → B = 30, C = 30 · R₃ = 50
  3. FIXED: TF = 40 · sufficiency → D = 40 · surplus = 10

(If the jug had been only 100, the same guests would give A=20, B=30, C=30, then FIXED shortfall scale 20/40 = 0.5 → D=20, surplus=0 — reserved tables absorb the pain; nobody above them is disturbed.)

All four outcomes — VIP, fair queue, reserved table, surplus (G = 130)
Plant jug130 kWh
PRIORITY
A20VIP
110 remains
↓
PRO_RATA full demand
B30
C30
110 − 60 = 50 into FIXED
↓
FIXED then surplus
D entitlement 4040full table
10 surplus — not re-poured

Conservation: 20 + 30 + 30 + 40 + 10 surplus = 130 ✓.

6.11 What hierarchy does not do

Myth Reality
“My entitlement guarantees volume” Entitlement is a cap; shortfall scales it down; demand can cut it further
“Surplus should top me up” Surplus is not re-offered to members that interval
“Settlement can reorder VIPs” Rank lives on the IPP hierarchy (V4); settlement is read-only
“Physical + virtual use the VIP rope together” Joint phys+virt claims use the claim set carve (§5.8); hierarchy is the physical seating plan
“A zero-sum ledger proves my carve” Ledger proves money on your slice; plant honesty is Σ carves + surplus = G
“Losses shrink the jug before seating” Losses apply after Match on each deal’s matched energy

6.12 Inspecting the result on screen

Work in two rooms:

  1. Allocations (IPP) — why the seating plan gave you 52.5 (or 0).
  2. Settlements (the PPA) — how that carve became matched, delivered, priced and ledgered.

Do not reverse the order. Do not edit rank from the statement.

Follow along. Seat: IPP2 Atlantis Wind (IPP app). Path: Allocations → select the monthly allocation run → member detail for your offtaker; then Contracts → the member PPA → Settlements → selected period. You should see the allocated quantity first and its matched, delivered and priced result second.

Where authorship is taught. Hierarchy membership, rank, HAF/SCE and allocation runs — V4 · IPP (especially the allocation hierarchy chapter). This volume teaches the hand-off into settlement.

6.13 A practical member check

Before you escalate a short statement, compare four facts in order:

# Fact Proves
1 Generator meter G The jug size
2 Σ carves + surplus = G Hierarchy conservation (restaurant closed honestly)
3 Your member carve What settlement received as supply
4 Your counterparty demand → Match → delivered Ordinary pipeline on that carve
Investigation order — jug → seating plan → your seat → bill
Meter G
→Σ + surplus
Your carve
→Match
Delivered
→Ledger
Σ = 0

How to read the outcomes

You observe Likely home Unlikely home
Carve low, G correct, Σ carves + surplus = G Rank / tier / fair-queue scale (V4 hierarchy) Meter fault
Carve looks right, Match much lower Demand / nomination vs meter (§3) Hierarchy bug
Match right, money surprising Tariff / Adjust / network (§7 · §8) Allocation
Ledger Σ = 0 but carve “feels wrong” Still an upstream seating question “Books balanced so volume is fine”

Fixed entitlements remain constraints, not guarantees. In the FIXED shortfall walk, “50 entitled” became ~33. In the fair-queue walk, “75 hungry” became 52.5 after the VIP and the shared shortfall. Price is applied only after those boundaries are known.

Where the carve is taught next. Pricing and spill/bank on residues — §7. Screen evidence for shared-meter (non-hierarchy) carves — §12.2. Flat bakery / warehouse contrast — §5.

7. Pricing and adjustments

Match decides how much energy the deal covers in the closed window. This chapter is the next two questions:

  1. Pricing — what does that energy cost under the tariff you signed?
  2. Adjustments — what happens to energy (or promises) that did not match cleanly — spill, shortfall, banking, curtailment deemed energy?

They are separate stages in the pipeline (§2). Price never invents kWh. Adjust never rewrites the tariff family. Together they turn Match quantities into the money lines the ledger will balance in §8.

After Match — Price puts a rand figure on covered energy; Adjust handles leftovers and missed promises
2MatchkWh covered
→
3Pricetariff × quantity
→
4Adjustspill · short · bank
→
5LedgerΣ = 0

What pricing is (in plain words)

Pricing is the cash register for energy the deal did cover.

The cash register reads the tariff type and fields you negotiated in the deal room (V7 §4.4): base rate, TOU multipliers, escalation, floor, cap, capacity charge, and so on. Per TOU band it computes:

amount = delivered_kWh × effective_rate_c/kWh

then rounds to whole cents. Escalation, if any, moves the base once per full contract year before TOU multipliers and clamps apply.

Think of Match as weighing the fruit, and Pricing as looking up the shelf label (flat, seasonal, inflation-linked, capped…) and multiplying.

What adjustments are (in plain words)

Adjustments are everything that is not “ordinary energy at the tariff” — the leftovers and broken promises:

Idea Everyday picture Typical money / volume effect
Spill Seller had more fruit than the deal took Forfeit, buyback, third-party sale, discounted credit, or bank for later
Shortfall Firm / ToP shape was promised and missed Liquidated damages, replacement energy, capacity cut, penalty (net of excused windows)
Banking Spill saved in a jar Later months draw FIFO within cap %, period and inter-TOU rules
Curtailment deemed Grid said “don’t generate” but the deal still prices that energy Deemed kWh at contract rate, with the instruction kept on the line

Adjustments are taught in §7.2. The rest of this section is the cash register — every pricing type, with numbers.

Bridge. Terms are chosen in V7. Settlement only applies them. Trader margin and chain P&L — §10.

7.1 Pricing — every tariff type, with numbers

Shared teaching month (unless a type needs a different cast). One physical settlement slice after Match and losses:

TOU band Delivered kWh Everyday meaning
Peak 10,000 Expensive daylight / evening tip
Standard 20,000 Shoulder hours
Off-peak 5,000 Night / weekend trough
Total 35,000 What the cash register will price

Money formula used everywhere below:

Rands = kWh × (c/kWh) ÷ 100

(The engine works in cents; tables show readable rands.)

What the pricer reads — negotiated fields → effective rate → money
Tariff typeFIXED · TOU · …
→escalate?
Base c/kWhfor the year
→× TOU / clamp
Effective rate× delivered
Type One-line idea Detailed walk
FIXED One flat sticker price for the term §7.1.1
PAY_AS_GENERATED Same cash register — pay only what was delivered §7.1.2
TOU_LINKED Base × peak / standard / off-peak multipliers §7.1.3
ESCALATED Base grows each contract year §7.1.4
INDEXED Base tracks a named external index §7.1.5
FLOOR_CAP Rate may float, but not below floor or above cap §7.1.6
CAPPED Formula may rise; buyer cap stops the runaway §7.1.7
TWO_PART Energy c/kWh plus a monthly capacity R/MW §7.1.8
MARKET_LINKED Rate taken from a wholesale market reference §7.1.9
TAKE_OR_PAY Flat energy price; unpaid minimum volume is Adjust §7.1.10
FIRM_ENERGY Premium flat rate for a guaranteed shape §7.1.11
BLENDED Two or more of the above stacked by agreement §7.1.12

7.1.1 FIXED — one flat sticker price

Layman’s picture. The shelf label says 85 c/kWh for every hour of the term. No inflation step. No peak premium. Night and day cost the same per kWh delivered.

Negotiated inputs. energy_price_ckwh = 85 · escalation off · TOU multipliers all 1.0 (or unused).

Arithmetic on the teaching month

TOU Delivered Rate Amount
Peak 10,000 85 c R 8,500.00
Standard 20,000 85 c R 17,000.00
Off-peak 5,000 85 c R 4,250.00
Total energy 35,000 R 29,750.00

35,000 × 0.85 = R 29,750 ✓

FIXED — same rate on every delivered band
MonthFIXED
Delivered35,000 kWhall bands
85 c/kWh→
Energy lineR 29,750.00flat sticker

Demo thread. Atlantis → Midrand day uses FIXED 85 c on delivered — §2.1.

7.1.2 PAY_AS_GENERATED — pay only what arrived

Layman’s picture. Same cash register as a flat rate, but the commercial promise is: you only pay for fruit that actually landed on the scale. There is no minimum-volume invoice for energy you did not take. Surplus generation is spill (Adjust), not an energy charge.

Negotiated inputs. Flat (or TOU) energy rate; contract type as-generated; no take-or-pay minimum on the energy line.

Arithmetic. Same delivered 35,000 kWh at 95 c:

35,000 × 0.95 = R 33,250.00 energy.

If the plant produced more than Match, that extra never enters this line — it follows the spill rule in §7.2.

PAY_AS_GENERATED — only the matched/delivered bar is priced as energy
Seller output50,000 kWh available
Plant / carve50,000
↓ Match then Price
Delivered (priced)35,000
35k × 95 c → R 33,250
Spill (not energy-priced)15,000
→ §7.2 spill / bank
Priced energyAdjust path

7.1.3 TOU_LINKED — expensive hours cost more

Layman’s picture. The base sticker is 100 c/kWh, but the shop charges more at peak and less at night: multiply by 1.5 / 1.0 / 0.6.

Negotiated inputs. Base 100 · multipliers peak 1.5, standard 1.0, off-peak 0.6.

TOU Delivered Effective rate Amount
Peak 10,000 100 × 1.5 = 150 c R 15,000.00
Standard 20,000 100 × 1.0 = 100 c R 20,000.00
Off-peak 5,000 100 × 0.6 = 60 c R 3,000.00
Total 35,000 R 38,000.00

Same kWh as FIXED-at-100 would have been R 35,000; TOU shifts +R 3,000 toward peak.

TOU_LINKED — one base, three shelf prices
Peak×1.5
10,000 kWh150 c
→
EnergyR 15,000
Std×1.0
20,000 kWh100 c
→
EnergyR 20,000
Off×0.6
5,000 kWh60 c
→
EnergyR 3,000

Engine note. The pricer always can apply multipliers; TOU_LINKED is the deal-room name that says those multipliers are the commercial point. Flat deals leave them at 1.0.

7.1.4 ESCALATED — the price grows with the years

Layman’s picture. Year 1 sticker 100 c. Each full contract year, grow by the agreed mechanism (here FIXED_PCT 10% — same arithmetic shape as CPI when the rate is supplied). After one anniversary: 100 × 1.10 = 110 c base. Then TOU multipliers apply on top.

Negotiated inputs. Base 100 · mechanism FIXED_PCT (or CPI with rate 10) · start 2025-06-01 · settle 2026-06 · peak mult 1.5.

Step Value
Full years elapsed 1
Escalated base 110.0 c
Peak effective 110 × 1.5 = 165.0 c
Peak 10,000 kWh R 16,500.00
Standard 20,000 @ 110 c R 22,000.00
Off-peak 5,000 @ 110 × 0.6 = 66 c R 3,300.00
Month energy R 41,800.00

Without escalation the same TOU month was R 38,000 (§7.1.3); one year of 10% adds R 3,800 on this shape.

Escalation — anniversary steps the base before TOU and clamps
Base 100 c
→year 1
110 c
→× TOU
Peak 165 c
→× kWh
Money

Careful. Escalation counts full years since start_date, not “calendar January.” Settle before the anniversary and the base has not stepped yet.

7.1.5 INDEXED — follow an external benchmark

Layman’s picture. Instead of inventing your own inflation %, the deal says “track Megaflex / NERSA / named index.” Settlement still needs a resolved base rate for the month (the index observation turned into c/kWh, stored as the energy price path with escalation_mechanism = INDEXED). From there the cash register is the same: escalate if the mechanism says so, apply TOU, clamp, multiply by delivered.

Teaching cast. Index resolves to 112 c base for the month · TOU multipliers 1.5 / 1.0 / 0.6 · teaching delivered bands:

TOU Rate Amount on teaching kWh
Peak 112 × 1.5 = 168 c 10,000 → R 16,800.00
Standard 112 c 20,000 → R 22,400.00
Off-peak 112 × 0.6 = 67.2 c 5,000 → R 3,360.00
Total R 42,560.00
INDEXED — external benchmark becomes this month’s base sticker
Indexpublished
Benchmark→ 112 c basefor the month
× TOU→
EnergyR 42,560on 35,000 kWh

7.1.6 FLOOR_CAP — a band neither side can break

Layman’s picture. The floating rate (index or TOU-raw) may bounce, but it may not fall through the seller’s floor or rise through the buyer’s cap. Settlement computes the raw rate, then:

effective = min(cap, max(floor, raw))

Cast A — floor binds. Raw peak would be 100 × 1.5 = 150 c, but floor = 200 c → peak bills at 200 c.

On 10,000 peak kWh: 10,000 × 2.00 = R 20,000 (instead of R 15,000).

Cast B — cap binds. Raw peak 150 c, cap = 120 c → peak bills at 120 c.

On 10,000 peak kWh: 10,000 × 1.20 = R 12,000 (instead of R 15,000).

FLOOR_CAP — raw rate pushed up to the floor or down to the cap
Peak bandraw 150 c · floor 200 · cap 120 (two casts)
Cast A · floor wins200 c
raw 150 +50 to floor
Cast B · cap wins120 c
capped 120 raw unused
Floor liftCap cut

Full teaching month with floor 80 c and cap 128 c, base 100, TOU 1.5 / 1.0 / 0.6:

TOU Raw Clamped Amount
Peak 150 128 (cap) R 12,800.00
Standard 100 100 R 20,000.00
Off-peak 60 80 (floor) R 4,000.00
Total R 36,800.00

Unclamped TOU was R 38,000; the band moves −R 1,200 on this shape (peak cut more than off-peak lift).

7.1.7 CAPPED — buyer shield against runaway price

Layman’s picture. The formula or index may climb, but the buyer’s cap (or price_ceiling_ckwh) is a hard lid. There may be no seller floor — only “you will not pay more than X.”

Cast. Index wants 140 c flat · buyer cap 128 c · teaching 35,000 kWh all at the capped rate (multipliers 1.0 for clarity):

effective = min(140, 128) = 128 c · 35,000 × 1.28 = R 44,800.00

Without the cap: 35,000 × 1.40 = R 49,000 — the shield saved R 4,200 this month.

CAPPED — formula may ask 140 c; buyer lid holds 128 c
Formula140 c
Uncapped ask140 c
cap 128→
Billed128 c · R 44,800on 35,000 kWh

Note. Deal-room CAPPED volume limits (MWh/yr) are a quantity ceiling on Match/spill — different knob from the price cap. Price lid is this section; volume lid is capacity / spill terms.

7.1.8 TWO_PART — energy plus a monthly capacity bill

Layman’s picture. You pay for the electricity you used (c/kWh) and a standing charge for reserved capacity (R per MW per month) — like a phone plan with airtime plus a line rental. The capacity line is due even if delivered energy is low. A buyer price ceiling can still clamp the energy leg.

Negotiated inputs. Energy base 90 c (TOU 1.0) · capacity R 1,000 /MW/month · contracted 10 MW · optional energy ceiling 110 c.

Line Arithmetic Amount
Energy 35,000 × 0.90 R 31,500.00
Capacity 1,000 × 10 R 10,000.00
Month total R 41,500.00

If escalation or TOU pushed energy to 120 c but ceiling = 110 c, energy becomes 35,000 × 1.10 = R 38,500 and capacity stays R 10,000 → R 48,500.

TWO_PART — energy strip plus capacity strip
Energyc/kWh
35,000 kWh90 c
→
EnergyR 31,500
CapacityR/MW·m
10 MW× R 1,000
→
CapacityR 10,000
EnergyR 31,500
CapacityR 10,000
TotalR 41,500

7.1.9 MARKET_LINKED — the market sets the sticker

Layman’s picture. The energy rate for the period is taken from a wholesale reference the deal names (day-ahead SMP, balancing index, etc.) — not a frozen private sticker. Once that reference is resolved to c/kWh for the settlement month (and any agreed adder), the cash register multiplies by delivered the same way as FIXED.

Cast. Market reference resolves to 102 c/kWh for the month · teaching 35,000 kWh:

35,000 × 1.02 = R 35,700.00

If the deal also has TOU multipliers on top of the market base, apply them as in §7.1.3. Floor/cap bands still clamp after the market rate is known.

MARKET_LINKED — market reference → rate → delivered money
Market indexnamed in the PPA
→resolve
102 c/kWhthis month
→× 35,000
R 35,700energy

Where market prices are taught. Day-ahead and intraday money — V9. This volume only shows how settlement applies the resolved rate to wheeled / delivered quantities.

7.1.10 TAKE_OR_PAY — pay for the minimum even if unused

Layman’s picture. Two bills in spirit: (1) energy for what you actually took, at the flat (or TOU) rate; (2) if you took less than the contracted minimum, you still pay for the missing slice — that second part is an adjustment / shortfall-style line, not a higher c/kWh on the kWh you did take.

Cast. Flat 95 c · minimum commitment 40,000 kWh · delivered 35,000 kWh.

Line Arithmetic Amount
Energy on delivered 35,000 × 0.95 R 33,250.00
Take-or-pay shortfall qty 40,000 − 35,000 = 5,000 kWh priced per deal rule (often same rate → R 4,750.00)
Commercial total R 38,000.00
TAKE_OR_PAY — delivered bar priced as energy; gap to minimum is Adjust
Minimum40,000 kWh promised take
Delivered · Price35,000
R 33,250 energy
Unpaid minimum · Adjust5,000
ToP top-up (e.g. R 4,750)
§7.1 energy§7.2 adjustment

7.1.11 FIRM_ENERGY — premium for a guaranteed shape

Layman’s picture. You pay a premium flat rate because the seller promised a firm shape (not merely “whatever the wind did”). Pricing of delivered energy looks like FIXED at that premium. If the firm shape is missed, the pain is mostly in shortfall adjustments (§7.2), not in a different c/kWh formula.

Cast. Firm premium rate 110 c · teaching 35,000 kWh delivered:

35,000 × 1.10 = R 38,500.00 energy.

If firm obligation was 40,000 and only 35,000 was matched, the 5,000 shortfall follows the negotiated remedy (LD / replacement / penalty) in Adjust — separate from the R 38,500 energy line.

FIRM_ENERGY — premium sticker on delivered; misses go to Adjust
Delivered35k
Firm rate110 c
→
EnergyR 38,500
Miss5k
Shortfall§7.2 remedynot a rate tweak

7.1.12 BLENDED — a stack of simpler rules

Layman’s picture. One contract that says “do a bit of each”: e.g. escalating base + TOU multipliers + a capacity charge + a cap. Settlement does not invent a twelfth formula engine — it applies the stacked fields in order:

  1. Resolve / escalate base
  2. × TOU multipliers
  3. Clamp floor / cap / ceiling
  4. × delivered kWh → energy money
  5. Add capacity line if present

Cast. Base 100 c after escalation · TOU 1.5 / 1.0 / 0.6 · cap 140 c (peak raw 150 → 140) · capacity R 5,000 (5 MW × R 1,000):

TOU Effective Amount
Peak 140 c (capped) R 14,000.00
Standard 100 c R 20,000.00
Off-peak 60 c R 3,000.00
Energy subtotal R 37,000.00
Capacity R 5,000.00
Total R 42,000.00
BLENDED — same pipeline steps, several knobs on at once
Base
→escalate
× TOU
→clamp
× kWh
→+ capacity
Total

Curtailment deemed energy (priced like energy, tagged like an event)

When an SO / grid instruction tagged the interval, settlement may price deemed energy at the contract rate and keep the instruction reference on the line (market-side acknowledgement: V9). Without curtailment-event inputs, deemed lines are simply absent — not invented as zeros.

Example: 2,000 kWh deemed at FIXED 85 c → 2,000 × 0.85 = R 1,700 on a deemed-energy line, separate from ordinary delivered energy.


7.2 Adjustments — spill, shortfall, banking

Residue Typical lines
Spill (supply > match) Forfeit · Eskom buyback · third-party · discounted spill credit · or bank
Shortfall (firm shape missed) Liquidated damages / replacement / capacity reduction / penalty — net of excused windows
Banking Surplus stored; later periods draw FIFO within the cap %, period and inter-TOU rules

Banking FIFO (mini worked table)

Period Bank in Accrue (spill) Draw Bank out Note
M1 0 +12,000 0 12,000 first surplus
M2 12,000 +3,000 −8,000 7,000 FIFO consumes M1 first
M3 7,000 0 −7,000 0 balance cleared

Expiry and inter-TOU limits on the PPA can forfeit remainder before draw — the adjuster enforces the negotiated rule, not a global default.

7.2.1 Top-up provenance and sourcing

A shortfall or replacement-energy line can now name the contract that priced it, not only the category. top_up_term_id is a plain uuid on the LineItem (Wheeling must not belong_to Strategy). The explorer resolves it to a TopUpTerm and replaces the bare category label with:

Source on the term Statement description
ESKOM_RETAIL Replacement energy — Eskom retail (abcdefgh)
TRADER_POOL Replacement energy — trader pool draw (abcdefgh)
MARKET_ORDER Replacement energy — re-declared intraday (abcdefgh)

The eight-character suffix is the term id, so two offtaker deals on the same book do not collapse into one anonymous “replacement energy” row.

Adjuster.shortfall_adjustment/3 and Adjuster.replacement_energy_adjustment/2 stamp top_up_term_id when the PPA carries a term; Ledger.adjustment_lines/4 copies it onto both sides of the balanced pair, the same way it already copies source_term. A PPA or membership with no term still prices through eskom_topup_ckwh / resolve_topup/2 — that cascade is unchanged.

Three sourcing paths, fired only on :ACTUAL / :NOMINATED allocation runs (never :FORECAST / :SIMULATION), from the interval the Allocator first knows the uncovered kWh:

  1. Trader pool draw — leftover supply from the named pool is matched as an :ALLOCATION with applied_rules: [:top_up_draw]. Uncovered remainder stays :SHORTFALL, priced as today.
  2. Eskom retail — the :SHORTFALL valuation is unchanged. After the run persists, settlement posts a :replacement_energy pair on the subject’s period for that month, at the term’s fixed rate or eskom_topup_ckwh, carrying top_up_term_id.
  3. Market order — the shortfall is scored by IdmDecision.decide/2 with the same context shape the IDM cycle already builds. A :redeclare joins that cycle’s action list (top_up_term_id on the action, visible on the lodgement note). A :carry is booked as path 2. There is no second, laxer decision rule for top-up.

Both (1) and (2) respect monthly_cap_kwh: once the month-to-date sourced volume reaches the cap, further hours that month source nothing further against the term. tolerance_kwh is a per-hour floor — at or below it, the hook is a no-op.

The deal-wizard Top-up step that names the term: V7 §4.4 step 11.

7.3 Bridges from the deal room

Every V2 term-family sentence lands here:

7.4 The virtual floating leg

A virtual PPA still prices matched energy at a strike. What changed is the other side of the difference. floating_leg on the agreement chooses that reference:

floating_leg Floating rate Formula per TOU band
ESKOM_CREDIT_RATE (default) Gen-wheeling / WER credit from NetworkRate for the buyer’s tariff, constant for the settlement month CfD = matched × (strike − WER) plus a separate wer_credit pair
SAWEM_SMP Volume-weighted published System Marginal Price across the whole window (the three TOU keys hold that one average) CfD = matched × (strike − window SMP) — no wer_credit
SAWEM_TOU_AVG The same published SMP, volume-weighted inside peak / standard / off-peak CfD = matched × (strike − TOU SMP) — no wer_credit

Strike, escalation, floor/cap and settlement volume basis are unchanged. They already live on CfdModel / Pricer. The ledger still posts a signed :energy pair. Only the source of credit in net = strike − credit switches.

Prices come from Publication.fetch/1 — the public DAM board — converted R/MWh → c/kWh with the existing factor-of-10 helper. A missing Trading Day carries the last published price for that hour slot and flags the period; the estate’s first-ever gap refuses rather than inventing zero.

Worked TOU-average numbers: V7 §8.10. Why WER is silent: §8.7. How the statement names the index: §9.11.

7.5 Upside share — hour by hour

For each matched interval, compare published SMP with the captured threshold. Multiply the positive difference by the seller share, apply the interval c/kWh cap, then multiply by delivered kWh (matched kWh for a CfD). Sum the intervals before applying remaining annual headroom and rounding to cents. A TOU average cannot replace this calculation: averaging before the positive-part operation loses spikes. The Devices panel shows the top five intervals and the total. Carried-forward references have a text badge; a missing price without prior published history refuses the run. Reruns read their pinned interval reference snapshot.

7.6 The volume strike — where the crossing is

Walk intervals chronologically, carrying earlier settled volume in the same month, quarter or contract year. Split the crossing interval into within-strike and above-strike kWh; reprice only the latter. The adjustment is signed and can credit the buyer. Spill treatment routes excess into surplus before spill pricing. For a CfD, the within-strike quantity limits the energy payment while WER retains all matched volume. TOU prorating cannot identify the correct crossing or its actual reference price.

7.7 Availability liquidated damages

Availability uses hourly evidence. Excused hours leave the denominator before available hours are counted. Shortfall is the guaranteed percentage minus measured availability minus the deadband, floored at zero. The damages basis is either Rand per MW per percentage point, or a percentage of period energy charges per point. Apply any energy-charge cap and post a negative seller adjustment. A changed evidence hash supersedes the measurement with a new version; unchanged evidence reuses its row. No measurable hours or incomplete required meter evidence refuses measurement.

For 744 hours with 144 excused, 600 are measurable. If 549 are available, availability is 91.5000%. A 95% guarantee and one-point deadband give 2.5 shortfall points. At 10 MW and R12,000 per MW per point, damages are R300,000; a 20% cap against R1.2 million in energy charges reduces them to R240,000.

7.8 Termination payment on the final period

An effective human-served notice stops energy at the effective-date boundary and supplies the pinned estimated payment for the final shortened window. The seller and buyer receive equal and opposite lines under termination payment. Reversing and rerunning the same window replaces the current run rather than accumulating the payment. This adjustment uses the notice’s contractual dates and assumptions; price devices on the final energy still use individual intervals.

7.10 Curtailment claim recovery

Finalized curtailment claims feed the Money Room with their deemed quantity, claim valuation and final recovered amount. The current claim version contributes once. A matching buyer-side curtailment-credit adjustment is excluded when it names the same claim or the same contract and exact instruction window. Review legacy adjustments without those references before assuming overlap has been resolved. The NERSA cost CSV reports final payments, not an assumed zero. See IPP curtailment claims.

8. The ledger — sum to zero

Match told you how many kilowatt-hours the deal covered. Price and Adjust (§7) turned those quantities into rand amounts. The ledger is where those amounts stop being a private calculation and become a shared set of books everyone can audit.

To read your month-on-month position on one agreement in the product — charges, credits, running balance, drill to lines — open the running ledger room (V6 §12.4). This chapter teaches the sum-to-zero proof; that screen is where the months stack.

What a ledger is (in plain words)

Think of a restaurant bill that must be split fairly among everyone at the table. You do not write one vague total on a napkin. You write every charge and every credit on its own line, naming:

On the line Everyday meaning
Who Which diner this line belongs to (the party)
What for Food, drinks, tip, voucher… (the category)
How much, which way Money owed to them (+) or by them (−)

The settlement ledger is that shared notebook for one closed period on one PPA (or a combined set of PPAs when you are teaching a multi-party month). It is built from line items. Each line item is one signed rand amount attached to one party and one category.

It is not the same thing as:

People often say What they usually mean What the ledger is
“The invoice” A party-facing statement of what they owe or are owed The full set of lines for all parties in the period
“The energy price” A c/kWh from §7.1 Only the energy category lines that result from that price
“My net payable” One organisation’s total on their statement A slice of the ledger — useful, but not the whole proof

What the ledger does

  1. Records every cash movement the period created — energy, network use-of-system, WER credits, spill credits, shortfall penalties, capacity charges, admin fees, banking movements, and the rest.

  2. Always writes in pairs (or balanced groups). If the IPP is owed R 100 for energy, the buyer is charged R 100 for energy. If Eskom is owed R 20 for wheeling, someone (usually the buyer) pays R 20. No orphan “+R 100 with nobody paying.”

  3. Proves conservation of cash the same way Allocate proved conservation of energy (§5): across the whole period,

    Σ (all signed line amounts) = 0

    That is the sum-to-zero rule. Money is rearranged among parties; it is not created or destroyed inside the settlement.

Ledger is the last pure stage — quantities and prices become balanced books
3Pricetariff × kWh
→
4Adjustspill · short · bank
→
5Ledgersigned lines · Σ = 0

Why the ledger is required

Without a ledger you only have a story: “the buyer should pay about R X.” With a ledger you have a proof:

Risk if there were no ledger What sum-to-zero prevents
Seller “earns” energy money that nobody is charged Every +energy has a −energy twin
Network charges appear on the buyer with no receivable for Eskom / the municipality Network lines are paired too
Credits (WER, spill) are granted twice or to the wrong side Credits are mirrored: one party +, the other −
A bug or re-run invents cash Period is invalid unless Σ = 0
Parties argue from different private spreadsheets One shared notebook is the source of truth for statements (§9)

Important nuance. A single party’s net need not be zero. The IPP can be +R 292,410 and the off-taker −R 207,480 in the same period — that is normal. Only the sum across every party and every category must be zero. Your statement shows your pocket; the ledger proves the table’s pockets balance.

One period, many pockets — the ledger ties every pocket to a balancing line
IPP+ energy
⇄equal opposite
Off-taker− energy
Eskom / Munix+ UoS
⇄equal opposite
Bearer− UoS

Signs in this volume. + means money toward that party (receivable / credit to them). − means money from that party (payable / charge to them). The UI may also paint credits and debits; the arithmetic is the same.

8.1 Parties and categories

Every line item answers three questions: who, what for, and which way. This section names the who (parties) and the what-for (categories), including the adjustment families that §7.2 created as money.

8.1.1 Anatomy of one line item

Field Plain meaning Example
Party type + id/name Whose pocket this line touches offtaker · Acme Manufacturing
Category Why the money moved energy, wheeling, wer_credit…
Amount (signed) + to them / − from them −R 194,940.00
kWh / rate (when relevant) Audit trail of the quantity and c/kWh behind the rand 178,600 kWh · TOU peak
Description / source term Human and machine labels for “where this came from” seller energy · network rate

A period is valid only when every such line, taken together, sums to zero.

8.1.2 Parties — who can appear on a line

A party is a role in the commercial and network story — not merely a login. The same organisation can be a trader-buyer on one PPA and a trader-seller on another; the ledger labels the role in this period.

Party type Everyday who What they usually receive or pay on the ledger
ipp The generator (Independent Power Producer) + energy (and sometimes capacity); may bear or receive spill / shortfall per terms
offtaker The factory / end consumer − energy; often − network UoS; + WER credit when Eskom refunds wheeled energy
trader_seller A trader selling out of its book on this leg + energy on sell legs; portfolio view rolls many legs (§10)
trader_buyer A trader buying into its book on this leg − energy on buy legs; may carry network depending on terms
eskom National transmission / distribution utility + wheeling / transmission / distribution / ancillary when it is the operator; − WER when it pays the credit
municipality Municipal network operator (Munix path) Same idea as Eskom for municipal layers — + on UoS it levies
vwp_vendor Virtual wheeling platform vendor Optional + admin / vendor fee on virtual deals
market_operator Market operator (when a market charge lands in wheeling context) Rare on pure wheeling PPAs; see market pots in §8.5
Parties around one physical wheeled deal
IPPsells energy
→PPA
Off-takerbuys energy
→uses grid
Eskom / MunixUoS · WER

On screen (§12). Your settlement ledger view shows your lines and nets. A counterparty volume card may show their kWh so you can check Match — it deliberately does not show their prices. The Σ = 0 proof lives on the whole-period line set (all parties), which statements and ops tooling can re-sum.

8.1.3 Categories — what the money is for

A category is the label on the line: energy versus network versus adjustment, and so on. Group them into four families.

Family A — Energy and capacity (the deal’s own power money)
Category Plain meaning Typical + party Typical − party
energy Payment for delivered (physical) or CfD/strike (virtual) energy at the tariff / strike from §7.1 IPP or trader_seller Off-taker or trader_buyer
capacity Standing charge for reserved MW (TWO_PART — R/MW/month), even when kWh are low Seller Buyer

Layman check. If Match and Price ran, you almost always see energy. Virtual deals still use the energy category for the CfD net (strike − WER credit when WER applies); the WER cash itself is a separate wer_credit category (§14). A market-indexed virtual PPA (SAWEM_SMP / SAWEM_TOU_AVG) still uses energy for that net, but does not post wer_credit at all (§8.7).

Family B — Network / use-of-system (paying to move electrons)

These come from topology and published rates (§4), not from the energy tariff sticker.

Category Plain meaning Who usually receives (+)
wheeling Charge for using the network path to wheel energy (often municipal generation-layer wording in the engine) Municipality or Eskom, per layer
transmission High-voltage / transmission-layer use-of-system Eskom Transmission
distribution Distribution-layer use-of-system Eskom Distribution or municipality
ancillary Ancillary / system-support style network charge on the wheeled path Network operator on that layer
losses A distinct loss-related money line when the deal accounts losses as a charge (as opposed to only shrinking delivered kWh in Match) Per deal / topology treatment

Bearer. Who pays (−) is set by wheeling-cost allocation on the PPA (often the buyer). The ledger always shows both the operator’s receivable and the bearer’s payable.

Family C — Credits tied to wheeled Eskom energy (WER)
Category Plain meaning
wer_credit Wheeling Energy Refund — Eskom credits the buyer for wheeled energy that displaced grid purchases (rates by TOU). On the ledger: buyer +, Eskom − (Eskom pays the credit).

Layman picture. You wheeled green energy to the factory. Eskom’s retail bill would have been higher without it — the WER line is the refund scrap of that story, separate from paying the IPP for energy.

The same kernel prices a Virtual Wheeling portfolio. Wer.for_portfolio/1 feeds min(consumed, allocated) from persisted 15-minute VwAllocation rows, per meter per TOU, then sums integer cents. Classic per-contract wheeling still runs this reduction against 20-minute settlement intervals. The two paths never meet inside one statement — V17 is that product.

Family D — Adjustments from spill, shortfall, banking, and kin

These are the ledger faces of §7.2. Price created the energy sticker; Adjust decided the residue; the ledger books the cash.

Category Plain meaning Everyday picture
spill_credit Money (or a signed amount) for surplus energy the deal did not match — discounted credit, buyback, etc., per spill rule Extra fruit left on the counter; someone pays a credit for it
shortfall_penalty Charge when a firm / ToP / shaped promise was missed (LD, penalty — net of excuses) You promised 40 crates, delivered 35; the gap hurts in cash
banking_adjustment Bank accrued or drawn: surplus stored earlier, used now (FIFO), or expired Jar of saved kWh opened or topped up
curtailment_credit Credit when curtailment was treated as deemed / makeup money Grid said stop; deal still values ready energy
replacement_energy Cost of replacement energy bought to cover a shortfall Bought crates elsewhere to honour the promise
excess_charge Charge when take / volume exceeded a capped entitlement Over the annual MWh lid
imbalance Imbalance-style adjustment when the deal books one in wheeling settlement Position didn’t match the nomination / schedule story
trader_margin Trader’s margin line when it is itemised on the leg Spread the book keeps on that hop
Family E — Admin and certificates
Category Plain meaning
admin Platform or admin fee (R/day or similar) — including virtual vendor fees when billed here
rec Renewable energy certificate related line when the period books one
carbon Carbon-attribute related line when the period books one

8.1.4 Adjustment families — how §7 residues become ledger categories

Residue in §7 What Adjust decided Ledger category you usually see Who tends to be + / −
Spill (supply > match) Forfeit (often R 0) · buyback · third-party · spill credit · or bank spill_credit and/or banking_adjustment Credit toward the party the spill rule names; equal opposite on the other
Shortfall (firm shape missed) LD / penalty / capacity cut / replacement shortfall_penalty, replacement_energy Seller or buyer per remedy — always paired
Banking draw / accrue / expiry FIFO jar movements banking_adjustment Accrue vs draw flip the sign story; still Σ = 0
Curtailment deemed Price may create deemed energy; Adjust may add makeup energy (deemed) and/or curtailment_credit Per curtailment clause

Rule of thumb. If it is “ordinary kWh at the tariff,” look under energy / capacity. If it is “paying the wires,” look under network categories. If it is “the deal’s leftover or broken promise,” look under Family D.

From Match residue to a ledger category
Match residue
→§7.2 Adjust
Rule fires
→category
+ / − pair
→Σ
0

8.1.5 Tiny examples — one category at a time

Energy pair. Delivered energy priced at R 31,107.73:

Party Category Amount
IPP energy +R 31,107.73
Off-taker energy −R 31,107.73
Σ 0 ✓

Network pair. Wheeling R 10,000 borne by the buyer:

Party Category Amount
Eskom wheeling +R 10,000.00
Off-taker wheeling −R 10,000.00
Σ 0 ✓

WER pair. Credit R 5,000:

Party Category Amount
Off-taker wer_credit +R 5,000.00
Eskom wer_credit −R 5,000.00
Σ 0 ✓

Stack all three in one period and the grand Σ is still zero — each family balances, and so does the notebook. The big multi-party walk is §8.2.

Three balanced pairs stacked — still Σ = 0
Party Category Amount R
IPP energy +31,107.73
Off-taker energy −31,107.73
Eskom wheeling +10,000.00
Off-taker wheeling −10,000.00
Off-taker wer_credit +5,000.00
Eskom wer_credit −5,000.00

Off-taker net here: −31,107.73 − 10,000 + 5,000 = −R 36,107.73. That net is not required to be zero — only the full table is.

8.2 Worked ledger (shared-meter physical)

Adapted from physical corpus Example A (two PPAs, one generator) — the combined lines after Price + network + WER:

Combined ledger for PPA-A1 + PPA-A2 · Jun teaching month · Σ = 0. Corpus Example A.
Party Category Amount R
IPP (Karoo) energy +292,410.00
Off-taker A energy −194,940.00
Off-taker A wheeling + ancillary −35,720.00
Off-taker A wer_credit +23,180.00
Off-taker B energy −97,470.00
Off-taker B wheeling + ancillary −17,860.00
Off-taker B wer_credit +12,590.00
Eskom wheeling + ancillary +53,580.00
Eskom wer_credit −35,770.00

Per-party nets: IPP +R 292,410 · A −R 207,480 · B −R 102,740 · Eskom +R 17,810. Sum: 292,410 − 207,480 − 102,740 + 17,810 = 0 ✓.

8.3 Why sum-to-zero matters

If a re-run, a bug, or a manual adjustment ever broke the sum, the period would not be a valid settlement — two parties would disagree about cash that does not exist. The UI and the statement runner both treat the zero-sum invariant as load-bearing.

What “load-bearing” means here. In a building, a load-bearing wall is not decoration: remove it and the floor above falls. In settlement, the Σ = 0 rule is the same kind of member. The product does not treat a broken sum as a soft warning you can click past while statements still go out. The books are only trusted while that wall is standing.

Soft rule (not load-bearing) Load-bearing rule (Σ = 0)
A helpful tip on screen A condition of a valid period
You might ignore it and keep working Downstream cash views depend on it holding
Fix “when you have time” Fix before you treat the period as settled truth

So when this chapter (and the UI) say the invariant is load-bearing, they mean: statements (§9), on-screen ledgers (§12), and any re-run comparison assume every rand credited somewhere is debited somewhere else. If Σ ≠ 0, the period fails that structural check — it is not merely “a bit untidy.”

8.4 When a ledger total looks wrong

The reader’s problem. Your statement (or on-screen net) shows something like −R 36,107.73. That feels “wrong” — too large, odd cents, or not what you expected from the energy price alone. Before you escalate a bug, walk the ledger the same way you would check a split restaurant bill: name each line, find its twin, then decide whether the pocket or the table is the issue.

Investigation order — separate the lines, then prove the pairs
1 · Your net
→split
2 · Categories
→twins
3 · + / − pairs
→Σ
4 · Table = 0?

Step-by-step (teaching cast)

Use three familiar pairs from §8.1.5:

Step What you do What you should see
1. Read your pocket net Open your ledger / statement total Off-taker net −R 36,107.73 (example)
2. Split by category List only your lines — do not mix energy with UoS or WER yet Energy −31,107.73 · wheeling −10,000 · wer_credit +5,000
3. Find each twin For every line, name the other party with the equal opposite amount IPP +31,107.73 energy · Eskom +10,000 wheeling · Eskom −5,000 WER
4. Check two different zeros (a) Does each pair sum to 0? (b) Does the whole table sum to 0? Pairs ✓ · table Σ = 0 ✓
5. Decide what “wrong” meant Pocket ≠ 0 is normal; table ≠ 0 is broken Fix expectations vs escalate Σ
Step 2–3 — your three lines each have a twin on another pocket
You · energy−R 31,107.73
⇄twin
IPP · energy+R 31,107.73
You · wheeling−R 10,000
⇄twin
Eskom · wheeling+R 10,000
You · WER+R 5,000
⇄twin
Eskom · WER−R 5,000
Step 4 — same six lines as one notebook; pocket net ≠ 0, table Σ = 0
Party Category Amount R Note
IPP energy +31,107.73 twin of your energy
You (off-taker) energy −31,107.73 tariff × delivered
Eskom wheeling +10,000.00 twin of your UoS
You (off-taker) wheeling −10,000.00 network, not energy
You (off-taker) wer_credit +5,000.00 refund scrap
Eskom wer_credit −5,000.00 twin of your WER

Your pocket: −31,107.73 − 10,000 + 5,000 = −R 36,107.73 — not zero, and that is fine.

The table: every + has a − twin → Σ = 0 ✓ — load-bearing proof (§8.3).

If you observe… Likely meaning What to do
Pocket large, but every twin found and Σ = 0 Several is “energy + network − credit,” not a broken ledger Re-check tariff, UoS, WER inputs (§7 · §4)
A line with no equal opposite Broken pair / bug / incomplete period Escalate — Σ will not hold
Old DRAFT rows mixed with a re-run Comparing two notebook versions Re-read the new period as a whole (content hash); do not splice old and new lines

Careful. An IPP receivable and an off-taker payable can sit beside separate Eskom UoS entries and still be honest. Separating energy from network from credit is the move that usually dissolves the “wrong total” feeling.

8.5 The market ledger has three pots, not one

Sections §8.1–§8.4 taught the wheeling ledger: one PPA period, paired line items, one Σ = 0 across the whole notebook. If your book also trades on the South African Wholesale Electricity Market (SAWEM) — the day-ahead (and related) spot market — you will see a second kind of money notebook. It looks like “a ledger,” but it is organised as three separate pots, not one grand total. This section assumes you have never seen that market statement before.

Where the market itself is taught. Clearing, bids, schedules and the full clause-by-clause statement live in V9 · Market — especially V9 §13. This chapter only explains enough background so the three-pot idea makes sense next to wheeling’s single Σ = 0.

8.5.1 Two money worlds side by side

Wheeling settlement (this volume) Market (SAWEM) settlement
What is being settled? A signed PPA: matched / delivered energy, network UoS, WER, spill… A cleared schedule of MWh you sell or buy in the wholesale market for a trading day
Who are the counterparties? IPP, off-taker, trader, Eskom, municipality… on that contract Other market participants, the System Operator, and the Market Operator — depending on the pot
How many notebooks? One ledger for the period; Σ = 0 across all lines Three pots; only the energy pot must Σ = 0 across the market
Typical price Your negotiated c/kWh (§7.1) The hourly System Marginal Price (SMP) for energy — see below

You can have both: wheel under a PPA and trade in SAWEM. Do not add the wheeling statement total to the market statement total and expect one magic zero. They answer different questions.

Same company, two notebooks — do not merge the zeros
Wheeling (V6)
PPA periodone Σ = 0 ledger
Market (V7)
Trading daythree pots

8.5.2 Who is who in the market

Role Plain meaning Why they appear on money lines
Market participant / Trading Unit A generator, load, trader or storage unit registered to bid Sells or buys scheduled MWh; may hold reserve
Balance Responsible Party (BRP) The organisation financially responsible for a set of metering points balancing Owns the market seat that pays or is paid
Market Operator (MO) Runs the auction, publishes schedules and prices, invoices market fees Counterparty for Pot 3 (its own charges)
System Operator (SO) Keeps the grid safe; may constrain schedules and call reserve Counterparty for Pot 2 (cost of decisions that move the system)
Other participants Everyone else who cleared that hour Together they are the closed loop of Pot 1 (energy)

8.5.3 How market energy is priced — the System Marginal Price

Day-ahead market (simple picture). The day before delivery, participants submit offers (I will sell up to X MWh at Y R/MWh) and bids (I will buy…). The Market Operator clears the hour: it stacks cheap generation against demand until the last megawatt-hour needed sets the price.

That clearing price is the System Marginal Price (SMP) for the hour — in rand per megawatt-hour (R/MWh). Teaching figure from the worked delivery day: SMP = R 900.00 / MWh.

Three facts that catch everyone:

  1. Everyone who clears is paid (or charged) the SMP — not their own offer. Your offer only decides whether you are in the schedule. A coal block offered at R 350 and a gas block offered at R 880 both receive R 900 if that is where the market cleared.

  2. Energy payment uses the unconstrained schedule volume (the economic stack ignoring network limits):

    energy payment = scheduled_MWh × SMP

    If the SO later cuts you back, that is a different line (Pot 2), not a quietly smaller energy payment.

  3. Buyers pay the same SMP. A load scheduled to take 440 MWh at R 900 is charged 440 × 900 = R 396,000. That money is part of what pays the generators. That closed loop is why Pot 1 can sum to zero.

Market energy pricing — one hourly SMP for every cleared MWh
Clearhour
Offers stackedcheap → dear
last MW needed→
SMPR 900 / MWhsame for all
Payenergy
Your schedule75 MWh
× 900→
Energy lineR 67,500Pot 1

Offers vs pay (restaurant metaphor). You write on a slip “I will cook for R 350 a plate.” The kitchen clears at “tonight’s plate price R 900.” Every accepted cook is paid R 900 per plate on the menu — not R 350. Your slip only got you into the kitchen.

8.5.4 Two schedules — unconstrained vs constrained

Schedule Meaning Used for
Unconstrained What the market wanted economically (ignore wire limits) Pot 1 energy payment (volume × SMP)
Constrained What the System Operator allows after network limits What you may actually generate; differences → Pot 2

Worked SO cut (teaching). Solar unit unconstrained 75 MWh, zone cap forces constrained 60 MWh, SMP R 900, unit offered at R 0 for that block:

Line Pot Arithmetic Amount
Energy payment 1 75 × 900 +R 67,500
Constrained-sales charge (SO buys back 15 MWh at your offer) 2 15 × 0 R 0.00
Net cash that hour +R 67,500 for 60 MWh generated

You keep the full energy payment on the unconstrained volume; the SO’s “buy-back” of the 15 MWh you cannot inject is priced at your offer, not at the SMP. A zero offer means zero buy-back cost — which is why a renewable can show R 0.00 on that Pot 2 line without the ledger being broken. Full walk — V9 §13.4.

Two schedules — energy pot pays the tall bar; SO adjustment handles the cut
HourSMP R 900 · offer R 0
Unconstrained (Pot 1 priced)75 MWh
× R 900 → R 67,500
Constrained (what injects)60 MWh
60 generated 15 cut → Pot 2 @ offer
Paid in Pot 1SO cut → Pot 2

8.5.5 What “three pots” means

A pot is a separate money bucket with:

Your market statement is not one invoice total. It is three obligations stapled together. Adding them into one number mixes “pay other traders for energy,” “pay the SO for system decisions,” and “pay the MO for running the auction.”

One trading day → three pots → three counterparties
1Energyvs participants · Σ = 0
→
2Ancillaryvs System Operator
→
3MO feesvs Market Operator
Pot Everyday name Settles with Must Σ = 0 across the market?
1 · Energy market Paying for cleared energy at the SMP Other participants (closed loop) Yes
2 · Ancillary service recovery Paying for SO decisions and standing ready System Operator No — and not meant to
3 · Market Operator charges Paying to run the market Market Operator No — ring-fenced fees

8.5.6 Pot 1 — Energy market (step by step)

What it does. Moves money for scheduled energy at the SMP between buyers and sellers so that, across the whole market that hour (and day), every rand paid in is a rand paid out.

Step-by-step for one hour

  1. Clear the hour → SMP (e.g. R 900/MWh).
  2. Read each unit’s unconstrained scheduled volume.
  3. Sellers: + scheduled_MWh × SMP (receivable).
  4. Buyers: − scheduled_MWh × SMP (payable).
  5. Prove the pot: sum of all participant energy lines for that hour = R 0.00. If not, clearing/accounting is wrong — the MO board treats that residual as an integrity alarm.

Tiny closed loop (toy numbers). Two sellers scheduled 40 + 60 = 100 MWh; one buyer scheduled 100 MWh; SMP R 900:

Party Pot 1 line Amount
Seller A energy +R 36,000
Seller B energy +R 54,000
Buyer C energy −R 90,000
Σ Pot 1 R 0 ✓
Pot 1 — energy at one SMP; the pot balances across participants
Party Pot Amount R
Seller A (40 MWh) 1 · Energy +36,000
Seller B (60 MWh) 1 · Energy +54,000
Buyer C (100 MWh) 1 · Energy −90,000

Likeness to wheeling. Same idea as §8.1 energy twins — but the “other side” is the whole market of participants, not your PPA counterparty. Difference: the price is the SMP, not your PPA tariff.

8.5.7 Pot 2 — Ancillary service recovery (step by step)

What it does. Collects the cost of system decisions and readiness that are not “plain energy at the SMP.” The System Operator is the counterparty. This pot is allowed to be net non-zero for participants as a group: someone has to fund SO actions, and that someone is recovered as an ancillary service charge, not by breaking Pot 1’s zero.

What typically lands in Pot 2

Line family Plain meaning
Constrained sales / purchases SO moved you off the unconstrained schedule; settled at your offer curve, not the SMP
Reserve capacity payments Paid to stand ready (regulating up/down, instantaneous, ten-minute) whether or not called — each with its own system price
Above-cap / additional day-ahead energy When the market hits a price cap, extra payment vs your offer can come from this pot
Later cousins (same idea) Intraday and balancing money also reflect system/position decisions; V7 teaches each product — they are not folded into Pot 1’s SMP energy zero

Step-by-step when you are constrained off

  1. Keep Pot 1 energy on unconstrained volume × SMP.
  2. Measure the MWh the SO removed (or added).
  3. Price that difference on your submitted offer for those MWh.
  4. Book the result in Pot 2 against the System Operator.
  5. Do not expect Pot 2 + Pot 1 + Pot 3 to equal zero for you — and do not expect Pot 2 alone to Σ = 0 across all participants.
Pot 2 — SO decision priced at your offer, not at the SMP
Cut15 MWh
Your offerR 0 / MWh
× 15→
Pot 2 lineR 0.00vs System Operator

Why “net-positive market” is not a broken ledger. Participants as a whole can show money flowing to or from the SO in Pot 2 while Pot 1 still proves R 0.00. That is intentional: Pot 2 is the cost of decisions, Pot 1 is the cost of cleared energy.

8.5.8 Pot 3 — Market Operator charges (step by step)

What it does. Pays the Market Operator for running the market — fixed and variable fees. Ring-fenced: this money is not used to patch an energy shortfall or a bad debt in Pot 1.

Step-by-step

  1. MO applies the published fee schedule to your activity / registration.
  2. Lines appear as amounts you owe the MO (or rare credits per rules).
  3. Counterparty is always the Market Operator, not other traders and not the SO.
  4. Pot 3 does not have to Σ = 0 across participants — it is a fee bucket, like paying the auction house.
Pot 3 — fees to the house that runs the auction
You (BRP)participant
→MO charges
Market OperatorPot 3 counterparty

8.5.9 Reading a market day end-to-end

Step Ask Pot
1 What was the hourly SMP? Background for Pot 1
2 What was my unconstrained schedule × SMP? Pot 1 energy
3 Did the SO constrain me? At what offer? Pot 2 constrained line
4 Was I paid for reserve / above-cap / other SO products? Pot 2
5 What MO fees apply? Pot 3
6 Does Pot 1 across the market still show R 0.00? Integrity check
7 Separately: does my wheeling PPA ledger still Σ = 0? §8.1–§8.3 — different notebook
Do not mix pots — and do not mix market pots with the wheeling ledger
SMP
→Pot 1
Energy Σ = 0
→Pot 2
SO / reserve
→Pot 3
MO fees
Myth Reality
“My market statement should Σ = 0 like wheeling” Only Pot 1 across all participants must; your personal total across three pots need not
“I was paid SMP on what I generated” You were paid SMP on unconstrained scheduled MWh; generation vs schedule is a later metering / balancing story
“Constrained cut reduced my energy line” Energy line stays; SO adjustment is Pot 2 at your offer
“MO fees are part of energy” Pot 3 — separate counterparty

Where this is taught in full. Day-ahead lines and clauses — V9 §13. Worked delivery day numbers — V9 §12. Intraday and balancing — V9 §5 · V9 §6. Financial calendar — V9 §15.

8.6 SAWEM allocation is additional, and losses move

If you wheel under PPAs and trade on SAWEM, two further ideas sit beside the money notebooks in §8.1–§8.5: a second conservation rule (at the meter, not at the PPA), and a different home for network losses. Neither merges your wheeling and market books into one.

8.6.1 Two ledgers or one? — you run two notebooks

Short answer. Trading on SAWEM does not replace the wheeling ledger, and it does not create one combined Σ = 0 notebook. You keep two separate money worlds (and a third kind of check on meters):

Notebook / check What it is Must sum to zero?
Wheeling PPA ledger Line items for each settled contract period (§8) Yes — Σ = 0 across all parties on that period
Market statement (three pots) Day-ahead (and related) SAWEM money (§8.5) Only Pot 1 across all participants; Pots 2–3 are different counterparties
SAWEM meter allocation Every metering point paired export/import each hour (this section) Yes — at each point, the two BRP legs cancel; this is energy, not rand

There is no platform “grand ledger” that adds PPA energy lines + SMP energy + MO fees + UoS into one zero. Doing that would mix different counterparties and different questions.

Same organisation — two money notebooks plus a meter pairing check
Notebook A · Wheeling
PPA ledgerΣ rand = 0
Notebook B · Market
Three potsPot 1 Σ = 0
Check C · Meters
Point pairingexport = import
Myth Reality
“Once we trade SAWEM, wheeling ledgers go away” PPAs still settle with their own Σ = 0 ledgers
“The system combines everything into one invoice zero” Statements may sit in one UI; the proofs stay separate
“If Pot 1 is R 0, my PPA ledger must be fine” Unrelated — different counterparties and quantities

8.6.2 What “the chain” means

In this product, chain usually means the commercial wheeling path of linked PPAs — energy bought on one leg and sold on another — not a single SAWEM bid.

Everyday picture. A trader is a warehouse in the middle:

  1. Buy leg — trader buys from an IPP (PPA 1).
  2. Sell leg — trader sells to an off-taker (PPA 2).
  3. The chain — those two legs read together: did the warehouse ship no more than it stocked (after allowed losses, spill, bank)?

That commercial story is reconciled in §10. Each leg still has its own wheeling ledger with Σ = 0. Chain reconciliation asks a volume and margin question across legs; it does not merge the two ledgers into one rand notebook.

A simple commercial chain — two PPA ledgers, one volume story
IPP
→buy PPA
Trader
→sell PPA
Off-taker

SAWEM uses the word “chain” in a related but different way when it walks meters along that path (generator point → trader as counterparty → off-taker point). The second conservation rule below is about those metering points, not about merging PPA cash lines.

8.6.3 The first conservation rule (reminder)

Wheeling ledger conservation (rand): for one settled PPA period,

Σ all signed line items = R 0

Every energy, UoS, WER or adjustment rand credited to someone is debited to someone else (§8.1–§8.3). That proves the contract notebook.

8.6.4 The second conservation rule — every meter has two owners

Market meter allocation conservation (energy): for every metering point, in every hour,

whatever flows through the point is sold by one Balance Responsible Party and bought by another — the export leg and the import leg are equal and opposite.

Plain meaning: a megawatt-hour with only one name on it cannot be invoiced. The market therefore allocates each metered hour as two legs: one at the point’s Trading Unit, and one, sign reversed, at the registered counterparty’s unit.

Step-by-step on a teaching wheeling path (V9 §14.1):

Step Metering point What the meter saw How SAWEM allocates (two legs)
1 Generator injection +42 MWh into the grid Generator BRP +42 · trader BRP −42 (trader is the buyer at that point)
2 Off-taker withdrawal −38 MWh from the grid Off-taker BRP −38 · trader BRP +38 (trader is the seller at that point)
3 Trader’s net Actual Energy −4 MWh (= −42 + 38)

Point-level checks:

Across the path, the trader’s −4 MWh is simply where the difference between injection and withdrawal lands — losses and forecast mismatch have nowhere else to go when the trader is counterparty at both ends.

Second conservation rule — each point paired; trader holds the path difference
HourGenerator injects 42 · off-taker takes 38
Gen point pair0 net at point
Gen +42 Trader −42
Load point pair0 net at point
Off-taker −38 Trader +38
Trader net Actual Energy−4 MWh
path difference (losses / mismatch)
Gen / trader+ at loadTrader − at genOff-taker

Why both rules exist. They answer different questions:

First rule (wheeling ledger) Second rule (SAWEM allocation)
Level One contract period One metering point, every hour
Unit Rand (signed line items) Megawatt-hours (paired legs)
Proves Cash was not invented on the PPA Every MWh has a buyer and a seller at the point
Can pass alone? Yes — a PPA can Σ = 0 while a point is unpaired (settlement stalls on the market side) Yes — points can pair while a commercial chain still has a volume leak (§10)

So: a chain can conserve commercially while a point is unpaired, and a point can pair while a chain leaks. Both checks run; neither replaces the other.

Careful. If your counterparty has not registered as a BRP at the point, your market settlement can stall too — the rule is about the point, not only about you (V9 §14.1).

8.6.5 Network losses — wheeling uplift vs market purchase

In wheeling settlement (this volume). Losses usually appear as a loss factor on the physical path: matched energy is scaled to delivered energy before Price (§4). Example: match 100 kWh, loss factor 6% → delivered 100 × 0.94 = 94 kWh. The “missing” 6 kWh is accounted inside the PPA Match, then priced only on what was delivered. UoS charges are separate ledger categories.

In SAWEM metering. Actual Energy is not grossed up for losses. The meter says what it says. Network losses are treated as the Network Operator’s own market purchase: the NO buys that energy in the market like any other participant, and it shows on the NO’s Trading Unit position, not as an uplift on your figure.

Wheeling (PPA) SAWEM (Actual Energy)
How losses show Loss factor shrinks (or shapes) delivered vs matched Metered net as measured; losses sit on the Network Operator
Your quantity Delivered kWh after factor Hourly Actual Energy at your points / units — no loss uplift
If you “add” losses onto Actual Energy N/A Double count — once on the NO’s purchase and again on you
Same physics, two bookings — do not apply the wheeling uplift to SAWEM Actual Energy
PPAwheeling
Matched100 kWh
× 0.94→6 kWh loss factor
Delivered94 kWh priced
SAWEMmeter
Your Actual Energyas meteredno uplift
losses →→
Network Operatorbuys in marketNO’s position

Back to the 42 / 38 path: the trader’s −4 MWh can include wire losses and shape mismatch. In the market that difference is a position (later balanced / priced under market rules). It is not fixed by secretly inflating someone’s Actual Energy with a wheeling-style DLF.

8.6.6 How the pieces fit when you do both

Step Notebook or check Question it answers
1 Wheeling PPA ledger(s) Did each contract’s rand lines Σ = 0?
2 Commercial chain (§10) Did buy-leg volume support sell-leg delivery (losses/spill/bank explained)?
3 Market three pots (§8.5) What do I owe/receive for schedules, SO decisions, MO fees?
4 SAWEM point pairing (this section) Does every meter hour have two BRP owners?
5 Actual Energy vs schedule (V9 §6) What is my imbalance after the meter is known?
Do both wheeling and SAWEM — still four separate questions, not one merged zero
PPA Σ = 0
→chain
Volume bridge
→market
Three pots
→meters
Point pairs

Where this is taught. Meter pairing, Actual Energy, vintages and exceptions — V9 §14. Commercial chain volume and trader margin — §10. Wheeling loss factors — §4.

8.7 The market-indexed virtual branch

The virtual ledger still has one shape: net = strike − credit, then two signed :energy lines (seller +, buyer −). For floating_leg: ESKOM_CREDIT_RATE that credit is the WER rate, and the WER pair still fires (buyer +, Eskom −). For SAWEM_SMP and SAWEM_TOU_AVG the credit is the published index (§7.4), and the WER pair does not fire.

The Wheeled Energy Refund is definitionally an Eskom-tariff mechanism. A market-indexed leg has no Eskom counterparty to pay it, so those two lines stay off rather than posting against the wrong rate. The double-entry invariant is unchanged: the energy pair already sums to zero, so dropping WER does not unbalance the period.

source_term on the energy lines names the rate that priced them (sawem_smp / sawem_tou_avg) the same way "strike_price" already does on the Eskom-credit path. The period stores an index_snapshot of the resolution the ledger used. Statements and the settlement page read that snapshot — they do not call the price reader a second time.

Existing ACTIVE virtual PPAs default to ESKOM_CREDIT_RATE and settle to the same amount_cents they did before this branch existed.

9. Statements

You need a document you can send, but you must not create a second truth. A statement is a party-filtered, versioned view of one settlement period’s ledger — not a new calculation and not a private spreadsheet. The IPP, off-taker, trader and network party can see different permitted lines while the underlying double-entry record remains shared.

In the product, statements live on one tab of the contract page, with the document itself in a drawer over it:

Surface LiveView / route Job
Statements register ContractStatementsLive · /org/deals/contracts/:ppa_id/statements Every settled window, by month: whether a numbered statement has been issued for your seat, and the total due incl. VAT
Statement drawer same page · ?statement=<period_id> Read one window’s statement as the PDF carries it, with its state, one-sentence reading, how to read it, and the audit facts
PDF modal StatementPdfModalComponent over the drawer · GET …/statement.pdf Preview the PDF in-browser, then print or download

The old standalone page (…/settlements/:period_id/statement) is kept as an address only and redirects into the drawer.

None of these invents a second set of books. They all read the live party filter for the selected period (SettlementExplorer.party_statement/2 → Statement.for_party/3 → StatementRenderer), and where the monthly run has issued a statement they say so — number, version, issue time, stored PDF. A month’s total on the register is only the sum of its statements for orientation — not a consolidated multi-run invoice.

9.1 How you get there

What you need Where in the product
The statements of a contract Deals → Contracts → open the agreement → Statements tab
One window’s statement Open on its row; or View statement on the settlement page; or a Billing hub document’s link to its settlement. All three open the drawer
Retrieve / share a file In the drawer → Download PDF → modal preview → Download PDF or Print
Which calculation version The drawer’s state line and Audit facts to share — agreement, window, status, calculated at, statement number and version, content hash
Month-on-month money (not a statement) Ledger (§12.4)
The tax invoice and payments Billing for {month} › on the month header and in the drawer — the Billing hub, issued or received according to your seat

Follow along. Seat: IPP2 Atlantis Wind (IPP app). Path: Deals → Contracts → PPPA-202607-138209764 → Statements → open July 2026 → Open on the 9 Jul window. The drawer should read OffTaker C owes IPP 2 …, show the paper, and offer Download PDF.

9.2 The register — every window’s statement

Screen: ContractStatementsLive at /org/deals/contracts/:ppa_id/statements, the Statements tab of the contract page (§12.2).

It opens with What a statement is (#statements-explainer): one paragraph — a window’s ledger filtered to your seat, versioned and hashed, with VAT and the total due added; you do not pay a statement — and a strip placing the tab between Settlements, Ledger and Billing.

The register (#statements-register) groups windows by calendar month, newest first, the newest month with money open (#statements-month-{YYYY-MM}):

Month header says Meaning
4 windows · 2 statements with money, 1 issued · 2 placeholders What the month holds
across the two: R 27 502.94 due to you incl. VAT · a sum for orientation, not one invoice The month’s statements added up, and why that is not a bill
Billing for September › The Billing hub for that month — issued documents for a seller seat, received for a buyer seat

Each window is a row (#statement-run-{period_id}, with a data-kind):

Column Meaning
Window settled The day (or week or month) the statement covers, its length, and the kWh delivered
Run The settlement’s status and what it means — a DRAFT statement is not for sending
Statement Issued with its number, version, issue time, PDF stored and the run’s hash; or Live view · not yet issued; or Nothing to send when the run wrote no money to your seat
Total due Net plus VAT, with to you or from you, and the net and VAT beneath
Open (#open-statement-{period_id}) Opens the drawer

Empty state: No statements yet.

Not a party: when your organisation sits on neither seat, the register gives way to a notice (#statements-not-party) naming the two seats — statements are addressed to them, not to you — and ?statement= is refused with Only a party to this agreement can open its statements.

9.3 The drawer — one statement, read

#contract-statement, over the register, at ?statement=<period_id>. Close with ×, the backdrop or Escape; the register is where you were.

Block What is on screen What you use it for
Header Statement · Generator (IPP) · 3rd of 5 with money · the window · For {you} as {seat}, with {counterparty}. The run is DRAFT — may still change. · status chip Establish seat, window and how hard the numbers are
State (#statement-state) Issued · number · version · issue time · run hash · PDF stored at issue — a download is that file, not a re-render; or Live view · not yet issued Know which document you are looking at, and what a download gives you
Actions Download PDF (#statement-download-pdf) · Why these numbers? Open the settlement › (#statement-open-period) · Billing for {month} › The file, the explanation, the invoice
The statement in one sentence (#statement-summary) For the window settled on Tue 8 Sep 2026, OffTaker C owes IPP 1 R 13 751.47: R 11 957.80 for 8 335 kWh delivered and 5 733 kWh deemed under the curtailment clause, plus VAT of R 1 793.67. Then net, VAT and total due (#statement-net) Read the document before the paper
The paper (#statement-document) The printable statement, exactly as the PDF carries it The document you send
Saving vs grid (#statement-saving) Buyer seats, when derived The counterfactual, not part of the total due
How to read this statement (#statement-how-to-read) One line per section present — which settlement stage wrote it, that counterparty volumes never carry a tariff, that total due is the one VAT-inclusive figure — and the counterparty’s mirror Understand the sections, and how they tie to the settlement
Audit facts to share (#statement-audit) Agreement, window, status, calculated at, statement number and version, content hash Cite the exact version when you send or dispute
Soft warning (#statement-soft-warning) DRAFT or PRELIMINARY only: that a re-run may replace it and a new version would be issued; offer it for review before sending Do not send a draft as the bill
Footer ← earlier · later → through the register’s statements with money Read several without going back

Party labels are role-aware: Generator (IPP), Off-taker, Trader (sell), Trader (buy). A virtual contract carries the Virtual pill; its paper is the same layout.

9.4 Structured view

The main body (#statement-structured) is an interactive breakdown of the same numbers that feed the PDF.

Block Contents Notes
Line items Categories grouped in explorer order (energy → capacity → adjustments → network, then other). Each category has a header with section total and rows: description, TOU / source_term, quantity (kWh), rate (c/kWh), signed amount. A Non-bypassable label marks lines whose NetworkRate row is mandatory regardless of contract (electrification subsidy, NERSA regulatory levy, and other flagged network charges — §4.2.1). Empty copy: “No line items on this settlement for your organisation.”
Counterparty volumes View label · Peak · Std · Off-peak · Total kWh Shown when the assembler produced a counterparty summary — volumes only, never their confidential price
Saving vs grid Highlighted saving amount (when derived for the buyer seat) Optional; omitted when the period has no saving block

Signs are already framed for your org (+ receivable / − payable), matching the period detail ledger and the running ledger.

9.5 Printable layout (PDF)

There is no separate on-page “printable layout” toggle. To print or archive the party-filtered statement, use Download as PDF (§9.6) — preview in the modal, then Print or Download PDF. The downloaded file is the stored artifact written at issue (WB.Billing.Artifact); its sha256 is on the audit strip and is the quote you send with a query. The HTML on the page is the same figures, mounted under #statement-document. See V13 §5.

9.6 Download as PDF modal

Click Download PDF in the drawer’s header. A full-viewport modal (StatementPdfModalComponent, #statement-pdf-modal) opens over it:

Control Behaviour
Title “Settlement statement” · agreement ref · period label
Viewer iframe streaming GET /org/deals/contracts/:ppa_id/settlements/:period_id/statement.pdf with Content-Disposition: inline
Print Opens the browser print dialog for the PDF in the viewer
Download PDF Same path with ?download=1 → attachment download
Close / backdrop / × Dismisses the modal (returns to the drawer)

The PDF is the stored artifact of those same assembled party figures (header, line categories, counterparty volumes, saving, totals). A second download serves the same bytes; it does not re-render. Capture the audit strip — including the artifact hash — before you send so both sides can name the calculation version. See V13 §5.

9.7 What each party can see

Seat Typically sees
Generator / seller Energy receivable, spill disposition and counterparty volumes; never the buyer’s retail tariff.
Off-taker / buyer PPA energy payable, UoS it bears, WER credit and a derived saving-vs-grid block.
Trader Buy-leg and sell-leg lines, network costs it bears and the resulting margin.
Eskom / municipality Network and WER/UoS lines that affect its account.

Statement IPP2 view

Period 1 Energy 2 Net 3
9 Jul 2026 36,597 kWh R 31,107.73
  1. 1Period identifies the versioned settlement window.
  2. 2Energy is the delivered volume, not the buyer’s tariff.
  3. 3Net is the signed sum of lines visible to this party.

On the screen, IPP2 and OffTaker C each open the same period statement path under their own org seat; SettlementExplorer.party_statement/2 frames the document for the viewer. There is no second “buyer statement” route — the filter is the seat.

9.8 Worked statement: one ledger, two views

Data. full_demo · seed 42 · stage S09 (settlement matrix) · physical PPPA-202607-138209764 · period 2026-07-09 · DRAFT.

For the thread deal, 38,933.333 kWh is matched and approximately 36,597 kWh is delivered after 6% loss. The seller-energy line is R 31,107.73.

Underlying ledger fact IPP2 Atlantis Wind sees OffTaker C Midrand DC sees
Delivered energy 36,597 kWh counterparty volume 36,597 kWh purchased
Seller energy +R 31,107.73 receivable −R 31,107.73 payable
Buyer retail tariff not shown not treated as seller revenue
Counter-entry exists in ledger exists in ledger

The energy pair proves the shared record: +R 31,107.73 + (−R 31,107.73) = R 0.00 ✓. More network and adjustment lines may appear, but every line keeps that signed counterparty proof (§8). The role filter changes what you can inspect; it cannot change the period’s arithmetic.

Walk it on the UI: open the July 2026 month hub → View statement on 9 Jul → confirm Net ≈ R 31,107.73 on the IPP2 seat → open Download as PDF to preview the same net (Print or download from the modal) → record the five audit facts before sharing.

9.9 Versions, hashes and on-demand generation

Each statement shows calculated_at and a content hash on its audit strip (when the pipeline has written one). Together they answer “which calculation did we send?” If a DRAFT or PRELIMINARY period is re-run, its prior lines remain auditable under REVERSED and the new period receives its own hash and version. FINAL and DISPUTED periods are never silently replaced (§11).

StatementRunner can persist issued SettlementStatement snapshots on demand in the backend; the org UI always shows the live party filter for the selected run (HTML, structured sections, and PDF alike). V6 still opens one agreement at a time, with one statement per run on that agreement. The consolidated artifact that spans agreements now exists on the billing side: the site view and Master Statement in V13 §11 and §12. Those pages consolidate documents, not settlement runs. A buyer remains restricted to its own agreement on this statement; the Billing Hub is where the month comes together.

9.10 Sending a statement safely

  1. Open the window’s statement (Open on its register row, or View statement on the settlement page). Read the state line: an Issued number and version, or Live view.
  2. Capture the audit facts in the drawer (agreement, window, status, calculated at, statement number and version, content hash).
  3. Use Download PDF → preview in the modal → Print or Download PDF from the modal to share the file; when a statement has been issued the file is the stored artifact and its hash is quotable (V13 §5).
  4. Do not alter exported amounts by hand.

For DRAFT or PRELIMINARY, let status frame the discussion. For FINAL or DISPUTED, use the explicit correction process instead (§11).

Where this is taught. Period detail and charts — §12; month-on-month money — §12.6; contracts register — V7 §6; ledger theory — §8.

9.11 Index label and realised average

A market-indexed virtual statement (SAWEM_SMP or SAWEM_TOU_AVG) adds two rows at the top of the energy block:

Row What it shows
Floating index Plain-language name of the board the CfD used (“SAWEM TOU-average SMP”, “SAWEM system marginal price”)
Realised average The period’s volume-weighted index in c/kWh — the same figure the ledger netted against the strike

If a Trading Day had no published price, a Price note says hours were carried forward rather than invented. An ESKOM_CREDIT_RATE statement does not grow these rows: the HTML is the same printable layout it was before the floating-leg choice existed.

The figures come from the period’s stored index_snapshot, not from a fresh walk of intervals when you open the statement. The settlement detail page (ContractSettlementLive) shows the same snapshot as Strike vs realised index (per TOU) when — and only when — that snapshot is present.

Metered energy quality

The quality section reports estimated or substituted energy on each side, its input vintage, and the feed references. For 1,241.6 kWh out of 41,600.0 kWh it displays 2.98 %. Rounding is for display; stored totals use Decimal. A zero share is still shown. PROVISIONAL is advisory and does not prevent bilateral finalisation.

10. Chain reconciliation & trader P&L

A trader can have two individually valid PPA settlements and still have a commercial problem: it bought more energy than it sold, or its margin is not the one the terms promised. Chain reconciliation joins the legs after they settle. It does not replace either settlement; it tests whether the chain tells a coherent volume and cash story.

10.1 What “balanced” means

A chain is commercially balanced when its first-leg supply is at least its last-leg delivered quantity, allowing only the banking, spill and loss rules agreed for that chain. Each individual settlement ledger must also prove Σ = R 0.00. Those are separate checks: a zero-sum buy-leg can still have a volume break against its sell-leg.

Reconciliation field What you test
First-leg supply / matched Can the source leg support the downstream delivery?
Last-leg delivered What the final off-taker received after permitted losses.
Banked, spilled, short Why the two quantities differ.
Buy cost What the trader paid on its source PPA.
Sell revenue What the trader collected on its destination PPA.
Network cost borne UoS, WER or other lines assigned to the trader.
Trader margin sell revenue − buy cost − trader-borne costs.

10.2 Worked chain slice

Data. full_demo · seed 42 · stage S09 (settlement matrix) · illustrative chain slice: IPP2 Atlantis Wind → trader → OffTaker C Midrand DC.

Input Value
First-leg matched supply 40,000 kWh
Last-leg delivered 36,800 kWh
Permitted loss 6% = 2,400 kWh
Contractual spill 800 kWh
Trader buy cost R 28,000.00
Trader sell revenue R 35,328.00
Trader-borne network cost R 1,200.00

The physical volume bridge is 40,000 − 2,400 − 800 = 36,800 kWh ✓. First-leg supply is therefore at least final delivery: 40,000 ≥ 36,800. The 3,200 kWh difference is explained, not ignored: 2,400 kWh is permitted loss and 800 kWh is contracted spill.

The trader margin is R 35,328.00 − R 28,000.00 − R 1,200.00 = R 6,128.00. The reconciliation records buy cost, sell revenue, network-cost bearer, volume difference and expected margin type from the proposal. It also confirms each leg’s ledger separately sums to zero; the trader’s R 6,128.00 is a commercial roll-up, not a new ledger imbalance.

10.3 Lifecycle and investigation order

ChainReconciliationRunner runs monthly on the first at 04:00, after monthly settlement. It reads settled periods and logs unbalanced chains; it never edits a PPA period and does not yet persist an inspection row (Phase 1). Levy conservation is a sibling check, not a replacement: LevyConservation proves only that every in-force non-bypassable levy produced a line (§4.2.1). A miss is refuse-grade in billing preflight, and the 04:10 worker raises, because an omitted mandatory levy is a completeness defect rather than a commercial curiosity to investigate later. The Chains screen (§10.6) recomputes the same chain-reconciliation result on demand. Start with the status of the affected legs. A PRELIMINARY period can legitimately change when meter data arrives; a FINAL or DISPUTED break needs the explicit correction path (§11).

Investigate volume before money: source resolution (§3), shared-meter or hierarchy carve (§5–§6), Match and loss factor (§4), then the pricing and network lines (§7–§8). This ordering turns a red reconciliation flag into a traceable underlying question — the Chains screen lays panels in that order and shows a compact checklist when a chain is unbalanced.

Follow along. Seat: trader_1@webill.net (Trader 1 pool). Path: Org → Trader pools → strategy → Chains (or Book → Chains →). Pick month July 2026. Open the IPP → you → off-taker chain (and the flex TT path when present). You should see the verdict strip, the rail, the volume bridge (supply → loss → spill → banked → expected → delivered → Unexplained), buy cost / sell revenue / network borne / Your margin, per-leg Σ=0 ticks, and the book-check strip.

10.4 Not Market Operations reconciliation

BRP ↔︎ Market Operator settlement-file matching, imbalance files and dispute kanban are Market Operations work. This chapter reconciles the private PPA commercial chain. The same trader can do both in the same month, but a balanced PPA chain does not prove that the MO file is accepted.

Where this is taught. Market-operator reconciliation is taught in V9 · Market Operations. Trader terms such as margin type, back-to-back treatment and source guarantees are taught in V7 §4.7.

10.5 Reading a break

A volume break states the unmatched quantity and its permitted explanation; it is not automatically a financial loss. For example, 800 kWh of contractual spill can make downstream delivery lower while the cash result remains exactly as the terms specify. A cash break states which expected field is missing or differs: buy cost, sell revenue, network-cost bearer or adjustment category.

Record the status and content hash for every leg when you investigate. If the source leg is PRELIMINARY and the destination leg is FINAL, do not quietly compare a future re-run against an immutable close. Resolve the lifecycle mismatch first, then rerun the reconciliation after the allowed settlement action has completed. The Chains screen surfaces that stop-sign as a Lifecycle mismatch banner whenever legs straddle FINAL and a softer status.

10.6 The chains screen

Screen: TraderChainsLive at /org/trader-pools/:trader_pool_id/strategy/chains?month=YYYY-MM&chain=<head_or_leg_period_id>. Sibling of the settled Book tab — Book answers does my warehouse balance; Chains answers does each end-to-end path tell a coherent story.

Block What is on screen What you use it for
Verdict strip Chain count · balanced · unbalanced · “recomputed {timestamp}” Month health; results are on-demand (not a stored audit row yet)
Unbalanced only Toggle Standing investigative query
Chain list Path label · leg count · balanced / BREAK badge Pick a linear chain (?chain= is the head-leg period id, or any leg on that chain)
Lifecycle mismatch Amber banner when statuses cross the FINAL boundary §10.5 stop-sign before you trust the bridge
Investigation checklist Volume-before-money steps (shown on break) Embodies §10.3 order
The rail Party → kWh → party nodes with status chip and Σ=0 tick See the path and which leg’s ledger is broken
Volume bridge Supply − loss − spill − banked = expected; last-leg delivered; Unexplained Study why supply and delivery differ; residual is never silently absorbed (g-unexplained-kwh)
Money Buy cost · sell revenue · network borne (per visible leg) · Your margin; chain margin when seats differ sell − buy − network borne = margin — your seats only unless labelled otherwise
Legs Agreement, status, supply, delivered, Σ ledger, Period / Ledger links Drill into existing rooms; non-party legs are silhouettes (kWh only)
Book check received ≥ supplied + fan-out notice · Book → Cross-check the aggregate warehouse; linear discovery can miss fan-out sells

Read rules the screen enforces: volume before money (panel order); do not compare across a lifecycle mismatch until status is resolved. Network charges are listed per leg as evidence — the engine does not render a “no double-counting ✓” verdict.

Chains Trader 1 · July

Verdict 1 Bridge 2 Legs 3
3 chains · 1 UNBALANCED Unexplained 0 ✓ Σ=0 · Period ↗
  1. 1Verdict is month health as recomputed now.
  2. 2Bridge turns balanced: false into a named residual.
  3. 3Legs name which period’s ledger or drill room to open.

Where this is taught. Trader Strategy tab field-by-field — V3 §5B; Book warehouse rule — V3 §5A; period detail — §12; statuses — §11. Pool-statement shadowing reuses this vocabulary and adds an :FX hint — V18 §5.

11. Statuses and re-settlement

Every settlement period carries a status. The chip on the settlements list and on the period detail header is not decoration — it tells you whether you may treat the numbers as final, whether a nightly re-run may quietly replace them, and whether somebody has formally challenged the result.

Think of a settlement period as a version of the bill for one contract window (often a day or a month). Status is the stamp on that version: working draft, ready for review, locked for commercial close, under challenge, or superseded and kept for the archive.

SettlementStatus — enum-exact values from WB.Wheeling.Settlement.Enums.SettlementStatus.
DRAFT →offer for review PRELIMINARY →lock / commercial close FINAL
Also DISPUTED REVERSED

DRAFT / PRELIMINARY priors are auto-reversed on re-run. FINAL / DISPUTED require an explicit action — never silent clobber. A REVERSED period never becomes FINAL; a new period can.

Honesty — what ships today vs what the stamp means. Every engine run creates the period as DRAFT (Pipeline.create_period!). Soft “this used a placeholder” is also stored as the boolean provisional when meters/nominations were incomplete. The re-run lock is already real: DRAFT and PRELIMINARY can be auto-reversed; FINAL and DISPUTED cannot. The monthly billing run now advances stamps as well as a person: DRAFT → PRELIMINARY on statement cadence, and PRELIMINARY → FINAL after five business days (or the moment you click Finalise) unless a dispute is open — V13 §6. A party closer can still advance the stamp on the period detail header with the eye Preliminary and lock Finalise controls (§11.2), and Raise dispute beside them stamps DISPUTED (§11.5). Every run now also records a content hash — the anchor both sides cite when they disagree about a calculation. Market Operator file disputes are a different room (V9 §8).

11.1 What each status means (plain words)

Status Plain meaning May a routine re-run replace it?
DRAFT Working version. Numbers exist, but nobody has offered them as “the bill to review”. Yes — prior becomes REVERSED, new DRAFT is written
PRELIMINARY Calculated and shared for review, still allowed to change (typical while meters trickle in) Yes — same auto-reverse path
FINAL Locked. This is the authoritative close for commercial talk No — a routine re-run skips it and logs why
DISPUTED A party has formally challenged this version; correction is pending No — same hard stop as FINAL
REVERSED This version was superseded. Kept for audit; not the live bill N/A — already retired

11.2 How and when DRAFT → PRELIMINARY → FINAL

The happy path (designed commercial story)

Imagine July’s PPA is a pizza order that keeps getting revised until everyone agrees the bill is right.

  1. Nightly (or weekly / monthly) workers run settlement for the contract’s frequency. The pipeline Resolve → Match → Price → Ledger → Persist writes a new SettlementPeriod. It is born DRAFT — like a kitchen ticket that has been printed but not yet put on the counter for the customer.
  2. DRAFT → PRELIMINARY when a party closer offers the numbers for review (eye Preliminary on the period header): “here is our working bill for this window.” You still expect late meters, small corrections, or a second look. PRELIMINARY is the stamp that says shareable, revisable.
  3. PRELIMINARY → FINAL when the commercial close happens: meters are complete enough, network rates used are the ones you intend, both seats have had a chance to review, and an authorised closer locks the period with lock Finalise on the same header. FINAL means: do not quietly rewrite this overnight.

Typical when for each step (business sense, not a hard clock):

Transition Usual trigger Who
(none) → DRAFT Settlement worker or manual re-run finishes Persist System
DRAFT → PRELIMINARY Period is good enough to share / review; often after first complete-ish calculation Authorised closer on the period detail (Preliminary eye control)
PRELIMINARY → FINAL Close of the correction window; statement about to be treated as issued truth Authorised closer on the period detail (Finalise lock control)
Any soft status → REVERSED A newer eligible re-run for the same contract + period start System (automatic)
FINAL or DISPUTED → REVERSED Only via an explicit correction / re-settlement action — never cron Back-office explicit path

Who is the authorised closer, and where on the UI?

Authorised closer means: a signed-in user of an organisation that is a party to this PPA (the seller seat — IPP or trader — or the buyer seat — off-taker or trader), working in the Org app on that contract. It is not the Market Operator, not the System Operator, and not a user whose organisation is foreign to the deal.

In plain words: someone on either side of this contract may lock the bill once both sides have had a chance to look. There is no dual-signature gate in v1 — one closer Finalises; if the other side disagrees afterward, they raise DISPUTED (§11.5), they do not silently re-run. The UI shows the controls only when your signed-in organisation is a party to this PPA and the current status admits the next step.

Where it happens on the UI:

Step Screen Control
Open the period Org → Contracts → choose the agreement → Settlements (month hub) → open the run Row / period link
See the stamp Period detail header — agreement ref beside the status chip (ContractSettlementLive at …/contracts/<ppa_id>/settlements/<period_id>) Chip is always visible
DRAFT → PRELIMINARY Same header, next to the chip Eye icon Preliminary (#settlement-mark-preliminary). Tooltip: Mark preliminary — offer this run for review (still revisable). Amber button; label Preliminary on wider screens.
PRELIMINARY → FINAL Same header, next to the chip Lock icon Finalise (#settlement-finalize). Tooltip: Finalise — lock this run; routine re-runs will not overwrite it. Green button; label Finalise on wider screens.

Only one of those buttons shows at a time (DRAFT → eye; PRELIMINARY → lock). Neither appears when the period is already FINAL, DISPUTED, or REVERSED, or when you are not a party to the agreement.

The month hub, statement page, ledger, and Chains tab show the chip; they are not where you lock. Finalising is a period action so the content_hash you are locking is the one on that header.

Follow along. Seat: either party on the PPA (e.g. IPP2). Path: Contracts → agreement → Settlements → open a DRAFT period. Beside the status chip click the eye Preliminary control (tooltip: Mark preliminary — offer this run for review (still revisable)). The chip becomes PRELIMINARY and the lock Finalise control appears — click it (tooltip: Finalise — lock this run; routine re-runs will not overwrite it) to lock. Engine runs still create periods as DRAFT; these buttons are how a party closer advances the stamp.

Soft signal you already see: provisional

When Resolve had to use a nomination (or similar) because a meter was late, the period can be flagged provisional: true. That is not the same field as status PRELIMINARY, but it is the same idea in plain words: “treat carefully; expect a re-run when real data lands.” The status chip may still say DRAFT today; the provisional flag is the engine’s honesty marker for incomplete inputs (§3).

What FINAL does not mean

FINAL does not mean “the universe can never correct a mistake.” It means the automatic path will not overwrite it. Corrections after FINAL go through dispute or explicit re-settlement (§11.5, §11.6).

11.3 Where you see status (and who is looking)

Place What you see Seat
Contracts → Settlements (month hub) Status chip per run; month “light” (green when no DRAFT rows, etc.) Either party to the PPA
Period detail header Same chip + Preliminary / Finalise icon controls (when your seat may advance) + audit strip (calculated_at, content hash when present) Either party
Statement (§9) Status so the reader knows how hard the numbers are Filtered to your seat
Chains (§10) Per-leg status; Lifecycle mismatch if one leg is FINAL and another is still soft Trader pool

There is no separate “status admin” console for bilateral PPA settlement today. Changing status happens on the period detail header (and is guarded in the pipeline). Market disputes live under Strategy → Reconciliation / MO console — different paperwork (§11.5).

11.4 Idempotent re-runs (how DRAFT/PRELIMINARY get replaced)

When the settlement workers (or an operator) settle the same contract × same period start again:

  1. prepare_period! finds any non-REVERSED period for that key.
  2. supersede! on DRAFT / PRELIMINARY flips them to REVERSED (child rows — line items, adjustments, intervals — are kept).
  3. A new period is created (again as DRAFT) and the five stages run fresh.
  4. Empty-run guard — if the new run has no supply/matched energy but a prior period did, the engine skips rather than wiping good data with a partial-meter tail.
  5. FINAL / DISPUTED priors are skipped, with a log line naming the period and its stamp. Nothing is written. Re-settling them is an explicit action, not a cron side effect.

In layman’s terms: soft stamps can be replaced like revising a draft invoice; locked or disputed stamps need a conscious “void and reissue” process.

11.5 Disputes — who, where, when, and what happens

Two different “disputes” (do not mix them)

Kind About Where Status / case object
Bilateral settlement dispute “This PPA period’s kWh or money is wrong” Contract settlement (period status → DISPUTED) SettlementPeriod.status
Market / BRP reconciliation dispute “Our books disagree with the Market Operator file” Strategy Reconciliation / MO dispute inbox DisputeCase + recon line — V9 §8

This section is about the bilateral stamp. Market disputes do not flip a PPA period to DISPUTED by themselves.

When would you raise a bilateral dispute?

Typical circumstances (examples, not an exhaustive legal list):

You do not raise DISPUTED merely because a late meter is expected — that is what PRELIMINARY / provisional and a routine re-run are for. DISPUTED is for “we formally disagree with this locked or offered version.”

Who raises it, and where

Actor Role
Buyer or seller seat on the PPA Raises it with Raise dispute on the period detail header
The other seat Answers it: approves, counters, or explains, in the disputes room
System Stamps the period, freezes the evidence, refuses silent overwrite, runs the response clock

Where in the product: the Raise dispute button sits beside Preliminary and Finalise on the period detail header, on any run stamped PRELIMINARY or FINAL. That placement is deliberate — §11.2 notes there is no dual-signature gate on Finalise, so the seat that did not lock the period needs its answer in the same place. A DRAFT run has no button: still-revisable numbers want a re-run, not a dispute.

The dispute itself then lives in its own room, Disputes in the sidebar (§11.9), reachable from the banner on the disputed settlement.

Where not to look: Opening a market Open dispute on a reconciliation line is about MO settlement files, not flipping SettlementPeriod to DISPUTED.

What happens to a disputed settlement

In plain words, DISPUTED means:

  1. Stop treating the period as quietly revisable. Cron will not reverse it the way it reverses DRAFT.
  2. Keep the evidence. Line items, intervals, and content_hash stay — that hash is exactly so both sides can say “we are arguing about this calculation.”
  3. Correction is forward-looking. The design is not “edit July’s FINAL row in place.” It is: resolve the argument → run an explicit re-settlement (and/or post an Adjustment of type dispute_correction / re_settlement / prior_period_revision on a later period) → issue a new period / statement version.
  4. Statements. An issued statement that pointed at the disputed run should be framed as under challenge; a corrected run gets its own hash/version rather than rewriting history (§9.9).
  5. Payment discipline (market context). For market invoices, the code’s rule of thumb is “pay notwithstanding dispute; correct via rerun” (V9). Bilateral PPA commercial payment terms live on the deal; the settlement stamp still tells you whether the calculation is locked or under challenge.

Until DISPUTED is cleared by a correction path, do not compare that leg to a soft PRELIMINARY sibling on Chains without reading the lifecycle warning (§10.5).

What the raise screen does for you

You do not start from a blank form. Opening Raise dispute runs the same checks §12.15’s dispute checklist asks you to run by hand, and pre-selects the grounds that look wrong, each with the figures that prompted it:

The platform checks It suggests
Shared-source carves plus surplus do not equal the metered total Allocation carve
The period settled on provisionally-resolved data Delivered quantity — with the caveat that a re-run is usually the right route
The applied loss factor differs from the contracted one Loss factor / topology
A priced line carries no unit rate to check against a tariff TOU band or price
An adjustment cites a prior period that is missing or reversed Unrecognised adjustment
The run carries no content hash Version integrity

A suggestion is not an accusation. Loss factors legitimately differ from the contracted figure when a published or municipal table resolves them — the reason line says so, so you can dismiss it in one read rather than raise a dispute the evidence would have answered.

You then tick the figures you dispute (period totals, and your own ledger lines) and state what each should be, write your statement in your own words, and serve. Serving marks the period DISPUTED, freezes the evidence exactly as you saw it, notifies the counterparty, and starts a 14-day response window.

Careful. Freezing matters. If the dispute ends in a re-settlement, the period’s live figures become the new ones — and the argument was about the old. The frozen snapshot is what keeps “we are arguing about this calculation” true afterwards.

11.6 Reversal — and can a reversed settlement become FINAL?

REVERSED means: “this version is no longer the live bill; we kept it so auditors can see what we used to think.”

How a period becomes REVERSED

Path When
Automatic A new eligible settlement run for the same PPA + period start finds a prior DRAFT or PRELIMINARY and supersedes it
Explicit (designed for locked cases) A FINAL or DISPUTED period is deliberately superseded as part of a correction — never by accident from the daily cron

Reversed periods keep their children. The UI list focuses on live statuses; the archive is still in the database.

Does REVERSED ever become FINAL?

No. A reversed row does not “heal” and turn green.

What can become FINAL is the replacement period — the new DRAFT (then PRELIMINARY, then FINAL) written for the same calendar window after the old one was reversed.

Run A  DRAFT  ──re-run──▶  Run A  REVERSED   (archive)
                            Run B  DRAFT  ──review──▶ PRELIMINARY ──lock──▶ FINAL

If Run B is later found wrong after FINAL:

Run B  FINAL  ──explicit correction──▶  Run B  REVERSED (or stays FINAL + adjustment policy)
                                         Run C  DRAFT → … → FINAL

Either way: FINAL attaches to a living version, never to a reversed corpse.

11.7 Correcting FINAL or DISPUTED (explicit path)

Because a routine re-run will not touch FINAL or DISPUTED, the correction sequence is:

  1. Agree that the locked (or disputed) numbers are wrong — every disputed figure approved by both sides (§11.9).

  2. Choose how the correction is applied. Two routes, and the choice is recorded on the dispute:

    Route What moves What does not
    Re-settle The period is explicitly reversed and the window re-run; the successor is born DRAFT Nothing is edited in place; the reversed period keeps its children and its hash
    Forward adjustment A dispute_correction adjustment and its paired ledger lines post on a later period, citing this one The disputed period keeps its FINAL stamp
  3. Both parties sign off on the agreed figures. One signature is not enough — the same rule that lets one seat Finalise alone is why closing a dispute takes two.

  4. On a re-settle, the new period is reviewed and locked to FINAL by the normal path. On a forward adjustment, the correction appears in the next period’s ledger under Dispute correction, and the running ledger marks the month it adjusts.

  5. Re-issue or re-view the statement against the new content_hash.

A routine Pipeline.run against a locked period skips it and logs why, leaving the row untouched. It does not raise: once counterparties can raise disputes freely, an exception here would abort the whole nightly settlement for that contract every night until the argument ended. The explicit path is a different verb, and it requires a reason.

If the third-party correction has nowhere to land — a forward adjustment with no later period settled yet — the screen says so rather than dropping it silently. Apply it once the next period has run.

11.8 Worked examples (layman’s walkthroughs)

Example 1 — Late meter: DRAFT replaced, then (later) locked

Data. full_demo · seed 42 · stage S09 · physical PPPA-202607-138209764 · period 2026-07-09.

Monday night. The off-taker meter is late. Settlement still runs using nomination for demand. You get a period — today usually stamped DRAFT, often with provisional: true. Think: “kitchen ticket printed from the booking sheet, not from the scale.”

Wednesday. The meter reports 38,933.333 kWh instead of the 38,000 nominated. The runner settles the same window again:

Month-end close. On the good run’s period detail header, a party closer clicks eye Preliminary, then lock Finalise. From that moment a casual re-run cannot clobber it.

Follow along. Seat: IPP2 Atlantis Wind. Path: Contracts → PPPA-202607-138209764 → Settlements → 9 Jul 2026. Read the status chip (and the Preliminary / Finalise controls beside it when the run is still soft); a superseded soft run remains traceable rather than disappearing.

Example 2 — Partial-meter tail does not reverse a good DRAFT

Settlement ran with real energy. Later a botched re-ingest leaves meters empty for an hour. A re-run finds no supply and no match, but a prior period for that window did have energy. The engine skips: it does not reverse the good period and does not insert an empty DRAFT. In plain words: a blank reprint must not shred a valid invoice.

Example 3 — FINAL refuses a casual re-run

Ops locks July 9 as FINAL. A nightly job tries the same window again because someone tweaked a rate table. The pipeline skips that contract for that window and logs why: the prior period is FINAL, and re-settling a locked period requires an explicit correction. The FINAL row is unchanged; no second period appears. That is the lock doing its job — and it does it without failing the run for every other contract in the batch, which matters now that a counterparty can put a period into DISPUTED at any time.

Example 4 — Dispute after close, then a new FINAL

  1. July is FINAL. The statement cites hash abc….
  2. The buyer opens the period and clicks Raise dispute. The composer has already ticked Loss factor / topology: the applied haircut is 6.0% against a contracted 5.0%. They tick the delivered-energy figure, claim 102,000 kWh against the stated 100,000, write why, and serve.
  3. The period is stamped DISPUTED and the seller is notified. Cron cannot silently rewrite it, and the evidence is frozen as served.
  4. In the disputes room the seller counters the volume at 101,000; the buyer approves it. The seller approves the corrected loss factor. Every figure is now agreed, so the buyer records the outcome — re-settle — and both seats sign off against the digest of the agreed figures.
  5. Applying it reverses the old period to REVERSED (children and hash intact) and the window is re-run with the corrected loss factor. The successor is born DRAFT; both seats review it → PRELIMINARY → FINAL. New statement, new hash. The disputed version remains in the archive so nobody can pretend the first bill never existed — and the dispute still shows what was disputed, because its snapshot was frozen before the figures changed.

Had the parties instead chosen forward adjustment, step 5 would have left July FINAL and posted a dispute_correction on August, citing July. Same argument, same agreement, different accounting route — §11.7 has the comparison.

Example 5 — Lifecycle mismatch on Chains

Trader buys from IPP (leg FINAL) and sells to off-taker (leg still PRELIMINARY). Chains shows Lifecycle mismatch: do not quietly say “the chain balances” when one hop is locked truth and the other is still allowed to move. Resolve status first, then re-read the bridge (§10.5).

11.9 The dispute screens

Follow along. Seat: off-taker (offtaker_c@webill.net). Path: Contracts → open a PPA → Settlements → open a period stamped PRELIMINARY or FINAL → Raise dispute. You should see the three-step composer with suggested grounds on the right and the figures that prompted them on the left.

Two screens, and a banner.

The banner. A disputed settlement carries a red Under dispute banner (#settlement-dispute-banner) under the window strip: who raised it, when, their statement, and Open the dispute. It also says the thing a reader most needs before comparing any number on the page — routine re-runs will not overwrite this run while the dispute is open, and any correction is applied forward.

This agreement’s list. The contract page’s Disputes tab (§12.17) is the same disputes, narrowed to one agreement. A row opens the case in a drawer over that tab.

The composer (a modal on the period detail) is the three steps of §11.5: grounds, figures, review and serve. The evidence rail on the left stays visible throughout, because the numbers that justify a claim belong beside the claim.

The room (/org/deals/disputes, the Disputes tab under Deals) is org-level and holds both directions — disputes you raised and disputes against you — because the question you bring to it is “what needs me?”, not “what happened to contract X”. Its default filter is needs my action, and the Disputes tab badge counts the same set.

One dispute’s page reads in this order:

Block What it answers
The claim Which grounds, and what the claimant says in their own words
Evidence, as served The frozen figures per ground, with links into the live rooms
The figures The negotiation table — one row per disputed number
Resolution How the correction will be applied, and the two sign-offs
Messages / Timeline The words exchanged, and every move in order

The figures table works exactly like the contract wizard’s joint terms, because you have already learned that grammar agreeing a PPA:

Nothing can be resolved while any figure is still pending — the gate line above the table says how many are outstanding. Then one party records the outcome, and both sign off against a digest of the agreed figures. If anything about those figures moved since you read them, the sign-off is refused rather than binding you to numbers you never saw.

Note. You see the counterparty’s proposed values here, and they see yours. That is the point of the room: elsewhere the visibility matrix keeps their prices out of your statement, but a dispute you cannot both read is not a negotiation.

11.10 When the parties cannot agree

Not every dispute ends in agreement, and the platform does not pretend otherwise. Three exits, all recorded:

Exit What it means What the platform then does
Lapsed The response window closed with no engagement Nothing about the argument changes — the period stays DISPUTED. That lock is the leverage. You may re-serve once with a fresh window, then escalate
Deadlocked Both engaged and cannot agree; either party declares it Records who declared it, and opens escalation
Escalated Referred out of the platform Names the forum, hands over the evidence, waits for the ruling

A lapse is not a verdict. It records that one side did not engage. The system sends one reminder before the window closes and stamps the lapse when it does; both are on the timeline.

Escalation narrows the platform’s job to the three things it is uniquely placed to do:

  1. Name the forum your agreement chose. The escalation panel reads the contract’s own dispute-resolution clause — AFSA, ICC, expert determination — and quotes it. Where the contract is silent, it says so rather than inventing a process.
  2. Hand over the evidence. One download: the claim, the frozen evidence, every figure with what was offered and by whom, and the full timeline. That is the record an arbitrator who did not watch the argument needs in order to rule on it.
  3. Record and apply the ruling. Enter the reference and how it applies, and the figures flow through the same two routes as an agreed resolution. The period does not stay DISPUTED for ever because the argument left the building.

Careful. Escalating a bilateral PPA dispute is not a hand-off to the Market Operator. The MO’s dispute inbox is about settlement files (V9 §8). A private commercial argument between two PPA parties is not the MO’s to decide, and nothing here opens a market case.

11.11 Worker cadence (bridge)

Cron Worker Role
Daily 01:00 SettlementRunner (DAILY) Closes daily-frequency contracts
Mondays 02:00 SettlementRunner (WEEKLY) Weekly frequency
1st 03:00 SettlementRunner (MONTHLY / QUARTERLY) Month / quarter close
1st 04:00 ChainReconciliationRunner Chain P&L check (§10)
1st 04:10 LevyConservationRunner Non-bypassable levy coverage — raises on a miss (§4.2.1)
Daily 05:15 DisputeClock One reminder before a dispute’s response window closes, then lapses it (§11.10)

PipelineRunner is fanned out per allocation set by the settlement runner. StatementRunner finalises statement snapshots on demand (no crontab) — that is not the same as flipping period status to FINAL. The full background-process catalogue lives in V21 · Operations.

Where this is taught next. Period UI — §12. Statements and hashes — §9. Chain lifecycle mismatch — §10.5. Market file disputes — V9 §8. Resolve / provisional inputs — §3.

Revised meter inputs

A correction writes a new interval revision and preserves the old row. Affected open settlement windows are queued for recalculation; DRAFT/PRELIMINARY runs can be superseded. A FINAL or DISPUTED period instead receives a visible finding: Revised read on a locked period — reverse explicitly to re-settle. An incoming correction does not grant permission to rewrite a locked settlement.

12. The settlement UI

Think of one executed agreement as a lease. The lease names the two parties, the price, and how you end it early. Each month the building manager writes what was used and what is owed. This chapter is that lease, opened on screen.

The numbers from §§1–11, the signed terms they were cooked from, any argument about them, and a notice to end the deal all live on one contract page. You open it from Deals → Contracts. The Deals tab bar drops away. What stays is this agreement’s own bar of six tabs. The header does not change. Only the panel under the tabs changes.

Tab Route The question it answers
Overview /org/deals/contracts/:ppa_id Who signed, and which terms the bill is allowed to use (§12.16)
Settlements …/settlements What happened to energy and money in each window (§12.3)
Ledger …/ledger How those windows add up over time (§12.4)
Statements …/statements The document you can send for one window (§12.5 · §9)
Disputes …/:ppa_id?tab=disputes Challenges raised on this agreement’s windows (§12.17)
Termination …/:ppa_id?tab=termination The notice clock, and the leaving payment on the last window (§12.18)

Settlement detail (…/settlements/:period_id) is not a seventh tab. It is the Settlements tab zoomed into one window. Click a Settlements row to open it (§12.3): the same header and the same six tabs stay, with Settlements marked current, and the detail panel appears underneath (§12.6).

The register that lists every agreement is taught in V7 §6. This chapter walks the page you land on after you open one.

Data for list and detail is assembled by WB.Wheeling.SettlementExplorer and framed for your organisation’s seat.

12.1 How you get there

Follow along. Seat: IPP2 Atlantis Wind (IPP app). Path: Org → Deals → Contracts → open PPPA-202607-138209764. You land on Overview. The same bar then opens Settlements, Ledger, Statements, Disputes and Termination. Open a window row on Settlements to zoom into that window. When a window is still DRAFT or PRELIMINARY and you are a party, the window strip shows Preliminary / Finalise (§11.2).

Only a party to the agreement can open the page. Anyone else is sent back to the register with Contract not found.

Every route here is a tab of the one contract page, so there is a single way in: open the contract, then pick the tab. From a settlement detail, the window strip walks to the neighbouring windows and ‹ All N windows returns to the list.

Per-run printable statements are taught in §9; this chapter documents the month hub UI and the settlement detail page.

12.2 Shared chrome — the contract header and its tabs

Every tab on this page shares the contract’s chrome. The register that leads here is V7 §6.1. The chrome does not change when you move between the six tabs.

Part What it carries
Crumb Deals · Contracts · the agreement reference, with ‹ Back to Contracts (#contract-back-to-register)
Contract header Reference, negotiation status, type pills, Seller → Buyer with your seat flagged You, and the meta row: term, Network topology path, capacity, cadence and the next settlement run
Tab bar (#contract-nav) Overview · Settlements · Ledger · Statements · Disputes · Termination. The current tab is marked. A count appears on Disputes when this agreement has any

Ids: #contract-page, #contract-header, #contract-header-ref, #contract-header-status, #contract-header-seller, #contract-header-buyer, #contract-header-topology, #contract-header-next-run, #contract-header-next-run-relative, #contract-tab-overview, #contract-tab-settlements, #contract-tab-ledger, #contract-tab-statements, #contract-tab-disputes, #contract-tab-termination.

The parties and the network path are stated once, in the header. No tab repeats them. The header status is the agreement’s own stamp — Active, Signed or Terminated — not the stamp on a settlement window. Window stamps (Draft, Preliminary, Final, Disputed, Reversed) live on the Settlements rows and on the window strip (§11).

Two actions can sit in the header, beside the reference. They are not tabs.

Action When it shows What it does
Written agreement (#view-agreement-{id}) A long-form document has been generated for this physical agreement Opens that PDF in a modal. Download saves the file
Register forward (#view-forward-{id}) The agreement is physical and Active Opens forward registration under the same header, without taking a tab (V10 §18.1)

12.3 Settlements — the windows this contract has billed

Screen: ContractSettlementsLive · #contract-settlements.

Purpose. The Settlements tab answers three questions in order: what is a settlement here, what happened to the energy and the money across the windows that settled, and which window should I open. It is the contract’s run directory and its story; the month-on-month money spine is the Ledger (§12.4) and a sendable document is Statements (§12.5).

What settles here (#settlements-explainer)

One paragraph in this contract’s own terms — its cadence, its two parties, its tariff — followed by the five pipeline stages as a rail: Resolve · Match · Price · Adjust · Ledger Σ = 0 (§2). Fold it away with the toggle once you have read it.

The energy (#settlements-energy)

The chain in one sentence and one bar: produced → matched → losses → delivered, with spill when there is any. Underneath, #settlements-coverage says how much of the buyer’s demand across those windows this contract actually covered — the answer to “why is delivered so much smaller than demand”, which is usually “because this contract was never meant to cover all of it”.

The money (#settlements-money)

What the net was for, not just what it was. The seat’s line items are grouped into money families by SettlementExplorer.category_family/1 — Contract energy · Network & levies · Trader margin · Contract adjustments · Certificates — each with the categories inside it named, and the whole shown as a composition bar when every family pushes the same way. The headline states the effective c/kWh the bill works out to, which is what makes one window comparable with another.

When two entries dwarf the bill and point opposite ways — a curtailment charge against an imbalance credit, say — #settlements-offsetting names both and the amount they leave behind. A net of R 2 million that is really R 23 million charged against R 22 million credited should say so.

Settled windows (#settlements-list)

Grouped by calendar month, expandable, newest first.

Column What you read
Window settled The window this bill covers — Wed 9 Sep 2026 — with the cadence and the calculation time beneath (#settlement-window-{id}, #settlement-run-at-{id})
Status The status chip with its meaning in plain words: may still change · shared for review, still revisable · locked, the commercial close (§11.1)
Energy: produced → delivered The row’s own chain, as a bar and as figures, with losses called out
Your net Your framed amount, Receivable / Payable, and the effective c/kWh delivered
(open) Eye tip View (#view-settlement-{period_id}) — the whole row is the control

The cadence is a contract fact, so it is stated in the header and in each row’s subtitle rather than repeated as a chip on every line. The status legend above the table explains only the statuses this contract has actually carried.

Month group rows (#settlements-month-{YYYY-MM}) carry a small light, the month, the window count, delivered MWh and the group’s net. Click the month row to fold or unfold its windows. The light is green when the month has no draft window, and orange when it does (Includes draft settlements). A draft window may still be replaced (§11).

Open a window — list to detail

The Settlements tab is the directory. One click opens the bill for that window. The destination is Settlement detail (§12.6).

  1. Stay on Settlements (#contract-tab-settlements is current).
  2. In Settled windows (#settlements-list), find the month and the row you want (#settlement-period-{period_id}).
  3. Click anywhere on that row (or the View tip). The click runs open_settlement and navigates to /org/deals/contracts/:ppa_id/settlements/:period_id.
  4. What stays on screen. The contract crumb, the contract header, and the six tabs. Settlements is still the current tab. You have not left the contract page.
  5. What appears underneath. The Settlements list is replaced by the detail panel (#settlement-detail): first the window strip that restates the row you clicked, then the blocks in §12.6.

If the period cannot be found, the flash is Settlement not found. and you are sent back to the contracts register.

Note. A second door exists on the Ledger tab: Open window on a category line keeps the ledger month and category in the URL and returns you with ‹ Back to Ledger (§12.4 · §12.7). From Settlements, ‹ All N windows is the way back.

Hidden windows (#settlements-hidden-note)

Windows whose framed net is zero are not listed — a daily contract accumulates many — but the count is stated, with a link to the Ledger, which keeps every one. Silence about them is what made a daily contract look like it had settled four times all year.

Empty state

No settlements yet — a run appears after each bill run once the period closes and meter or nomination data has been ingested (#settlements-empty).


12.4 Ledger — the contract’s money spine

Screen: ContractLedgerLive · #contract-ledger · /org/deals/contracts/:ppa_id/ledger — the Ledger tab of the contract page (§12.2).

Purpose. Every settled window writes signed lines — who, what for, how much and which way — into a book that sums to zero across the parties on it (§8). The Ledger keeps your side of that book for every window of one contract, stacked by calendar month into a running position. Settlements answers what happened in each window; the Ledger answers how those windows add up over time, and how much of the answer can still move; Statements is the sendable document for one window (§9). The page says this itself, once, at the top.

Three facts the page states up front, because every reading depends on them:

Fact Why it matters
Your side only Signs are framed for your seat: − you pay, + you receive. The counterparty’s lines exist in the book but are not shown here
An accrued position, not cash Nothing here says what has been paid. Payments are recorded against issued documents on Billing (V15 §16)
Every window, kept Unlike the Settlements tab, a window that billed nothing still has a row, and a calendar month with no window at all is shown as a gap

Follow along. Same seat and agreement as §12.1: Deals → Contracts → open the agreement → Ledger.

What this ledger is (#ledger-explainer)

One collapsible paragraph in the contract’s own terms, the three facts above, and a strip (#ledger-explainer-tabs) that names the three tabs, what each answers, and links to the other two.

Your position (#ledger-position)

Element What it says
Position sentence (#ledger-position-story) After N settled windows you owe {counterparty} R X (R Y incl. VAT). Then which months moved it, and by how much
How firm is it? (#ledger-firmness) A bar splitting the position into locked — on FINAL windows — and soft — on DRAFT or PRELIMINARY windows a routine re-run may still replace (§11) — and a sentence naming the locked months and the soft amount
How it adds up (#ledger-arithmetic) Charged · Credited · Position excl. VAT · VAT on those lines (#ledger-vat) · Position incl. VAT (#ledger-gross), in one column
Offsetting warning (#ledger-offsetting) When the gross charged and credited are dominated by a pair that nearly cancels — a curtailment charge against an imbalance credit — the page says so: neither gross figure is a bill

VAT. Line amounts are exclusive of VAT. The VAT figure is the tax computed on those lines, and Position incl. VAT adds the two. Earlier editions of this chapter described the headline net as VAT-inclusive; it is not, and never was.

Month by month (#ledger-spine)

One table, oldest first, so the position accumulates down the page to the figure above. There is no separate chart or summary panel: the table is the spine.

Control Id What it does
All windows / Locked only #ledger-scope-all · #ledger-scope-locked Locked only re-reads the whole spine from FINAL windows alone — the position you can rely on
For #ledger-category-filter Everything, or one charge category, labelled by its family
CSV of the lines #ledger-download-csv Level-3 lines for the current scope and filter

A legend (#ledger-family-legend) names the money families the contract has used — Contract energy · Network & levies · Trader margin · Contract adjustments · Certificates — the same families as the Settlements tab (§12.3). Hatched fill means soft.

Month row (#ledger-month-{YYYY-MM}, with a data-kind):

Column Meaning
Month Name, window count, and the status mix — 1 Final, 2 Draft · 2 placeholder
What it was for A family bar and the two heaviest families, e.g. adjustments 58% · energy 31%
Charged / credited The month’s gross debits over its gross credits, for your seat
Net this month A bar scaled to the largest month, the signed amount, you pay or you receive, and soft when the month is not all FINAL
Position after The running balance after this month, marked locked, or how much of it is soft
Statements (#ledger-month-{key}-statements) The month hub for that month (§9)

Rows that carry no money still explain themselves:

data-kind Row reads Meaning
placeholder Ran on placeholder data — no metered energy yet, nothing billed to your seat Provisional runs; they re-run when meters land. The position is unchanged
zero Settled with nothing for your seat this month Windows ran, but your seat had no money on them
gap No window settled. A gap in the record (amber) The engine closed no window in this month — a data problem, not a quiet month

Expanding a month (#ledger-month-{key}-detail) drills by family (#ledger-family-{key}-{family}), then category (#ledger-cat-{key}-{category}). Each category names its direction — charged to you or credited back to you — its source term, the contract clause or tariff every line in it came from, and an adjusts {month} chip when it is a cross-period adjustment. Where two categories in a family nearly cancel, the family says so. Windows the month counted but did not bill are listed beneath the families rather than hidden.

Expanding a category loads its lines (#ledger-line-{id}), one per window. A line leads with the window it settled, then its status, TOU band, description, quantity, rate and run timestamp, and its signed amount. Open window (#ledger-line-open-{id}) opens that settlement with the ledger remembered (§12.7); Back from there reopens the same month and category here.

The latest month that billed opens by default. The rest are one click away.

The proof (#ledger-balance-note)

Under the table the page states whether every window’s whole book — all parties, not just your seat — sums to zero. When it does not, the note turns red and says how many windows fail. §8.3 explains why that check is load-bearing.

Semantics that keep it a ledger

  1. Signs are already framed for your org (+ receivable / − payable).
  2. Own lines only — never the counterparty’s money rows.
  3. Every window stays, including the ones that billed nothing.

12.5 Statements — the document register

Screen: ContractStatementsLive · #contract-statements · /org/deals/contracts/:ppa_id/statements, the Statements tab of the contract page.

Every settled window by month, with whether a numbered statement has been issued for your seat and the total due incl. VAT; one window’s statement opens in a drawer over the register. The tab is documented in full in §9: the register in §9.2, the drawer in §9.3, the PDF modal in §9.6.

What the money tabs each answer. Overview, Disputes and Termination sit on the same bar and are taught in §12.16, §12.17 and §12.18.

Tab Question
Settlements What happened in each window (§12.3)
Ledger How the windows add up over time (§12.4)
Statements The document for one window — issued or live, and what to quote when sending it

12.6 Settlement detail — the window you opened

Screen: ContractSettlementLive · #settlement-detail · /org/deals/contracts/:ppa_id/settlements/:period_id.

This is the page you land on after you click a row on the Settlements tab (§12.3). A Ledger Open window link lands here too (§12.7). It is not a seventh tab and not a different contract: the crumb, the contract header, and the six tabs stay exactly where they were, with Settlements still marked current (active: :settlements on ContractShell). Only the panel under the tabs changes.

A settlement period is one contract × one window’s settled record — the energy story, the money lines, and the stamp on that version. This page is that record, opened for your organisation’s seat. Data comes from WB.Wheeling.SettlementExplorer.detail/2 and its WindowStory.

Follow along. Same seat and agreement as §12.1: Deals → Contracts → open PPPA-202607-138209764 → Settlements → click the row for 9 Jul 2026. URL ends …/settlements/{period_id}. Settlements stays lit. Under the tabs you should see the window strip for that day.

Top to bottom — every block on the page

Read the panel in this order. Blocks marked when present are omitted when the run has nothing to show; the page does not leave an empty card for them.

Order Block Id What you use it for
1 Window strip #settlement-window Which window this is, the row restated, place in the list, ledger position, steps either side, Preliminary / Finalise / Raise dispute (§12.7)
2 Data-quality findings (when present) #settlement-data-quality-findings Amber notes for locked-revision findings on this period. Empty when there are none — no placeholder card
3 Devices (when present) #settlement-devices Interval evidence from the settlement snapshot: Upside share, Volume strike, and/or Measured availability. The section renders only when at least one of those keys is in the snapshot; otherwise it is absent
4 Under dispute banner (when present) dispute banner under the strip Who raised the open case, and a link into it (§11.9). Shown only when your seat has an open dispute on this period
5 How this window settled #settlement-story Resolve → Match → Losses → Price → Adjust → Ledger — one numbered stage each, sentence plus evidence (§12.8)
6 Your lines, explained #settlement-line-item-ledger Every line for your organisation as a sentence: quantity × rate = amount, which way, which clause, its twin, its VAT (§12.10)
7 Cite this version #settlement-audit Agreement, window, status, run at, topology, content hash (§12.13)

There are no headline stat cards and no separate chart strip outside the story. Money totals live in the stage sentences and in the line-item footer. The one picture the page keeps — when did the buyer get power — sits inside stage 2, Match (#settlement-profile-need · #settlement-profile-supply).

Raise dispute opens a composer overlay (#dispute-composer) over this same page; it does not navigate away. View dispute opens the dispute drawer over the page the same way (§12.15 · §11.5).

Honesty. The Devices panel is built and wired from index_snapshot keys. When a run never stored upside share, volume strike, or availability, the panel is simply not on the page — that is expected, not a broken empty state.

12.7 Settlement detail — the window strip

#settlement-window. The strip is the first block under the tabs on the detail page (§12.6). It answers the question you arrive with: which line did I just click? It restates that row — same date, same status wording, same energy chain, same net and same effective rate — so the page is recognisably a zoom into it.

Element What it is
Settled window · N of M (#settlement-window-position) Where this window sits among the windows the Settlements tab lists, newest first
Window date (#settlement-window-date) The day the window settles — the same date the row leads with, never the timestamp of the job
Seat and status (#settlement-window-status) Which seat you settled as, the counterparty, and the status in plain words
Status chip This run’s stamp
Frequency chip (#settlement-detail-frequency) How long a window is
Virtual pill Virtual PPAs only
Recap (#settlement-window-recap) X MWh produced, Y MWh delivered — you pay/receive R…, an effective N c/kWh on what arrived — the row’s own figures, in a sentence
‹ All N windows (#settlement-back-to-list) Back to the Settlements tab
← earlier window (#settlement-window-earlier) The next window back in time, named by its date
later window → (#settlement-window-later) The next window forward, named by its date
Status actions (#settlement-status-actions) Compact controls when you are a party: Preliminary (#settlement-mark-preliminary, DRAFT), Finalise (#settlement-finalize, PRELIMINARY), Raise dispute (#settlement-raise-dispute, PRELIMINARY/FINAL), or View dispute (#settlement-view-dispute) when open (§11.2 · §11.5)

At either end of the list the step stays in place and says so — ← earliest window, latest window → — rather than disappearing, so you can tell the end of the record from a missing control.

The steps walk the same sequence the table shows, which is the windows with a non-zero net for your seat. A window that nets to zero is not in that sequence — the Ledger tab links to it, and when you arrive that way the strip says so (#settlement-window-unlisted) instead of pretending the window sits at an end of the list.

In the ledger, and arriving from it

Below the recap, In the ledger (#settlement-ledger-position) places the window in the contract’s running position — position before → this window → after — and says whether this window is locked or soft. It shows whichever way you arrived; it is the one sentence that ties this page to the Ledger tab.

When the window was opened with Open window on the Ledger tab (§12.4), the strip also remembers where you came from:

Element What it is
From the ledger (#settlement-origin) The month, and the family › category line, that was opened
Nth of M in the ledger The window’s place in the ledger’s full sequence — every window, placeholders included — rather than among the windows the Settlements tab lists
The line you opened (#settlement-origin-line) That category’s total on this window, highlighted in the line-item ledger (tr[data-origin-line])
‹ Back to Ledger · {month} (#settlement-back-to-ledger) Returns to the Ledger with that month and category reopened
← earlier · later → Step through the ledger’s order, keeping the context; each step’s Back points at its own month

If an open dispute exists for your seat, a banner (Under dispute) sits after the strip — and after any data-quality or Devices blocks — with a link to the case (§12.6 · §11.9).

12.8 How this window settled — the six stages

#settlement-story. The pipeline of §2, told for this one window in the contract’s own words. Each stage (#settlement-stage-{resolve|match|losses|price|adjust|ledger}) is a numbered sentence on the left and its evidence on the right, and the two stages that write money — Price and Adjust — name the ledger lines they wrote ([data-role="wrote"]), so every line below has a visible origin above.

Stage The sentence says The evidence beside it
1 · Resolve Whose meters were read, what the plant’s meter (or this contract’s carve of a shared meter) read, what the buyer needed, and in how many intervals of how many minutes On a shared meter, a fold The shared meter, month to date (#settlement-allocation): the whole meter this month, this contract’s carve and share, the hierarchy version, the conservation check, and for the seller seat the members table ([data-role="allocation-members"]) with View hierarchy. The month figures are labelled as month to date and never passed off as the window’s. A one-to-one contract shows Supply = metered, no carve (#settlement-allocation-trivial)
2 · Match When the plant generated, how many intervals with a need were met in full and in part, how much matched and what share of the need that was, how much went unmet and when, how much spilled Did the buyer get power? (#settlement-profile-need): one cell per interval for a daily window, per hour up to a week, per day beyond; green met, amber met in part, red unmet, grey no need; height is the need. What the plant made (#settlement-profile-supply): the carve per cell on its own axis, with a note on how the plant’s height compares to the need. The band table (#settlement-energy-balance): carve, need, matched, unmet and delivered per TOU band, each band labelled with the hours it covered today
3 · Losses The network path in words, the loss percentage and the factors it is the sum of, and the arithmetic from matched to delivered A delivered / lost bar and the source line (#settlement-loss-source): uos_loss_factors, each factor, and whether it is fixed for the term. A virtual contract says no losses apply and why
4 · Price The tariff type in plain words — FIXED at 85 c/kWh, so every band prices the same — and delivered × rate = the energy money, which way The energy lines it wrote, and for an indexed contract the Strike vs realised index card (#settlement-index-ref)
5 · Adjust Which clauses fired — curtailment, imbalance, spill, shortfall, banking — what they add up to and what share of your net that is; or that every clause was quiet The adjustment lines it wrote
6 · Ledger How many lines and parties are on the book, how many are yours, who carries the rest, that the network money never touches you, and that the book sums to zero Party chips (#settlement-book) with line counts, yours marked and carrying your net; the proof (#settlement-book-balance, data-balanced); the counterparty’s received volume against yours (#settlement-counterparty-volume); for a buyer seat, Saving vs grid tariff (#settlement-saving)

Other parties’ amounts are not shown, only their line counts and the fact that the whole book balances. Volumes are shared; money is not (§12.14).

12.9 Reading the interval strip

Not the window strip above — the interval picture inside stage 2, Match (#settlement-profile). It answers the question no total can: when did the buyer get power. Hover a cell for its clock label, need, matched and unmet. A solar plant reads as a green day inside red nights; a firm supply reads as an unbroken green bar; a buyer far bigger than the carve reads amber all day. The plant’s curve beneath it is on its own axis because the carve and the need may differ by a factor of seventy, and one axis would hide one of them.

12.10 Your lines, explained

Card: #settlement-line-item-ledger. Your organisation’s lines for this window only, each as an article (#settlement-line-{id}, data-category, data-family) rather than a table row.

Part What it says
Title The line in words — Energy · peak hours, Deemed energy for buyer-caused curtailment, Transmission · Eskom Transmission — with the category pill and, when in force, the Non-bypassable badge (#settlement-line-{id}-non-bypassable, §4.2.1)
Sentence Quantity × rate = amount, and which way it runs: 3 070.666 kWh delivered in peak hours (04–07 and 15–17 today) × the contract’s 85.00 c/kWh = R 2 610.07 to you. A rate the line does not carry is worked back from amount and quantity
Provenance ([data-role="provenance"]) Where the quantity came from (quantity from stage 3, Losses · quantity = unmet demand, stage 2), which term set the rate (source_term, with the tariff type), the adjustment record when one exists, the line’s twin — the equal and opposite line on the other party, named — and its VAT
Watch ([data-role="watch"]) On a deemed-energy line worth a quarter or more of your net: that it rests on the shortfall being the buyer’s to bear, and that this is the line a counterparty will name
Formula chips quantity · × · rate · = · signed amount, green to you, red from you

A zero line stays, quietly, with the reason it is zero — Nothing delivered in off-peak hours (20–04 today) — the plant produced nothing in those hours. A line opened from the Ledger is highlighted and badged from the ledger (§12.7).

Header links: View statement (#settlement-view-statement), Running ledger (#settlement-view-running-ledger) and, on a chain, Part of a chain — view reconciliation (#settlement-view-chain).

Footer (#settlement-ledger-net-label): Net Receivable / Net Payable / Net, the net by money family, VAT on top and the figure incl. VAT, and the signed total — which must agree with the window strip.

Empty copy: No line items on this settlement for your organisation.

Which categories have a template

Energy by band, energy without a band, capacity, curtailment deemed energy, every network category (wheeling, transmission, distribution, ancillary, losses, electrification subsidy, regulatory levy), the wheeled-energy refund, trader margin, imbalance, spill credit, shortfall penalty, banking, replacement energy and dispute corrections each have their own sentence. Anything else falls back to the line’s own description with its quantity, rate, amount and source term, so no line is left as a bare number.

12.11 Allocation on the page

Allocation lives inside stage 1, Resolve (§12.8), folded under The shared meter, month to date. The window’s own carve is in the Resolve sentence and in the band table’s Carve column; the fold holds the month-to-date view of the whole meter and its members. The teaching cast of §5 applies unchanged: opening one contract’s window shows that contract’s share, not the whole plant.

12.12 Energy balance on the page

The band table (#settlement-energy-balance) sits inside stage 2, Match. Per TOU band — labelled with the hours it covered — carve (or supply), need, matched, unmet and delivered, with a window total. Conservation reads off it: carve = matched + spill and matched = delivered + loss, the loss being stage 3’s figure.

12.13 Cite this version

#settlement-audit, the last strip on the page: agreement, window, status, run at (#settlement-detail-run-at), topology and the content hash. Quote these before arguing a number (§12.15); Raise dispute captures them for you.

The counterparty’s received volume now sits in stage 6, Ledger (#settlement-counterparty-volume): their kWh by band against yours, never their tariff.

12.14 Role-aware detail and virtual periods

You see your ledger lines and the other party’s volumes. That is deliberate: volume reconciliation without exposing their negotiated tariff.

A virtual period (e.g. VPPA-202607-138349269 on 2026-07-03) uses the same strip, stages, lines and cite strip but carries a Virtual pill; its Losses stage says no losses apply, its Price stage speaks of the strike, and its Match stage tells the story from the totals when the run kept no intervals.

If a stage and a line appear inconsistent, test quantities before cash, in the order the stages are already in: Resolve (was supply a carve?) → Match → Losses → Price → Adjust → the line → the cite strip. That is Resolve through Ledger, and it gives support a reproducible version reference.

Where set-scoped screens live. Generator supply carve — V4 §9. Off-taker sources — V3 §13.5. Trader procured vs sold — V3 §5A.

12.15 Your fast dispute checklist

Purpose. Someone (a counterparty, finance, or your own ops desk) has queried a number. Before you argue — or click Raise dispute — you need to answer three plain questions:

  1. Which calculation are we talking about? (agreement + day + version)
  2. Is the energy story consistent? (kWh in → kWh out after loss)
  3. Which money line is the disagreement? (category + signed Rand)

This section is the hand-run version of that check. The product’s Raise dispute button runs the same path for you when you formally challenge a PRELIMINARY or FINAL run (§11.5).

In one sentence. Write down the fingerprint first, read the stages for the totals, use the strip only as a torch, and name the ledger line before you call anything “wrong on the invoice.”

Why the order matters

People naturally jump to the strip or the headline Net. That is the wrong first move. The strip is diagnostic (it shows shape); the stages are the roll-up (they show totals, and say where each came from). And without the cite strip, you and the other party may be staring at two different re-runs of the “same” day.

flowchart TB
  Q["Query arrives:<br/>Your July 9 net looks high"] --> ID["1 · Capture identity<br/>ref · date · status · Run at · hash"]
  ID --> ENERGY["2 · Check energy story<br/>Matched → Loss → Delivered"]
  ENERGY --> MONEY["3 · Find the money line<br/>category · signed amount · TOU"]
  MONEY --> DEC{"Still disagree?"}
  DEC -->|"Soft / expected late data"| RERUN["Ask for a re-run<br/>DRAFT or PRELIMINARY"]
  DEC -->|"Formal challenge"| RAISE["Raise dispute<br/>PRELIMINARY or FINAL"]
  DEC -->|"Explained"| DONE["Reply with hash + figures"]

Step-by-step (on the period detail screen)

Step Where on the page What you write down Plain meaning
1. Identity Cite this version (#settlement-audit, #settlement-detail-run-at) Agreement ref · window · status · Run at · content hash “We are arguing about this stamped version, not last Tuesday’s draft.”
2. Headline money Window strip and the Ledger stage (§12.7, §12.8) Net · VAT · the book’s Σ The bill’s summary in Rand — already framed + receivable / − payable for you
3. Energy story Stages 2 and 3, Match and Losses (§12.8) Matched kWh · loss % · delivered kWh · the band table Did the wires math hold? Money usually follows energy
4. Shape (optional) The strip (§12.9) Only if energy looks odd — which hours were unmet or partial The strip explains why a total moved; it is not the invoice
5. Money line Your lines, explained (§12.10) The line’s sentence · its provenance · its signed amount The exact line you will quote (“Seller energy −R 31,107.73”), with its twin named
6. Side checks Resolve’s allocation fold · the Ledger stage’s counterparty volume · Saving (when present) Carve vs meter · their kWh only · saving Rules out “shared meter” and “wrong party tariff” red herrings

Rule of thumb. If the Energy balance conservation identity fails, fix or dispute quantity / loss / allocation first. Do not start a price fight on a kWh that never left the wire story.

Worked example A — physical day (thread)

Data. Seat: IPP2 Atlantis Wind. Agreement PPPA-202607-138209764 (daily). Open period 9 Jul 2026. Full walk-through of the same day: §13.

Suppose OffTaker C emails: “Your statement shows about R 31k — we think delivered energy is overstated.”

1 · Capture identity (from the cite strip)

Fact Example value
Agreement PPPA-202607-138209764
Period 9 Jul 2026
Status e.g. DRAFT or PRELIMINARY (read the chip — soft vs locked)
Run at the UTC timestamp under Audit
Content hash the mono fingerprint under Audit

Reply with those five before any spreadsheet. If their hash differs from yours, you are not looking at the same calculation.

2 · Energy story (stages 2 and 3 — not the strip)

Quantity Thread figure Plain words
Matched 38,933.333 kWh How much of the buyer’s demand was matched to this IPP
Loss 6% → 2,336 kWh Wires tax on the matched path
Delivered 36,597.333 kWh What arrives for billing after loss

Check: matched ≈ delivered + loss. If that holds, “overstated delivered” usually means they are comparing to matched (pre-loss) or to a different meter window — not that the card invented Rand.

3 · Money line (your lines, explained)

Seat Seller energy line Meaning
IPP2 (seller) +R 31,107.73 Receivable for delivered energy
OffTaker C (buyer) −R 31,107.73 Payable for the same delivered energy

Same kWh, opposite signs — that is the shared ledger (§8). If the buyer’s seat shows a different category total, quote category + signed amount + TOU band, not “the Net card looks high.”

4 · Decide the path

Situation What to do
Status is DRAFT / soft PRELIMINARY and a late meter is expected Prefer a re-run, not a dispute (§11.2)
Numbers match the Match stage but they used a different loss table Point at the Losses stage’s path and factors; raise only if the contracted factor was ignored
PRELIMINARY or FINAL and you still disagree after the hash matches Raise dispute — composer pre-ticks likely grounds (§11.5)

Worked example B — virtual day

Data. VPPA-202607-138349269 · 3 Jul 2026 · §14.

A virtual period looks almost the same (strip, stages, lines, cite strip) but carries a Virtual pill and, without intervals, no strip. When the query is about a hedge day:

Quote this Not this
Matched hedge quantity · strike / reference category · Virtual pill · Run at · content hash “The strip” (it is not shown without intervals)
Ledger category for the CFDs / virtual energy line Physical loss % arguments that belong on a wheeled PPA

What “good” looks like in a reply

A short, citable answer — not a screenshot of the strip:

Period PPPA-202607-138209764 · 9 Jul 2026 · status PRELIMINARY · Run at <timestamp> · hash <content_hash>. Energy balance: matched 38,933.333 kWh · loss 6% · delivered 36,597.333 kWh. Seller energy line +R 31,107.73 (delivered × contract rate). Happy to walk Allocation / TOU if your hash differs.

Do / don’t

Do Don’t
Capture hash and Run at first Argue from an unsaved spreadsheet or a different day’s run
Compare the stages ↔︎ the lines Treat strip cells as the invoice total
Name category + signed Rand + TOU Say only “Net looks wrong”
Use Raise dispute when the run is locked/offered and you still disagree Raise DISPUTED on DRAFT because a late meter is expected — re-run instead
Quote counterparty volumes only when reconciling kWh Ask the other party to reveal their confidential tariff

Note. Raise dispute on the window strip runs this checklist for you: it captures identity and hash, compares figures, and pre-selects grounds (§11.5). Work the list by hand when answering a query; let the composer do it when you formally challenge the run.

Where this is taught. Statuses and the dispute room — §11. Pricing — §7. Ledger theory — §8. Physical / virtual worked months — §13 · §14. This agreement’s dispute list — §12.17.

12.16 Overview — the signed terms

Screen: ContractLive · #contract-overview · /org/deals/contracts/:ppa_id (the default; ?tab=overview is the same page).

Purpose. Before you argue with a rand amount, you need the menu the kitchen was told to cook from. Overview is that menu: who signed the PPA (power purchase agreement), and the terms settlement is allowed to use. Parties, capacity, the network path and the next run are already in the header (§12.2). This panel does not repeat them.

The panel is #contract-detail-inline.

Signatories

Each person who signed is one row.

What you read Meaning
Seller or Buyer Which side they signed for
Name, title, organisation, email Who they are
Date and time When they signed, in UTC (coordinated universal time)
Method How the signature was captured: platform consent (they clicked Sign here), external esign (an outside signing service), or qualified electronic (a qualified electronic signature)

Empty copy: No signatures recorded yet.

Terms — a physical agreement

A blank field is left off the page. An empty group is left off too. You only see what this agreement actually captured.

Commercial. Who is selling to whom (Deal type), how firmly the energy is promised (Delivery type: as generated, firm, capped, or baseload), the Contracted capacity in MW (megawatts), the year’s Allocated energy in MWh (megawatt-hours), the Term in years, the Start date, how often a window closes (Settlement frequency), whether someone must say in advance how much they will take (nomination), a Take-or-pay minimum (energy the buyer still pays for if they use less), and a Capped volume limit (a ceiling on how much the contract will price).

Pricing. The Tariff type, the Energy price in c/kWh (cents per kilowatt-hour), a Capacity charge in rand per MW per month, any Floor, Cap or Ceiling, and Escalation — how the price is allowed to rise, and the rate.

Metering. The generation meters and the consumption meters this window is allowed to read. Settlement does not invent a meter that is not listed here.

Options. Switches that are either Enabled or Disabled: RECs (renewable energy certificates), carbon, banking (carrying unused energy into a later window), and spill treatment (what happens to energy the buyer did not take).

Terms — a virtual agreement

A virtual agreement is a CfD (contract for difference): a hedge on a price, not a wire carrying wheeling energy. The header already says contract for difference. The groups are:

Group What it holds
Commercial Deal type, contracted capacity, term, start date, settlement frequency
Strike price (CfD) Structure (one flat rate, or peak / standard / off-peak), those rates in c/kWh, escalation, floor and cap
Platform & settlement The virtual-wheeling vendor, the vendor fee in c/kWh, and the buyer’s Eskom tariff category
Options RECs and carbon, each Enabled or Disabled

Where the terms were agreed. The wizard that captured them is V7 §4. How those prices become ledger lines is §7.

12.17 Disputes — this agreement’s challenges

Screen: the same ContractLive · #contract-disputes · /org/deals/contracts/:ppa_id?tab=disputes.

Purpose. A bilateral settlement dispute is one party saying “this window’s figures are wrong” and the other party answering, figure by figure. This tab is that argument’s filing cabinet for this agreement only. The question here is what has been challenged on this contract? The question at Deals → Disputes is what needs me, across every contract? The tab says so in its first line, and links there. The Deals tab badge counts disputes waiting on your move. This tab’s count is every dispute on this agreement, waiting or not.

You do not start a dispute here. You start it on a window that is Preliminary or Final, with Raise dispute (§11.5 · §12.15).

Empty state

#contract-disputes-empty: No disputes on this contract. The second line says a dispute is raised from a settlement’s detail page, on a run marked preliminary or finalised.

The list (#contract-disputes-list)

The agreement column is omitted, because every row is this agreement. The first column is the day it was raised instead.

Column What you read
Raised The day the dispute was opened. Your move when the next step is yours
Period The calendar month of the window under challenge
Role You raised or Against you
Status Where the argument is. See the stamps below
Grounds Why it was raised, as short chips. Hover a chip for the longer claim. The closed list is taught in §11.5
Items How many figures are already agreed, out of how many are on the table — 2/3 agreed
Clock Responds in N day(s), Response due today, Response overdue, or a dash when no response is due

The whole row opens the case in a drawer (#dispute-drawer) over this tab. The drawer is the same case the Deals room opens: the claim, the evidence as served, the figures, the resolution, and the messages. How to work that case is §11.9.

Stamp Plain meaning
Draft Started, not yet served on the other party
Served The other party has been told. The response clock is running
Negotiating You are trading figures
Agreed The figures are agreed. Sign-off may still be open
Resolved Closed, with a correction path
Withdrawn The person who raised it took it back
Lapsed The response window closed with no engagement
Deadlocked Both sides engaged and cannot agree
Escalated Sent to the forum the contract names
Closed (ruling) A ruling from outside has been recorded

Market Operator file disputes are a different room (V9 §8). Nothing on this tab opens one.

12.18 Termination — the notice clock

Screen: the same ContractLive · #contract-termination · /org/deals/contracts/:ppa_id?tab=termination.

Purpose. Ending a deal early is like ending a lease. You do not just stop paying. You serve a termination notice, the other party may fix the problem inside a cure window, and if the notice takes effect the last bill includes a leaving payment. This tab is that clock. It is not the market’s Termination Order, which ends a party’s right to trade (V9).

The panel is #termination-{contract id}.

When the contract captured no terms

The panel says No termination terms captured. There is nothing to serve. The wizard step that captures the events, the notice days and the cure days is V7 §4.10.

What the panel always shows when terms exist

One line: Notice: N days · Cure: N days. Notice days are how long after serving the notice takes effect. Cure days are how long the other party has to fix the problem.

The next line lists the events this agreement allows. You can only serve an event that is on that list. The words on screen are the contract’s own names, with the underscores turned into spaces:

On screen What it means
material breach A serious break of the agreement
insolvency A party cannot pay its debts
change of control Who owns a party has changed
eskom account default The Eskom supply account is in default
prolonged force majeure An outside event neither party caused has gone on past the contract’s trigger
regulatory change The law, or the tariff rules, have changed
failure to reach cod The plant did not reach its COD (commercial operation date) — the day it is accepted as running for this contract
persistent availability shortfall The plant keeps missing its promise to be available
convenience Ending early because a party chooses to, once the contract’s earliest year for that choice has passed

A notice that has been served

#notice-clock-{id} reads the stamp and the effective date: served · effective 01 Oct 2026. Under it, the leaving payment in rand, marked estimated, and the cure deadline when there is one.

A termination notice. Cure and withdraw are choices a person records while the notice is served. Effective is the daily job, once the date arrives.
Served →the effective date arrives Effective
While served Cured Withdrawn

The stamp on screen is the lowercase word: served, cured, withdrawn, or effective. A cured or withdrawn notice is no longer the live clock. An effective notice ends the agreement and queues a shortened final settlement.

Button Who sees it What it does
Withdraw notice (#withdraw-notice-{id}) The party who served it, while the stamp is served Takes the notice back. The clock stops
Record cure (#cure-notice-{id}) The other party, while the stamp is served, a cure deadline exists, and today is not past that deadline Records that the problem was fixed in time

Serving a notice

The form (#serve-notice-{id}) shows on an Active agreement when you are a party and no notice is currently served.

Field What you enter
Termination event One of the events on this agreement
Notice record The note that sits on the notice — why you are serving it

When the contract’s leaving payment is not a lost-margin estimate, the button is Serve notice today. Serving uses today’s date. The platform does not invent the payment: it stores the contract’s own estimate and marks it estimated.

When the leaving payment is a lost-margin estimate, you review before anything is served. A lost-margin estimate is the money the remaining term would have earned, pinned to a price you choose now so a later price move cannot rewrite the notice.

Field What you enter
Price reference to pin A complete forecast month, or the buyer’s retail tariff. If none is available, the amber line #termination-source-missing-{id} says so and Review estimate stays disabled
Reviewed remaining P50 energy (MWh) The remaining energy you accept. P50 is the middle forecast: as likely to come in high as to come in low
Reviewed remaining-term contract rate (c/kWh) The energy price you accept for that remaining term
Forecast source and assumptions In your own words, where the energy and the rate came from

Review estimate (#review-notice-{id}) shows the amount and the effective date and does not serve anything (#termination-review-{id}). Confirm reviewed estimate and serve notice (#confirm-notice-{id}) saves those assumptions and serves. If the contract or the reference changed between review and confirm, review again. A later price update does not rewrite a notice that has already been served.

A success flash says Termination record updated.

What settlement does after the notice is effective

The daily contract job terminates the agreement and queues one shortened final window. Energy stops at the effective date. That window carries the pinned leaving payment as equal-and-opposite termination payment lines (§7.8). Future windows are not eligible. Reversing and rerunning that same window replaces the payment. It does not add a second copy.

Where this is taught. Capturing the events, the days and the payment method — V7 §4.10. The ledger lines on the final window — §7.8.

13. Worked month — physical

What this example is going to show

This chapter walks one real settled day end-to-end — the same numbers you see on the period detail screen — so you can watch every stage of the settlement pipeline turn meters into a balanced ledger.

In plain words, you will see:

  1. Who traded with whom — a wind farm selling wheeled energy to a data centre under a fixed price.
  2. How much energy counted — the buyer only needed a slice of what the plant generated; the rest is “spill,” not billed on this PPA.
  3. Why delivered is smaller than matched — the wires lose some energy (here 6%); you bill on what arrives after that loss.
  4. How Rand are calculated — delivered kilowatt-hours × 85 c/kWh, split by peak / standard / off-peak.
  5. Why the books balance — every credit has a matching debit (seller energy ↔︎ buyer energy; network charges ↔︎ buyer payables).
  6. Why the two seats disagree on Net — the seller sees energy only; the buyer also pays network lines. That is normal, not a bug.

This is Example A — the Atlantis Midrand day from §2.1. The contract settles daily, so each Settlements row is a day, not a calendar month. Allocate is skipped (one buyer on the plant meter).

Data. full_demo · seed 42 · stages S04/S09 · sealed 2026-07-15 · re-derived 2026-07-18 via SettlementExplorer.detail/2 against PPPA-202607-138209764, period start 2026-07-09, status DRAFT, topology cross_municipal · M8 gate commit 925037a. Seat for the receivable view: IPP 2 (ipp_2@webill.net).

The five stages this chapter walks (Allocate skipped)
1Resolveread meters
→
2Matchoverlap + loss
→
3Price85 c × delivered
→
4Adjustspill rule
→
5LedgerΣ = 0

13.1 Contract inputs — the deal in plain words

Think of the PPA as a standing order: “When the wind farm generates and the data centre uses power in the same window, sell the overlap at a fixed price, after network losses.”

Thread deal Plain meaning
Agreement PPPA-202607-138209764 The contract reference on every screen
Parties IPP2 Atlantis Wind → OffTaker C Midrand DC Seller (wind) → buyer (load)
Shape AS_GENERATED Bill what was actually generated and matched — not a firm nominated volume
Price FIXED 85.0 c/kWh Same cents rate in every TOU band on this day
Frequency DAILY One settlement period = one calendar day
Gen meter MTR-NERSA-GEN-1002 How much the plant produced
Load meter MTR-OTS-thin_offtaker_c_private How much the buyer used
Loss factor 6.0000 % Wires tax on this path for this period
Who is on this deal
IPP2 Atlantis WindMTR-NERSA-GEN-1002
→PPPA-…138209764
OffTaker C Midrand DCMTR-OTS-…c_private

Where the deal was contracted. V7 §7.

13.2 Resolve → Match → Deliver (2026-07-09)

This section is stages 1 and 2 of the pipeline: read the meters, then find the overlap and apply losses.

Stage 1 — Resolve: read the two meters

Concept. Resolve means: for this closed day, pick the best available quantity series for supply and for demand. Here both meters were good, so the rail chose METERED on both sides — no nomination substitute, no provisional placeholder (§3).

Side Shop front Source that won Resolved quantity (day total) Plain meaning
Supply IPP2 Atlantis Wind Meter MTR-NERSA-GEN-1002 554,104.234 kWh The wind farm produced a lot that day
Demand OffTaker C Midrand DC Meter MTR-OTS-thin_offtaker_c_private 38,933.333 kWh The data centre used a much smaller amount
Resolve turns two meters into two series ready for Match
9 JulResolve
Generator site554,104.234kWh metered supply
rail→METERED
Supply seriesreadyfor Match
9 JulResolve
Off-taker site38,933.333kWh metered demand
rail→METERED
Demand seriesreadyfor Match

Allocate skipped. Only one PPA claims this plant meter in the window, so there is nothing to carve. (Shared-meter carving is Example B — §2.2 · §5.)

Stage 2 — Match: overlap, spill, loss, delivered

Concept. Match is the overlap between what was generated and what was consumed under this deal. You cannot sell more than the buyer used, and you cannot sell more than the plant produced. In a one-to-one deal:

matched = min(supply, demand)

Here demand is the smaller number, so matched = demand.

Quantity kWh Plain meaning
Supply (metered) 554,104.234 Everything the plant made
Demand (metered) 38,933.333 Everything the buyer used
Matched 38,933.333 The slice that counts on this PPA
Supply surplus (spill) 515,170.901 Generation left over — not billed here
Demand unmet 0 Buyer’s load was fully covered by match (residual grid is outside this PPA story)
flowchart LR
  S["Supply<br/>554104 kWh"] --> M["Matched<br/>38933 kWh"]
  D["Demand<br/>38933 kWh"] --> M
  S --> SP["Spill<br/>515171 kWh"]
  M --> L["Loss 6%<br/>2336 kWh"]
  M --> DEL["Delivered<br/>36597 kWh"]

Losses — the wires tax. Matched energy still has to travel. This period’s loss factor is 6%, so delivered (what you price) is 94% of matched:

Step Calculation Result
Loss 38,933.333 × 0.06 2,336.000 kWh
Delivered 38,933.333 × 0.94 36,597.333 kWh

Conservation checks (both must hold — §1.2):

Identity Numbers OK?
Supply split 554,104.234 = 38,933.333 matched + 515,170.901 spill ✓
Match split 38,933.333 = 36,597.333 delivered + 2,336.000 loss ✓
Formula matched × (1 − 0.06) = delivered → 38,933.3328 × 0.94 = 36,597.332832 ✓

TOU (time-of-use) bands. The day is also split into peak / standard / off-peak. Pricing uses delivered in each band (after the same 6%):

TOU Matched kWh Delivered kWh Plain meaning
Peak 9,333.333 8,773.333 Busy hours — still 94% of matched
Standard 20,533.333 19,301.333 Shoulder hours
Off-peak 9,066.667 8,522.667 Quiet hours
Total 38,933.333 36,597.333 Same totals as above

On the screen, Energy balance shows this story; the daily / TOU charts show the shape across hours (§12.9 · §12.13).

13.3 Price — seller energy receivable

Stage 3 — Price: cents become Rand

Concept. Price multiplies delivered energy by the contract rate. This deal is FIXED 85.0 c/kWh (R 0.85 per kWh) in every band — so the TOU split only changes how much energy sits in each row, not the rate.

TOU Delivered kWh × 85 c/kWh Amount (Rand) How to read it
Peak 8,773.333 × 0.85 R 7,457.33 Peak delivered × rate
Standard 19,301.333 × 0.85 R 16,406.13 Biggest band that day
Off-peak 8,522.667 × 0.85 R 7,244.27 Quiet-hours slice
Seller energy 36,597.333 R 31,107.73 Sum of the three lines

Check the headline: 36,597.332832 × 0.85 = R 31,107.732907. On the ledger that is 3,110,773 cents, posted as three energy lines for the IPP (one per TOU).

Price — delivered kWh × fixed 85 c
9 JulPrice
Delivered36,597.333kWh after 6% loss
rate×85 c
Seller energy+R 31,107.73IPP receivable

Stage 4 — Adjust: what happens to the spill

Concept. Adjust applies contract rules that are not the main energy price — here, what to do with the huge spill (515,170.901 kWh the plant made beyond this buyer’s match).

On an AS_GENERATED deal, that surplus follows the deal’s spill rule (forfeit / bank / credit — §7). Important: there is no firm shortfall line just because the buyer still drew other grid energy outside this PPA. This chapter’s money story is the matched path; spill handling is a separate rule, not “buyer owes for 515 MWh.”

13.4 Full ledger (Σ = 0)

Stage 5 — Ledger: every Rand has a partner

Concept. The ledger is a double-entry notebook. If the IPP is owed R 31,107.73 for energy, the buyer owes exactly that for energy. Network parties post charges the buyer pays. When you add every signed line on the period, the total must be R 0.00 (§8).

Party Category Amount Plain meaning
IPP2 Atlantis Wind energy (3 TOU lines) +R 31,107.73 Seller is owed for delivered energy
OffTaker C Midrand DC energy −R 31,107.73 Buyer pays that same energy
Municipality wheeling @ 11 c +R 4,025.71 City network earns wheeling
OffTaker C wheeling −R 4,025.71 Buyer pays wheeling
Eskom Transmission transmission @ 18 c +R 6,587.52 Tx network earns
OffTaker C transmission −R 6,587.52 Buyer pays Tx
Eskom Transmission ancillary @ 2 c +R 731.95 Ancillary service charge
OffTaker C ancillary −R 731.95 Buyer pays ancillary
Municipality distribution @ 13 c +R 4,757.65 Dx network earns
OffTaker C distribution −R 4,757.65 Buyer pays Dx
Σ 0 Books balance ✓
flowchart TB
  subgraph energyPair ["Energy pair — same Rand opposite signs"]
    IPP["+R 31107.73 IPP2 energy"]
    OT["-R 31107.73 OffTaker C energy"]
  end
  subgraph networkPairs ["Network pairs — buyer pays the wires"]
    N1["+ wheeling / Tx / Dx / ancillary"]
    N2["- same amounts on OffTaker C"]
  end
  energyPair --> SUM["Period sum = R 0.00"]
  networkPairs --> SUM

Why the two seats show different Nets

Seat Net on screen Why
IPP 2 (seller) +R 31,107.73 receivable Only energy hits the IPP on this deal’s billing responsibility
OffTaker C (buyer) −R 47,210.56 payable Energy plus all network lines above

That gap is intentional. Role filters show your lines; they do not invent a second calculation (§12.14).

13.5 What to open

Follow along. Seat: IPP 2. Path: Contracts → PPPA-202607-138209764 → Settlements → period 9 Jul 2026.

On screen Expect
Status chip DRAFT (soft — can still be re-run)
Energy balance Delivered ≈ 36,597 kWh, loss 6%, matched ≈ 38,933 kWh
Stat Net (seller) +R 31,107.73
Line-item ledger Three energy lines at 85 c/kWh
Audit Topology cross_municipal, Run at, content hash
Switch to OffTaker C Same energy payable + network debits; Net ≈ −R 47,210.56

Reading order on the page matches this chapter: Energy balance first, then line-item ledger, then Audit fingerprint (§12.6 · §12.15).

Where this sits in the thread. Market money for the same cast — V9 §12 · worked delivery day. This is thread part 6 — the physical PPA’s settled day. Sibling virtual CfD day → §14.

13.3b The evening upside spike

Use a 130 c/kWh contract, a 20 c margin, a 50% seller share and a 40 c/kWh share cap. At 18:00, 5,000 kWh with SMP 240 c yields a capped 40 c share, or R2,000. At 19:00, 4,800 kWh with SMP 185 c yields 17.5 c, or R840. The 4,500 off-peak kWh at 45 c contribute zero. The total is R2,840.00, even though substituting a 140 c peak-band average would produce zero. Scenario Lab’s evening-spike benchmark records these inputs beside its published price path; a site’s actual payment depends on its actual interval volume.

13.3c Crossing the monthly strike

Before the 24th at 14:00, carry 999,000 kWh toward a 1,000 MWh monthly strike. A 3,000 kWh interval splits into 1,000 within and 2,000 above. At 130 c contract price and 80 c market price, repricing the excess credits the buyer R1,000. The original R3,900 energy charge becomes R2,900, with the crossing interval retained as evidence.

14. Worked month — virtual CfD

What this example is going to show

This chapter walks one real settled virtual day — a contract for difference (CfD) hedge — so you can see how a virtual PPA makes money without wheeling electrons from seller to buyer on the network.

In plain words, you will see:

  1. What “virtual” means here — the buyer still takes power from the grid; the PPA is a price hedge on a matched quantity, not a physical delivery path.
  2. Why there are no network losses on the hedge leg — matched kWh = delivered kWh (loss_factor blank). You are not taxing wires for a wheeled path that does not exist on this contract.
  3. How the strike and WER fit together — the buyer pays the IPP at (strike − WER credit rate), and separately receives a WER credit from Eskom. Together that rebuilds the strike economics, with categories split so statements stay clear.
  4. How a tiny matched volume still settles cleanly — only 463.696 kWh matched that day; the ledger still sums to zero.
  5. Why seller Net ≠ buyer Net — the seller sees energy receivable; the buyer also pays a small vendor admin fee and receives the WER credit.
  6. What the screen looks like — Virtual pill on, no daily wheeled-energy profile, same Audit fingerprint habit as physical.

This is the thread’s direct virtual PPA: IPP3 Midrand Hybrid → George Eskom Plant, period 3 Jul 2026. Settlement is DAILY here too.

Data. full_demo · seed 42 · stages S04/S09 · sealed 2026-07-15 · re-derived 2026-07-18 via SettlementExplorer.detail/2 against VPPA-202607-138349269, period start 2026-07-03, status DRAFT, topology eskom_vwa · M8 gate commit 925037a. Seller seat: IPP 3. Buyer seat: the George off-taker org.

flowchart TB
  GRID["Physical world<br/>George still draws grid electricity"]
  MATCH["Virtual hedge<br/>Match supply shape vs demand shape"]
  CFD["Cash settle<br/>strike vs WER reference"]
  GRID -.-> MATCH
  MATCH --> CFD
Same five stages as physical — losses skipped on the hedge leg
1Resolveread shapes
→
2Match463.7 kWh
→
3Pricestrike − WER
→
4Adjustadmin fee
→
5LedgerΣ = 0

Concept home. Physical vs virtual — V0 §5. How a virtual PPA makes money — V7 §9.

14.1 Contract inputs — the hedge in plain words

Think of the VPPA as: “We agree a strike price. For every matched kilowatt-hour, settle the difference against the wheeled-energy refund (WER) reference, and pay a small vendor fee.” Electrons for George still come from the grid; the contract moves money, not a wheeled parcel.

Thread virtual deal Plain meaning
Agreement VPPA-202607-138349269 Contract reference on every screen
Deal type OFFTAKER_IPP Direct IPP → off-taker virtual
Parties IPP3 Midrand Hybrid → George Eskom Plant Seller (hybrid plant) → buyer (George load)
Strike FLAT 92.0 c/kWh Agreed hedge price (CPI on the term; not stepped on this day)
VWP vendor fee 1.2500 c/kWh Admin fee on matched volume (buyer → vendor)
Frequency DAILY One period = one calendar day
Losses none on hedge leg Delivered = matched
Who is on this virtual deal
IPP3 Midrand Hybridsupply shape
→VPPA-…138349269
George Eskom Plantdemand shape

Where the virtual deal was contracted. V7 §8.

14.2 Resolve → Match (no losses)

Stage 1 — Resolve: read the two shapes

Concept. Same as physical: pick the quantity series for supply and demand for the closed day. Here the engine uses the IPP3 metered share and George’s metered demand. (If demand were meterless, a nomination rail could supply the series — §3.)

Side Resolved quantity Plain meaning
Supply (IPP3 metered share) 463.696 kWh Only a small slice of plant output is attributed to this claim that day
Demand (George metered) 14,599.999 kWh George used far more — most of it stays on the ordinary grid bill

Stage 2 — Match: overlap only (delivered = matched)

Concept. Match is still the overlap: you hedge the lesser of the two shapes. Supply is binding here, so matched equals the IPP3 share.

matched = min(463.696, 14,599.999) = 463.696 kWh

Because this is virtual, there is no wires loss on the hedge:

delivered = matched = 463.696 kWh

Quantity kWh Plain meaning
Supply (IPP3 share) 463.696 Hedge available to this VPPA claim
Demand (George) 14,599.999 Buyer’s full meter
Matched = delivered 463.696 Hedge quantity for the day
Surplus vs this claim large Unsold gen relative to this small claim
Unmet demand on this claim 0 George’s residual load is simply not on this hedge
flowchart LR
  S["Supply share<br/>463.7 kWh"] --> M["Matched =<br/>Delivered<br/>463.7 kWh"]
  D["Demand<br/>14600 kWh"] --> M
  D --> G["Residual grid<br/>not on this VPPA"]

TOU matched (what Price will use):

TOU Matched kWh Plain meaning
Peak 90.347 Busy-hours hedge slice
Standard 373.349 Most of the day’s match
Off-peak 0 Nothing matched off-peak this day
Total 463.696

14.3 WER-netted cash — what the ledger posts

Stage 3 — Price: strike, WER, and the split categories

Concept. A WER (wheeled energy refund) is a credit rate the buyer gets from Eskom on qualifying wheeled / virtual attribution. The platform does not post a single opaque “CfD cheque.” It posts:

  1. energy — buyer pays IPP at (strike − WER credit rate) per TOU
  2. wer_credit — Eskom credits the buyer at the WER rate per TOU

So economically the buyer still feels the strike, but statements show the energy leg and the Eskom credit separately (same WER-netted CfD shape as V0 §5).

Strike check (cents):

TOU Strike WER credit rate Energy rate posted Check
Peak 92.0 25.0 67.0 92 − 25 = 67 ✓
Standard 92.0 15.0 77.0 92 − 15 = 77 ✓

Cash by band:

TOU Qty kWh Energy rate Energy (buyer → IPP) WER rate WER (Eskom → buyer)
Peak 90.347 67.00 c R 60.53 25.00 c R 22.59
Standard 373.349 77.00 c R 287.48 15.00 c R 56.00
Total 463.696 R 348.01 R 78.59

Work a line by hand (peak energy):

90.347 × 0.67 ≈ R 60.53

Virtual price — strike split into energy + WER credit
3 JulPrice
Matched463.696kWh (= delivered)
strike92 csplit
Energy to IPPstrike − WERR 348.01
WER+credit
WER to buyerfrom EskomR 78.59

Stage 4 — Adjust: vendor admin fee

Concept. The VWP vendor fee is a small per-kWh admin on the matched volume — not part of the strike itself:

463.696 × 1.25 c = R 5.80 (VWP Vendor ← buyer)

14.4 Ledger (Σ = 0)

Stage 5 — Ledger: hedge lines that still balance

Concept. Same double-entry rule as physical: every credit has a debit. Virtual just changes which parties and categories appear — no municipal wheeling / Tx / Dx stack for a wheeled path on this leg.

Party Category Amount Plain meaning
IPP3 Midrand Hybrid energy +R 348.01 Seller receivable at (strike − WER)
George Eskom Plant energy −R 348.01 Buyer pays that energy leg
George Eskom Plant wer_credit +R 78.59 Buyer receives Eskom WER credit
Eskom wer_credit −R 78.59 Eskom funds that credit
VWP Vendor admin +R 5.80 Vendor earns admin fee
George Eskom Plant admin −R 5.80 Buyer pays admin
Σ 0 Books balance ✓
flowchart TB
  subgraph energyLeg ["Energy leg"]
    IPP["+R 348.01 IPP3"]
    G1["-R 348.01 George"]
  end
  subgraph werLeg ["WER credit"]
    G2["+R 78.59 George"]
    ESK["-R 78.59 Eskom"]
  end
  subgraph adminLeg ["Admin fee"]
    V["+R 5.80 Vendor"]
    G3["-R 5.80 George"]
  end
  energyLeg --> SUM["Period sum = R 0.00"]
  werLeg --> SUM
  adminLeg --> SUM

Screen nets — why they differ

Seat Net on ContractSettlementLive How to read it
IPP 3 (seller) +R 348.01 receivable Only the energy leg (34,801 cents)
George (buyer) −R 275.22 Payables R 353.81 (energy + admin) minus WER credit R 78.59

Buyer arithmetic check:

348.01 + 5.80 − 78.59 = 275.22 ✓

14.5 Variants you will also see in the demo

Not every virtual day looks exactly like IPP3 → George. In the same demo dataset you will also meet:

Variant Seeded example What changes in plain words
Trader → Off-taker virtual VPPA-202607-138471092 (T1 → George, 2026-07-03) Larger matched volume (~14,600 kWh); seller party is trader_seller; richer WER TOU set
No WER / wholesale trader buy-legs without an Eskom account Pure CfD cash — no Eskom wer_credit party on the ledger
Nomination-based resolve meterless demand Resolve uses the nomination rail instead of a load meter (§3)

14.6 What to open on the screen

Follow along. Seat: IPP 3. Path: Contracts → VPPA-202607-138349269 → Settlements → 3 Jul 2026.

On screen Expect
Virtual pill On — reminds you this is a hedge day
Daily wheeled profile Absent (no physical path chart)
Matched / delivered ≈ 464 kWh and equal to each other
Seller Net +R 348.01
Ledger Energy (+/− R 348.01), and on George’s seat WER + admin
Audit Topology eskom_vwa, Run at, content hash
Switch to George Energy payable, wer_credit, admin; Net −R 275.22

When someone queries the day, quote matched hedge quantity, strike / WER-split category, the Virtual pill, Run at and content hash — not a physical loss percentage (§12.15).

Where this sits in the thread. Previous → §13 · physical settled day and V7 §8. End of the narrative thread (V1→V3→V5→V4→V7→V6) for the cast’s kWh and rand. The billing documents for a virtual month — CfD, vendor fee, WER as a reference — are V15 §15.

14.7 An 800 MWh CfD strike

For 950 MWh matched volume, a chronological 800 MWh strike leaves 250 MWh peak, 400 MWh standard and 150 MWh off-peak inside the strike. At 135 c strike and 95 c credit, the CfD is R320,000, rather than R380,000 on the full volume. WER still uses all 950 MWh and remains R902,500. The cap changes the contractual hedge payment, not the underlying matched-energy refund.