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:
- How much energy counted under each deal?
- At what price?
- Which network charges or credits apply?
- Who owes whom — and can we prove the books balance?
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:
- quantities (matched / delivered / spill / shortfall),
- money lines (energy, wheeling, WER, fees, adjustments),
- a double-entry ledger that sums to zero, and
- 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).
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) |
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:
- Read the plant meter (supply) and the site meter (demand).
- Match = the smaller of the two.
- Apply losses → delivered at the buyer (physical).
- 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).
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.
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 |
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:
- Mall site has PPA-1 from Plant X (direct),
- PPA-2 from Trader Pool T1 (portfolio supply),
- and still buys residual grid energy outside both deals.
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.
Trader Pool in the middle. A pool is often both many-to-one and many-to-many at once:
- Buy side: many Generator Sites (and maybe other traders) sell into the pool — each buy-leg settles like any seller→trader PPA.
- Sell side: the pool sells out to many Off-taker Sites (and maybe other traders) — each sell-leg settles like any trader→buyer PPA.
- Trader P&L is then “what I collected on sell-legs minus what I paid on buy-legs minus costs I bear” (§10). That margin is a commercial roll-up; it is not a second magical settlement that rewrites the legs.
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:
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) |
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:
- reads supply and demand for that slice,
- matches (after any shared-meter carve — below and §5),
- 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.
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.
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.
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.
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:
- The engine groups those PPAs into one allocation set for the window.
- Allocate runs once → each contract receives only its carve.
- Each contract still gets its own settlement period row (quantities, money, statement for that seat).
- 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.
Why matching matters
- 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.
- Physical losses apply to matched energy, not to the
whole plant meter (§4). Delivered at the
buyer is typically
matched × (1 − loss factor). - 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.
- 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:
- Seller story. Spill is unsold (for this contract). The deal’s spill rule then decides what happens commercially — forfeit, Eskom buyback, bank for later, or a discounted spill credit (§7).
- Buyer story. Spill is usually not your problem on an as-generated deal — you were not obliged to take it.
- Book / strategy story. High spill means the shapes do not fit; strategy and procurement care about that (V3), and settlement shows the realised residue for the closed period.
- Conservation story. Spill must appear in the energy balance so the plant meter still adds up.
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:
- It turns a volume miss into money (penalty, replacement, LD) — or an excused miss with no cash hit.
- It is how a buyer proves “you promised firm cover and I did not get it.”
- Settlement never invents a shortfall on a purely as-generated deal just because the buyer still drew grid energy.
Conservation — nothing invented, nothing lost in the books
Conservation means the arithmetic closes:
- Energy (this contract, this interval /
period).
supply = matched + spill
and, when a firm promise applies,
firm obligation = matched + shortfall(after excuses). - Shared meter (many contracts).
Σ carves = plant meterbefore each contract matches (§5–§6). - 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.”
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):
- Supply:
41,418.44 = 38,933.333 matched + 2,485.107 spill✓
- Matched path:
38,933.333 = 36,597.333 delivered + 2,336.000 loss✓
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.
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).
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· statusDRAFT· topologycross_municipal· re-derived viaSettlementExplorer.detail/2(same read model asContractSettlementLive). 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) |
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 |
(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.
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 |
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 ✓ |
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 ✓).
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 |
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 |
- Resolve — supply 500, demand 420.
- Match —
matched = min(500, 420) = 420kWh; spill = 80 kWh;delivered = 420 × 0.95 = 399kWh. - Price —
399 × 142.5 c = R 568.575energy (buyer → seller). - Adjust — spill 80 kWh follows the deal’s spill rule (forfeit / bank / credit — §7); no shortfall on an as-generated deal.
- Ledger — seller
+R 568.575energy · buyer−R 568.575energy (+ any network / WER lines for the interval). Energy legs net to zero; network legs net Eskom / municipality against the bearing party.
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:
- Find every linked meter, nomination and contracted profile that could speak for supply or demand in this closed window.
- Pick the highest-priority usable source per side, per interval (the resolution rail below).
- 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.
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· statusDRAFT· topologycross_municipal· re-derived viaSettlementExplorer.detail/2(same read model asContractSettlementLive). 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 |
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 ✓.
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% |
38,000
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.
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 ✓ |
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 ✓).
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 |
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:
- Find the agreement (e.g.
PPPA-202607-138209764). - Choose Settlements on that row — the Settlements list opens (“Monthly settlement summary”).
- 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 withcalculated_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
*_valuerates, and a pack-levelbinding_mode(FIXEDorPUBLISHED) onuos_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.PUBLISHEDre-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 bindMunicipalWheelingConfig(embedded vs separate losses, explicit UoS, WEPS-less-losses). A period stores bothloss_factor_pctand a richerloss_resolutionaudit 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:
- Loss factors (TLF / DLF / MLF) change kWh — they shrink matched energy into delivered.
- UoS charges (TUoS / ETUoS / DUoS / MDUoS) change rands — they post network fee lines. They do not reduce delivered kWh in Match.
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. |
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
- Read each active loss value (stored as a fraction,
e.g.
0.0200= 2%):- if
dlf == trueanddlf_valueset → contributedlf_value × 100percent - if
tlf == trueandtlf_valueset → contributetlf_value × 100percent - if
mlf == trueandmlf_valueset → contributemlf_value × 100percent
- if
- Sum those percents →
loss_factor_pct(snapshotted on theSettlementPeriod). - 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.
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)
| 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).
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.
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
- Open Settlement detail
(
/org/deals/contracts/:ppa_id/settlements/:period_id— §3.6). - Energy balance — matched, delivered, loss %, surplus, unmet.
- Confirm
matched = delivered + losses(physical) ordelivered = matched(virtual). - Seller→Buyer card — topology chips tell you why TLF / DLF / MLF were in play.
- 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 flatNetworkRatec/kWh layers. Check the period’sloss_resolutionsnapshot on Settlement detail when auditing.
4.2 Use-of-system and WER lines
On both-Eskom topologies the ledger typically posts:
- Transmission / ancillary (UoS) — unit rates × delivered kWh, borne by the party the deal’s billing responsibility names (V5 §3).
- WER — a credit on the buyer’s Eskom side for wheeled energy, TOU-banded and varying by the buyer’s Eskom tariff category (Megaflex carries the highest Gen-Wheeling rates; Nightsave Urban/Rural have no peak band). The credit is not a single rate for every buyer — using the wrong category overstates the saving.
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).
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.
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):
- Resolve the shared meter once — one generation series or one consumption series for the closed window.
- Resolve each member’s other side — each buyer’s demand, or each seller’s supply / nomination.
- Allocate — apply the method; write a carve per member; prove conservation.
- Match per member —
min(carve, other side)(then losses on physical delivered energy). - 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?
| # | 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
| 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 ✓ |
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
- Resolve
GEN-1once (same 282,000 kWh month as A1). - Allocate by weight: peak
84,000 × 0.60 = 50,400to X ·33,600to Y; standard118,800/79,200. Totals: X 169,200 · Y 112,800 · Σ 282,000 ✓. - Resolve nominations (example): X 180,000 · Y 123,000 — both above their carve.
- Match:
matched = allocated(nomination shortfall is the trader’s downstream problem). Delivered (−5%): X 160,740 · Y 107,160. - Price / ledger on each carve; no WER on a trader demand side for this teaching topology.
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
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 ✓ |
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.
Step-by-step (one teaching interval)
| Input | Value |
|---|---|
| Generation | 100 kWh |
| Physical offtaker demand | 80 kWh |
| Virtual offtaker demand | 80 kWh |
- Resolve generation once → 100.
- Allocate pro-rata to claim demand (80 : 80) → physical carve 50 · virtual carve 50.
- Match physical against its carve:
min(50, 80) = 50(then apply losses → delivered). - Match virtual against its carve:
min(50, 80) = 50(CfD on that quantity — no wheeled delivery). - Invariant:
50 + 50 = 100 ≤ 100✓. - Ledger: each period still nets to zero on its own deal; the claim set is what keeps the plant honest across deal types.
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 ✓ |
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.
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 ✓
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 |
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:
- PRIORITY — the VIP rope. Named guests are seated first, up to their hunger. A VIP who needs 30 takes 30 seats. 70 seats remain.
- 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.
- 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.
- 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.
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:
- Receives your allocated series (your 52.5) instead of the raw 100 meter.
- Runs ordinary Match → Price → Adjust → Ledger on that carve.
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:
- Which set am I in? Supply, demand, claim, hierarchy, or portfolio (§5.4).
- What was the shared meter / source total for the interval or band?
- What method or tier rules cut the pie?
- What was my carve vs sister members? Do they sum to the meter?
- Only then Match:
min(carve, my other side)and delivered after losses. - Money last — Price / Adjust / Ledger cannot repair a wrong carve.
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.
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 |
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.
| 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 ✓ |
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, likePRO_RATA_DEMANDon 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 |
- VIP A takes
min(30, 100) = 30. RemainderR₂ = 70. - Fair queue is short:
70 < 100, scale70/100 = 0.70. - B:
70 × 25/100 = 17.5. C:70 × 75/100 = 52.5. - Remainder after fair queue:
0. FIXED and surplus see nothing this hour.
Conservation: 30 + 17.5 + 52.5 + 0 surplus = 100 ✓.
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.
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.
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.)
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 |
- PRIORITY: A = 20 ·
R₂ = 110 - PRO_RATA: TD = 60 · sufficiency (
110 ≥ 60) → B = 30, C = 30 ·R₃ = 50 - 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.)
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:
- Allocations (IPP) — why the seating plan gave you 52.5 (or 0).
- 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 |
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:
- Pricing — what does that energy cost under the tariff you signed?
- 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.
What pricing is (in plain words)
Pricing is the cash register for energy the deal did cover.
- For a physical PPA, the quantity is usually delivered kWh (matched energy after the loss factor — §4).
- For a virtual PPA, the quantity is the wheeled / matched hedge shape; the “price” is the strike, and the CfD vs WER split is finished in the ledger (§14).
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.)
| 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 ✓
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.
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.
Engine note. The pricer always can apply multipliers;
TOU_LINKEDis 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.
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 |
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).
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.
Note. Deal-room
CAPPEDvolume 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.
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.
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 |
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.
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:
- Resolve / escalate base
- × TOU multipliers
- Clamp floor / cap / ceiling
- × delivered kWh → energy money
- 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 |
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:
- Trader pool draw — leftover supply from the named
pool is matched as an
:ALLOCATIONwithapplied_rules: [:top_up_draw]. Uncovered remainder stays:SHORTFALL, priced as today. - Eskom retail — the
:SHORTFALLvaluation is unchanged. After the run persists, settlement posts a:replacement_energypair on the subject’s period for that month, at the term’s fixed rate oreskom_topup_ckwh, carryingtop_up_term_id. - Market order — the shortfall is scored by
IdmDecision.decide/2with the same context shape the IDM cycle already builds. A:redeclarejoins that cycle’s action list (top_up_term_idon the action, visible on the lodgement note). A:carryis 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:
- Capacity / ToP / caps → bound matched energy; ToP can create payment without consumption.
- Tariff & escalation → §7.1.
- Spill & banking → §7.2.
- Shortfall & delivery → §7.2.
- Trader margin / source terms → chain P&L in §10.
- Virtual strike / WER → §14.
- Virtual floating leg (Eskom credit vs published SMP) → §7.4.
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
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.
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.”
Proves conservation of cash the same way Allocate proved conservation of energy (§5): across the whole period,
Σ (all signed line amounts) = 0That is the sum-to-zero rule. Money is rearranged among parties; it is not created or destroyed inside the settlement.
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.
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 |
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.
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.
| 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:
| 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.
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 Σ |
| 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.
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:
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.
Energy payment uses the unconstrained schedule volume (the economic stack ignoring network limits):
energy payment = scheduled_MWh × SMPIf the SO later cuts you back, that is a different line (Pot 2), not a quietly smaller energy payment.
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.
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.
8.5.5 What “three pots” means
A pot is a separate money bucket with:
- its own kinds of lines,
- its own counterparty (who you settle with),
- its own rule for whether the bucket must sum to zero.
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.”
| 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
- Clear the hour → SMP (e.g. R 900/MWh).
- Read each unit’s unconstrained scheduled volume.
- Sellers:
+ scheduled_MWh × SMP(receivable). - Buyers:
− scheduled_MWh × SMP(payable). - 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 ✓ |
| 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
- Keep Pot 1 energy on unconstrained volume × SMP.
- Measure the MWh the SO removed (or added).
- Price that difference on your submitted offer for those MWh.
- Book the result in Pot 2 against the System Operator.
- 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.
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
- MO applies the published fee schedule to your activity / registration.
- Lines appear as amounts you owe the MO (or rare credits per rules).
- Counterparty is always the Market Operator, not other traders and not the SO.
- Pot 3 does not have to Σ = 0 across participants — it is a fee bucket, like paying the auction house.
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 |
| 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.
| 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:
- Buy leg — trader buys from an IPP (PPA 1).
- Sell leg — trader sells to an off-taker (PPA 2).
- 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.
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:
- Generator point:
+42 + (−42) = 0✓
- Off-taker point:
−38 + 38 = 0✓
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.
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 |
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? |
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 |
| 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 |
- 1Period identifies the versioned settlement window.
- 2Energy is the delivered volume, not the buyer’s tariff.
- 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
- 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.
- Capture the audit facts in the drawer (agreement, window, status, calculated at, statement number and version, content hash).
- 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).
- 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 ↗ |
- 1Verdict is month health as recomputed now.
-
2Bridge turns
balanced: falseinto a named residual. - 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
:FXhint — 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.
WB.Wheeling.Settlement.Enums.SettlementStatus.
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 booleanprovisionalwhen 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 → PRELIMINARYon statement cadence, andPRELIMINARY → FINALafter 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.
- 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. - 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.
- 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:
prepare_period!finds any non-REVERSEDperiod for that key.supersede!onDRAFT/PRELIMINARYflips them toREVERSED(child rows — line items, adjustments, intervals — are kept).- A new period is created (again as DRAFT) and the five stages run fresh.
- 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.
FINAL/DISPUTEDpriors 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):
- The delivered kWh on the bill does not match what your meter (or agreed nomination rules) show for that window.
- Loss factor / topology used in the run is not the one the contract said should apply.
- A TOU band or price looks wrong (peak charged as standard, wrong cents).
- An adjustment (banking, shortfall cure, curtailment makeup) appears that you do not recognise.
- You received a statement that cites a
content_hash/calculated_atyou never agreed, and the numbers hurt.
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:
- Stop treating the period as quietly revisable. Cron will not reverse it the way it reverses DRAFT.
- Keep the evidence. Line items, intervals, and
content_hashstay — that hash is exactly so both sides can say “we are arguing about this calculation.” - 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
Adjustmentof typedispute_correction/re_settlement/prior_period_revisionon a later period) → issue a new period / statement version. - 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).
- 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:
Agree that the locked (or disputed) numbers are wrong — every disputed figure approved by both sides (§11.9).
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_correctionadjustment and its paired ledger lines post on a later period, citing this oneThe disputed period keeps its FINAL stamp 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.
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.
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:
- Old period → REVERSED (auto, because it was soft).
- New period → DRAFT with matched/delivered
recalculated (
38,933.333 × 0.94 = 36,597.333 kWhdelivered at 6% loss).
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
- July is FINAL. The statement cites hash
abc…. - 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.
- The period is stamped DISPUTED and the seller is notified. Cron cannot silently rewrite it, and the evidence is frozen as served.
- 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.
- 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:
- a figure you proposed says awaiting counterparty — you may revise it, not approve it;
- a figure they proposed offers Approve and Counter;
- countering is just entering your own number and saving, which hands the turn back;
- an agreed figure is locked for both sides.
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:
- 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.
- 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.
- 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).
- Stay on Settlements
(
#contract-tab-settlementsis current). - In Settled windows
(
#settlements-list), find the month and the row you want (#settlement-period-{period_id}). - Click anywhere on that row (or the
View tip). The click runs
open_settlementand navigates to/org/deals/contracts/:ppa_id/settlements/:period_id. - 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.
- 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
- Signs are already framed for your org (
+receivable /−payable). - Own lines only — never the counterparty’s money rows.
- 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_snapshotkeys. 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:
- Which calculation are we talking about? (agreement + day + version)
- Is the energy story consistent? (kWh in → kWh out after loss)
- 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.
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:
- Who traded with whom — a wind farm selling wheeled energy to a data centre under a fixed price.
- How much energy counted — the buyer only needed a slice of what the plant generated; the rest is “spill,” not billed on this PPA.
- Why delivered is smaller than matched — the wires lose some energy (here 6%); you bill on what arrives after that loss.
- How Rand are calculated — delivered kilowatt-hours × 85 c/kWh, split by peak / standard / off-peak.
- Why the books balance — every credit has a matching debit (seller energy ↔︎ buyer energy; network charges ↔︎ buyer payables).
- 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/2againstPPPA-202607-138209764, period start 2026-07-09, statusDRAFT, topologycross_municipal· M8 gate commit925037a. Seat for the receivable view: IPP 2 (ipp_2@webill.net).
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 |
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 |
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).
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:
- 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.
- Why there are no network losses on the hedge leg —
matched kWh = delivered kWh (
loss_factorblank). You are not taxing wires for a wheeled path that does not exist on this contract. - 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. - How a tiny matched volume still settles cleanly — only 463.696 kWh matched that day; the ledger still sums to zero.
- Why seller Net ≠ buyer Net — the seller sees energy receivable; the buyer also pays a small vendor admin fee and receives the WER credit.
- 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/2againstVPPA-202607-138349269, period start 2026-07-03, statusDRAFT, topologyeskom_vwa· M8 gate commit925037a. 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
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 |
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:
energy— buyer pays IPP at(strike − WER credit rate)per TOUwer_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
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.
