1. SAWEM primer — why the market seat exists
Your book still has leftovers and gaps. Strategy minimises them (better contracts, batteries, nominations — V3). This volume is the second option: trade them on the South African Wholesale Electricity Market (SAWEM).
Before you open a Bid Desk or clear a day, you need four ideas in plain words: what SAWEM is, who a Balance Responsible Party (BRP) is, what the Market Operator does, and what the System Operator does. The rest of V7 is detail on top of those four. The organisation screens — Market, Bid Desk, After Delivery (Market Month), Accounts, Billing — are V10.
1.1 What SAWEM is
SAWEM is South Africa’s organised wholesale market for electricity — a shared marketplace where generators, loads, traders and storage can buy and sell energy for specific hours, under published rules, at a price the market itself discovers.
Think of it as a produce market that opens one day ahead, not a private handshake between two farms. You do not phone a counterparty and agree a price for tomorrow’s lunchtime megawatt-hours. You submit a blind bid or offer into a common auction. The market stacks cheap supply against demand, finds the last megawatt-hour needed, and that last unit sets one System Marginal Price (SMP) for the hour. Everyone who cleared that hour trades at that same price.
Before SAWEM — leftovers go to one private counterparty, or sit idle:
%%{init: {"themeVariables": {"fontSize": "20px"}, "flowchart": {"nodeSpacing": 40, "rankSpacing": 48, "padding": 20}}}%%
flowchart TB
A["Your leftover MWh"] -->|"private deal or leave idle"| B["One counterparty"]
On SAWEM — many parties meet in one blind auction; one SMP clears the hour:
%%{init: {"themeVariables": {"fontSize": "20px"}, "flowchart": {"nodeSpacing": 40, "rankSpacing": 48, "padding": 20}}}%%
flowchart TB
C["Many sellers"] --> D["Blind auction"]
E["Many buyers"] --> D
D --> F["One SMP per hour"]
F --> G["Schedules for everyone who cleared"]
What “wholesale” means here. This is not the retail bill on a home meter. It is the bulk market between professional participants — megawatt-hours per trading period, settled through the Market Operator’s books. Your bilateral PPA with an off-taker still exists (V8); SAWEM is the place for the residuals strategy could not place under contract, and for participants whose business is trading those residuals.
Two markets, one delivery day. SAWEM runs a day-ahead market (DAM) — plan tomorrow — and an intraday market (IDM) — correct the plan as forecasts drift. After delivery, meters and instructions decide whether you over- or under-delivered. That gap is imbalance, and it is priced to make optimistic forecasts expensive.
| Piece | Everyday meaning |
|---|---|
| Trading day / delivery day | The calendar day the energy is actually produced or consumed |
| Trading period | Usually one hour — the market’s atomic slice of time |
| Blind bid / offer | You state how much you will buy or sell and at what limit price; others do not see your ladder before clearing |
| Clearing | The Market Operator’s auction that accepts some volume and rejects the rest |
| SMP | The single clearing price for that hour — what accepted buyers pay and accepted sellers receive for energy |
| Schedule | The accepted megawatt-hours you are committed to for that hour |
| Imbalance | What your meters (and instructions) say you did, minus what you were scheduled (or instructed) to do |
The farmer’s-market metaphor. Each morning before the stalls open, every farmer writes a sealed note: “I can sell up to 10 crates at R 40, and another 5 at R 55.” Buyers write sealed notes: “I will buy up to 8 crates if the price is at most R 70.” The market master opens every note, fills demand from cheapest supply upward, and announces: “Today’s crate price is R 52.” Every accepted crate trades at R 52 — not at the R 40 the cheap farmer wrote. The note only got them into the market; the clearing price pays (or charges) them.
That is uniform-price clearing. Your ladder is a reservation — how far you are willing to go — not the invoice price.
1.2 The three seats you must not confuse
SAWEM has many participants, but three roles sit at the centre of every screen in this volume. Confusing them is the fastest way to misread a statement.
| Role | Plain job | Metaphor | What they do not do |
|---|---|---|---|
| BRP | The organisation financially accountable for a set of meters balancing to a schedule | The merchant who booked the stall and pays for any shortfall | They do not run the auction, and they do not keep the national grid in balance |
| Market Operator (MO) | Runs registration, rules, auctions, schedules, prices and market settlement | The market master and the clearing bank | They do not tell a plant to ramp up for frequency; they do not own your bilateral PPA |
| System Operator (SO) | Keeps the physical system secure — zones, constraints, dispatch, reserve | Air-traffic control for the wires | They do not set the day-ahead energy price; they do not invoice your PPA |
flowchart LR
BRP["BRP<br/>your seat"] -->|"bids offers"| MO["Market Operator<br/>auction money rules"]
MO -->|"schedules prices"| BRP
SO["System Operator<br/>grid safety"] -->|"instructions constraints"| BRP
SO -->|"network limits"| MO
Airport metaphor (keep this one). The BRP is the airline that sold the ticket and must deliver the passengers. The Market Operator is the airport authority that allocates slots and settles landing fees. The System Operator is air-traffic control — it can divert a flight for weather even after the slot was sold, and someone pays for that diversion under different rules than the ticket price.
Where the consoles live. MO seat: V11 §12. SO seat: V12 (§1 who · §4 Dispatch Desk · §5 Network Model · §6 Registry). BRP screens fill §§3–6 and §8–§9.
1.3 What a BRP is
A Balance Responsible Party is the registered organisation that owns the financial outcome of the gap between what the market scheduled (and what the System Operator instructed) and what the meters recorded.
In everyday language: if your portfolio was supposed to inject 100 MWh in an hour and the meters show 92 MWh, someone must buy the missing 8 MWh from the balancing arrangements — or pay the imbalance price for it. That someone is the BRP. The word balance is literal: you are responsible for making planned and actual energy line up, or for paying when they do not.
What “responsible” covers.
- You hold one BRP registration per organisation (a
market identity such as
BRP-T1-DEMO). - That registration can cover one or many Trading Units — your own plants and loads, or units you balance as a service for others.
- You submit (or let the platform submit) bids and offers for the hours where those units are long or short.
- After delivery you receive market charges and credits — energy at the SMP, ancillary lines from System Operator decisions, Market Operator fees, and imbalance.
- You post credit cover so the market can collect if you fail to pay.
What a BRP is not.
- Not every site automatically. A plant without a registered Trading Unit still wheels and settles PPAs; it simply has no SAWEM seat (§3).
- Not the same as “the trader user.” A seat login acts for the BRP; the registration is the legal market party.
- Not the System Operator. Following an SO instruction can excuse or reprice a deviation; it does not make the SO your BRP.
Long and short in one sentence. When strategy leaves you with surplus generation in an hour, you are long — you can offer that energy into SAWEM. When strategy leaves unmet demand, you are short — you can bid to buy. Hours that net to zero produce no bid. The full kitchen picture is in §1.7.
Where registration is taught. §3 — codes, Trading Units, standing data, credit cover, and the ACTIVE gate.
1.4 How a BRP trades on SAWEM
Trading is a loop with gates. Miss a gate and that door stays shut; the next door may still open.
flowchart LR
R["1 Register<br/>as BRP"] --> A["2 Register Trading Units<br/>standing data"]
A --> B["3 Build ladder<br/>from strategy run"]
B --> C["4 Submit before<br/>DAM gate"]
C --> S["5 Receive schedule<br/>and SMP"]
S --> I["6 Correct in IDM<br/>if drift"]
I --> D["7 Deliver<br/>follow SO if told"]
D --> M["8 Imbalance<br/>and settlement"]
Step 1 — Join. You apply for a BRP registration, execute the market agreements the Market Operator issues, and wait until status is ACTIVE. Pending registrations cannot enter the clocks.
Step 2 — Register what you balance. After the seat is ACTIVE, file Trading Units from the site and pool directories (§3.9B). Standing data tells the market what your plant can actually do; some fields need System Operator certification before you may trade.
Step 3 — Turn residuals into a ladder. Strategy still decides the book position (V3). Market ops translates a completed run into hourly net positions and a bid ladder with provenance. A long hour becomes an offer; a short hour becomes a buy. You can rebuild from the latest run on the Bid Desk (§4).
Step 4 — Submit before the day-ahead gate. By default the DAM gate closes 10:00 SAST on D−1 (the day before delivery). Blind submission means you commit without seeing others’ ladders. After the gate, you cannot quietly edit that hour’s day-ahead bid.
Step 5 — Live with the schedule. The Market Operator clears and publishes accepted volumes and the hourly SMP. That schedule is your commercial commitment for energy — what you are paid or charged at the SMP — subject to later System Operator constraints and imbalance rules (§13).
Step 6 — Correct in the intraday market if needed. If forecast drift is large enough and the IDM gate is still open, you may re-declare. IDM is a correction market, not a rewrite of a closed hour (§5).
Step 7 — Deliver under grid reality. Electrons follow physics and System Operator instructions. A curtailment or dispatch order can move you off the economic schedule; that movement has its own compensation rules (V12 §3.2).
Step 8 — Pay for the truth after the fact. Meters arrive. Imbalance compares what happened to what was contracted and instructed (§6). Monthly, the Market Operator’s settlement file is what you reconcile (§8, §15).
Follow along. Seat:
trader_1@webill.net(BRP) with passwordsupersecret. Path: BRP / Market → Bid Desk → Day-ahead. You should see: a Gate countdown, the Day-ahead and Intraday tabs, and Rebuild from latest run before a ladder exists.
1.5 The Market Operator — auctioneer, rulebook and clearing bank
The Market
Operator is the independent party that makes SAWEM
a market instead of a chat group. In the product, that is the
/mo console (V11 §12).
In plain words, the MO:
- Admits participants. Reviews BRP applications, issues agreements, activates registrations, and can suspend them when rules require.
- Publishes the rulebook. Gate times, price floors and caps, and versioned MarketRules so every bid pins the rules it was made under (§9).
- Runs the auctions. Collects blind DAM and IDM
submissions, clears them, and publishes schedules and prices — on
Bidding (
/mo/bidding, V11 §12.7). - Keeps the money trail. Builds the day-ahead energy account, rings the Market Operator’s own charges into a separate pot, and publishes settlement statements and invoices.
- Holds credit cover in trust. Participant cover sits in accounts in the MO’s name as trustee — your money, but not withdrawable at will — so the market can still settle if someone defaults.
- Broadcasts notices. General messages, system stress, price-cap events — context every BRP must see.
- Handles queries and disputes on market statements (distinct from a bilateral PPA dispute in V6).
Auctioneer metaphor. The MO is the person with the gavel and the person who runs the settlement office behind the hall. They do not grow the vegetables (that is generation). They do not drive the trucks that keep roads open (that is the System Operator). They decide who sold what at which posted price, and they make sure every rand for cleared energy has a matching counterparty in the energy pot.
Three money pots — why the MO is not “the grid.” Market settlement splits into:
| Pot | Everyday name | Settles against |
|---|---|---|
| 1 · Energy | Cleared MWh × SMP | Other participants (closed loop, should Σ = 0) |
| 2 · Ancillary recovery | Cost of System Operator decisions and reserve | The System Operator |
| 3 · MO charges | Fees to run the market | The Market Operator (ring-fenced) |
The MO invoices Pot 3 and administers all three; it does not become the System Operator when Pot 2 moves. Full arithmetic: V8 §8.5 and V7 §13.
1.6 The System Operator — traffic control for the wires
The System
Operator is responsible for keeping the physical
power system secure — frequency, voltage, thermal limits on
corridors, reserve. In the product, that is the three /so
rooms: Dispatch
Desk (V12
§4), Network
Model (V12
§5), and Registry
(V12 §6).
In plain words, the SO:
- Publishes the network picture. Zones and how much power may flow between them — the constrained scheduling model (V12 §2).
- Constrains the economic schedule. After the Market Operator’s unconstrained clearing, security limits may cut or redispatch units. Price for energy stays on the unconstrained story; the difference is compensated under ancillary rules, often at your own offered price.
- Issues dispatch instructions. “Be at this megawatt level by this time, ramping at this rate.” Those instructions create Instructed Energy — what you would have done had you followed them.
- Calls and certifies reserve. How much regulating or instantaneous reserve a unit may offer is what the SO has certified, not what you wish you had.
- Can suspend balancing groups in congested zones so local over-delivery cannot hide a constraint violation.
- Declares system conditions when the grid is under stress — context that may appear as a Bid Desk banner, and that can change which instructions are lawful.
Traffic-control metaphor. The Market Operator sold everyone a slot on the highway for 18:00. The System Operator watches the bridges. If a bridge can only take 60 MW and the market wanted 75 MW across it, traffic control diverts 15 MW — and the diversion is accounted for under safety rules, not by quietly changing the ticket price everyone already paid.
Why BRPs must still care. An SO instruction changes what “good delivery” means for imbalance. Being curtailed by the System Operator is usually settled differently from voluntarily re-declaring yourself down in IDM — one is the grid’s decision, the other is yours (§5, V12 §3.2).
1.7 DAM, IDM and imbalance
- Day-ahead market (DAM) — every day, for every hour of tomorrow, participants submit blind bids; the Market Operator clears one SMP per hour; everyone who clears trades at that price.
- Intraday market (IDM) — corrections closer to delivery when the forecast drifts.
- BRP (Balance Responsible Party) — the registered party financially accountable for schedule vs actuals. The gap is imbalance, priced to punish optimistic forecasts (short above SMP, surplus below — subject to the full Market Code legs in §6).
Before those markets make sense, you need three everyday ideas: long, short, and net to zero. They describe what is left on your book after contracts and strategy have done their work — the residual that SAWEM may trade.
Long, short, and net to zero — the kitchen metaphor
Picture your book as a kitchen for one hour of tomorrow.
- Supply is what you expect to cook (generation, storage discharge, energy you already bought under a PPA).
- Demand is what you have promised to serve (loads, offtake deals, energy you must deliver).
Strategy pairs them as far as it can (V3). What is left on the counter is the residual for that hour:
| Residual | Plain meaning | Kitchen picture | What SAWEM sees |
|---|---|---|---|
| Long | You have more energy than your contracts need | Leftover food on the counter — you can sell it at the market stall | An offer (I will sell up to X MWh if the price is at least Y) |
| Short | Your contracts need more energy than you have | Guests still hungry — you must buy something in | A buy bid (I will buy up to X MWh if the price is at most Y) |
| Net to zero | Supply and demand already balance for that hour | The meal is plated; nothing left over, nobody waiting | No bid — the Bid Desk stays quiet for that hour |
Long does not mean “good” and short does not mean “bad.” They only say which side of the scales tip. A solar book at noon is often long; a mall at peak is often short. A well-built portfolio can be long in some hours and short in others on the same day.
How the residual becomes a number
For one book and one hour, think in a single signed megawatt-hour:
net = expected_supply − expected_demand (after the
strategy run)
| If net is… | You are… | Bid Desk action |
|---|---|---|
| Positive (e.g. +12 MWh) | Long | Build an offer ladder for up to 12 MWh |
| Negative (e.g. −8 MWh) | Short | Build a buy ladder for up to 8 MWh |
| Zero (0 MWh) | Net to zero | Submit nothing for that hour |
%%{init: {"themeVariables": {"fontSize": "20px"}, "flowchart": {"nodeSpacing": 36, "rankSpacing": 44, "padding": 18}}}%%
flowchart TB
N["Net position for the hour"] --> P{"What is left?"}
P -->|"net greater than 0"| L["Long → offer to sell"]
P -->|"net less than 0"| S["Short → bid to buy"]
P -->|"net = 0"| Z["Net to zero → no bid"]
Worked kitchen numbers (teaching).
| Hour | Supply after contracts | Demand after contracts | Net | Plain English | Market action |
|---|---|---|---|---|---|
| 11:00 | 20 MWh | 8 MWh | +12 | Twelve crates left on the counter | Offer up to 12 MWh |
| 18:00 | 7 MWh | 15 MWh | −8 | Eight plates still empty | Buy up to 8 MWh |
| 02:00 | 10 MWh | 10 MWh | 0 | Kitchen closed tidy | No bid |
Why “net to zero” matters
Net to zero is success for that hour, not a missing trade. It means strategy and your contracts already matched supply to demand, so there is no leftover to sell and no hole to fill. Sending a zero-quantity bid would only add noise; the platform therefore produces no bid for that hour.
A day is almost never all one shape. You can be long at 11:00, net to zero at 14:00, and short at 18:00. The Bid Desk and the automated DAM worker walk each hour on its own residual.
%%{init: {"themeVariables": {"fontSize": "18px"}, "flowchart": {"nodeSpacing": 28, "rankSpacing": 40, "padding": 16}}}%%
flowchart TB
subgraph day["One delivery day · three example hours"]
direction TB
H1["11:00 · long +12 → offer"]
H2["14:00 · net 0 → no bid"]
H3["18:00 · short -8 → buy"]
H1 --> H2 --> H3
end
Long / short in the market vs imbalance after delivery
Do not mix these two uses of “short”:
| When | “Long / short” means | Settled how |
|---|---|---|
| Before the gate (this section) | Your book residual — leftover or gap you may bid | DAM / IDM clearing at the SMP if accepted |
| After delivery (§6) | Your meters vs schedule (and instructions) | Imbalance prices — often harsher than the SMP |
Being long at the Bid Desk and then under-delivering on the day are different stories. The first is a planned offer; the second is a balancing problem.
Where the ladder is built. §4 turns these residuals into rungs. Intraday corrections when the forecast drifts: §5.
1.8 What deliberately did not change
The strategy engine never sees a market price. Allocator, pricing, nightly book cycle, pools and hashes stay as V3 / V4 document them. Market ops is a translation layer: completed run → hourly net position → bid ladder with provenance → MO clearing → schedule → imbalance.
A book without a BRP registration behaves exactly as before. Attach an ACTIVE registration and the D−1 clocks (§1.9) bid its residuals automatically — you do not have to sit at the Bid Desk at 03:00. The rest of this section is that automatic path in plain words.
Automatic residual bid — what it is
Think of strategy as packing tomorrow’s lunchboxes (contracts and nominations). Whatever will not fit in a lunchbox is left on the counter. The automatic residual bid is the night porter who, every morning before the market gate, weighs what is on the counter and posts it at the stall — without waking you, and without changing how the lunchboxes were packed.
That porter is the Oban worker
SubmitDamBids. It uses the same
build-and-submit path as the Bid Desk’s Submit button
(§4).
When it occurs
| Condition | Why it matters |
|---|---|
| Your org has an ACTIVE BRP registration | Pending / suspended seats do not enter the clocks |
| At least one Trading Unit is registered on that seat | Residuals come from units; a bare registration has nothing to translate |
| A completed strategy run exists for the trading day | Prefer a fresh NOMINATED run; otherwise the latest FORECAST |
| Wall clock is 03:00 SAST on D−1 (default cron) | Runs for tomorrow’s delivery day — early enough to beat the gate |
| The DAM gate is still open (default 10:00 D−1) | After the gate, the worker records a gate miss / expiry instead of inventing a late bid |
%%{init: {"themeVariables": {"fontSize": "18px"}, "flowchart": {"nodeSpacing": 28, "rankSpacing": 40, "padding": 16}}}%%
flowchart TB
N["02:30 · RunNightly<br/>refresh tomorrow strategy"] --> S["03:00 · SubmitDamBids"]
S --> G{"DAM gate still open?"}
G -->|"yes"| B["Build ladder from residuals<br/>and submit"]
G -->|"no"| X["Gate miss · no late invent"]
B --> F["12:00 · FetchSchedule<br/>accepted MWh + SMP"]
Manual path still exists. You can open Bid Desk earlier, Rebuild from latest run, edit if your process allows, and Submit yourself. Automatic bidding is the default night path when you do nothing.
How it occurs — the translation steps
- Pick the trading date — tomorrow (or an explicit override in ops / tests).
- For each ACTIVE registration (and its registered Trading Units), read the latest completed strategy run for that day.
- Compute the hourly net position — the residual per SAST hour (§1.7).
- Build a bid ladder (
BidBuilder) — offers for long hours, buys for short hours, skip net-to-zero hours; apply safety margin and any open-position clamp. - Persist a DRAFT bid pinned to the MarketRules version and the strategy run id (provenance).
- Submit to the Market Operator (same gateway path as the desk) → status SUBMITTED, unless there was nothing to bid.
- Later (12:00),
FetchSchedulewrites accepted volumes and the hourly SMP back onto the lines.
How the residual is worked out
For each hour of the trading day, the platform does not invent a market view. It reads the strategy run’s tagged spill and shortfall lines:
net (MWh) = Σ spill (long, +) − Σ shortfall (short, −)
Each spill or shortfall line keeps the opportunity cost strategy already computed (what that energy was worth as leftover, or what filling the gap would otherwise cost). That cost becomes the ladder price — the market price forecast is not mixed in (truthful-bidding invariant).
| Net for the hour | Residual | Automatic action |
|---|---|---|
net > 0 |
Long | One offer rung per spill component (cheapest first) |
net < 0 |
Short | One buy line for the gap |
net = 0 |
Net to zero | No line for that hour |
Pricing in one breath (markets quote
R/MWh; strategy stores c/kWh;
1 c/kWh = R 10/MWh):
- Offer rung ≈
opportunity_cost × 10 + safety_margin(and not below the market floor) - Buy limit ≈
avoided_cost × 10 − safety_margin(and not above the market cap) - Default safety margin on the registration: R 10/MWh
Full rung rules, clips, and cross-book netting: §4.
Detailed example — hour 12 automatic offer
Data. BidBuilder canonical ladder · same numbers as §4.6 · full_demo narrative · safety margin R 10/MWh.
Scene. Delivery day is tomorrow. At 02:30 the
nightly strategy cycle refreshes the book. At 03:00
SubmitDamBids wakes for that delivery day. For
12:00 SAST the latest run shows two leftover (spill)
lines and no shortfall:
| Strategy component | Quantity | Opportunity cost | Plain meaning |
|---|---|---|---|
| Firm take-or-pay spill | 5.00 MWh | 0 c/kWh | Must-pay energy with nowhere else to go — nearly worthless as a leftover |
| Wind spill | 1.71 MWh | 40 c/kWh | Surplus wind that could have earned ~40c if used elsewhere |
Residual arithmetic.
net = 5.00 + 1.71 − 0 = +6.71 MWh →
long → build an offer.
Ladder prices (what the automatic bid posts).
| Rung | Quantity | Limit price | How it was worked |
|---|---|---|---|
| Firm offer | 5.00 MW | R 10/MWh | 0 × 10 + 10 safety margin |
| Wind offer | 1.71 MW | R 410/MWh | 40 × 10 + 10 |
Cheapest rung first: the firm block will clear before the wind block if the SMP sits between them.
What the bid looks like on the desk
After the worker runs, Bid Desk → Day-ahead for that trading date shows a SUBMITTED (or draft-then-submitted) ladder. The hour-12 slice looks like this:
Day-ahead automatic residual bid · hour 12
| Hour 1 | Direction 2 | Volume 3 | Limit 4 | Status 5 |
|---|---|---|---|---|
| 12:00 SAST | Offer · firm | 5.00 MW | R 10/MWh | SUBMITTED |
| 12:00 SAST | Offer · wind | 1.71 MW | R 410/MWh | SUBMITTED |
- 1Hour — the SAST delivery interval being sold.
- 2Direction — Offer because the residual was long; each rung keeps its component name.
- 3Volume — megawatts from the spill lines (not a round guess).
- 4Limit — reservation price; if the SMP clears above it, you still get the SMP.
- 5Status — set by the automatic submit (same lifecycle as a manual Submit).
Open a rung’s provenance drawer and you should see the strategy run id, the spill members, and the opportunity costs — proof the night porter did not invent volumes.
Same morning, a short hour (for contrast). If 19:00
had a 6.00 MWh firm-demand shortfall valued at
210 c/kWh, the automatic bid would add one buy line:
6.00 MW @ R 2,090/MWh (210 × 10 − 10).
Hours that net to zero simply do not appear.
After clearing (teaching SMP R 980/MWh). Both offer
rungs clear because 10 ≤ 980 and 410 ≤ 980.
You are scheduled for 6.71 MWh and paid the
SMP, not R 10 or R 410. The limits only decided
whether you were in.
Follow along. Seat:
trader_1@webill.net(BRP). Path: BRP / Market → Bid Desk → Day-ahead for tomorrow after 03:00 (or click Rebuild from latest run then Submit to walk the same path by hand). You should see: firm and wind offer rungs with provenance, gate countdown, status moving to SUBMITTED before 10:00 SAST.
1.9 The D−1 / D / D+1 clocks
Market automation rides a fixed SAST clock. The dial is the same figure family as V0 §6; here the list is the market day slice — D−1 bid and schedule, day-of SO/IDM polls, D+1 imbalance, and the monthly recon on the 3rd.
config/config.exs; gate
times from versioned MarketRules (defaults below). Platform-wide
preview:
V0
§6.
- 00:05 Archive completed SO instructions
- 02:30 Nightly strategy re-forecast (feeds tomorrow’s residual)
- 03:00 D−1 · Build & submit day-ahead bids
- 10:00 D−1 · Default DAM gate closure (MarketRules)
- 12:00 D−1 · Fetch accepted schedule & SMP
- 12:30 Refresh the SMP price forecast
- 06:30 D+1 · Price yesterday’s imbalance
- every 15 min Poll the System Operator · every 30 min IDM drift monitor (while gate open)
3rd · 07:00 — ReconcileMonth matches the Market
Operator settlement file. Full platform day-of-month map (settlement
1st, strategy 4th/20th, IPP 5th):
V0
§6.
Default gates (until the MO publishes a new rules version): DAM gate 10:00 D−1; IDM gate delivery − 60 minutes. Prototype SMP bands: DAM 700 / 980 / 1 400 R/MWh (off-peak / standard / peak); IDM slightly lower. Short imbalance 1.35 × SMP, surplus 0.65 × SMP (prototype bands — live Market Code balancing is the fuller stack in §6).
Where book strategy is taught. V3 · Strategy. PPA settlement (distinct from MO settlement files): V8. Orientation clock preview: V0 §6.
1.10 The market objects you must keep separate
Your schedule is not your meter reading, and neither is your contract settlement. The market keeps those records separate so that a cleared trade can be audited after the delivery day.
A BRP owns the market outcome for the registration, even where several books contributed to it. The day-ahead market (DAM) is the binding D−1 auction. The intraday market (IDM) is a correction market, not a way to rewrite a closed hour. The SMP is the uniform clearing price; it is not the price you typed into the ladder.
1.11 Read the clocks before you trade
The market can be automated only because each worker has a narrow job. The following is the complete default rhythm in SAST; a published rules version can move a gate, but it cannot make a closed gate open again.
| When | Worker or gate | What changes |
|---|---|---|
| 02:30 | RunNightly |
refreshes tomorrow’s strategy position |
| 03:00 | SubmitDamBids |
builds and submits the DAM ladder |
| 10:00 | DAM gate | freezes day-ahead submission |
| 12:00 | FetchSchedule |
imports accepted volume and SMP |
| 04 / 10 / 16 / 22 | IdmMonitor |
checks eligible delivery-hour drift at the five Code gates |
| */15 | PollSo |
imports System Operator instructions |
| 12:30 | RefreshForecast |
refreshes price P10/P50/P90 ribbon |
| 00:05 | ArchiveSo |
archives ended SO windows |
| 06:30 D+1 | ComputeImbalance |
compares actuals to schedule |
| 07:00, 3rd | ReconcileMonth |
joins the MO file to expectations |
1.12 What belongs elsewhere
This primer has stayed inside the market seat. Other volumes own the neighbouring jobs. Mixing them is how people end up looking for a PPA invoice on the Bid Desk, or expecting SAWEM to redesign a pool.
Kitchen metaphor (one more time). Strategy packs the lunchboxes (contracts and nominations). V7 only weighs what is left on the counter and posts it at the market stall. V6 is the private dinner bill between you and your counterparty. V11 is the formal order pad the stall accepts from outside systems. V12 is the night crew that keeps the ovens and clocks running. Different rooms; different bills.
What V7 is for
Use this volume when the question is about SAWEM:
- registering as a BRP and staying compliant
- turning book leftovers / gaps into DAM or IDM bids
- reading schedules, SMP, and imbalance (SO instructions live in V12 §3)
- reconciling the Market Operator’s wholesale file and paying / getting paid through market settlement
V7 does not decide which PPA gets which kilowatt-hour, and it does not invent the opportunity cost on a spill line. Those answers come from strategy and deals; the market only carries them forward as provenance on a bid.
What belongs in other volumes
| If you are asking… | That lives in… | Plain reason |
|---|---|---|
| How do I structure pools, allocate energy, or value a leftover? | V3 · Strategy | Strategy builds the book position and opportunity costs |
| How does a book residual become a market bid (bridge)? | V3 §15 | Same translation, taught from the strategy seat |
| Who owes whom on a bilateral PPA (wheeling / CfD)? | V8 · Settlement | Private contract money from meters → ledger → statements |
| What does the MO wholesale charge file mean vs my expectation? | This volume (V7) · §8 · §15 | Market money, not PPA money |
| What does the System Operator do, and which notices does it send? | V12 · Systems Operator | Zones, instructions, /so console |
How do I call SAWEM over HTTP
(/api/v1)? |
V13 · Market API | Integrator contract; UI/Oban use domain paths instead |
| Which Oban job failed, and how do I rerun it? | V21 · Operations | Queues, retries, demo data, troubleshooting |
The two bills people confuse
- PPA settlement (V6). “Did we deliver what we promised each other under this contract, and what do we owe after losses and tariffs?” Counterparty is another org (or Eskom/municipality on network lines).
- Market settlement (V7). “Did my BRP schedule and instructions match what the meters and the Market Operator say, and what do I owe the market?” Counterparty is the market arrangements (other participants, System Operator ancillary pot, Market Operator fees).
Same megawatt-hour can appear in both stories without being double counted as one invoice. A wheeled PPA settles between buyer and seller; any leftover that went to SAWEM settles on the BRP market statement. Keep the folders separate when you audit.
Handy hand-offs from here
| Next question after this primer | Go to |
|---|---|
| Register the seat and file Trading Units | §3 |
| Build or read a ladder | §4 |
| Walk one delivery day end to end | §12 |
| Strategy → market bridge from the book seat | V3 §15 |
| How PPA settlement stages work | V8 §2 |
Data. full_demo · seed 42 · stage S08 (market loop) · last re-derived 2026-07-18 against the deterministic demo narrative.
3. Registration and compliance
Screens: BRP / Market → Registration
(/org/brp), BRP / Market → Market registry
(/org/brp/registry), BRP / Market →
Standing data (/org/brp/standing-data).
Registration has two halves, and confusing them is the most expensive mistake on this page. The first half is who you are — one party, one code, one set of financial security. The second is what you registered — the bundles of metering points the market actually schedules and settles, and what each of them can physically do. §3.1 covers the first. §3.2 to §3.6 cover the second, and it is where a portfolio that looked like one business turns out to be three. §3.7 and §3.8 cover the third, which is where the longest-lead work in the whole exercise sits — about thirty facts per plant, and most of them are not in any database. §3.9B is the screen-by-screen guide to every Trading Unit registration wizard — IPP, Off-taker, Trader — and the Market Operator surfaces that inspect the units after they are filed.
3.1 One registration per organisation
Think of a Balance Responsible Party (BRP) registration as your organisation’s membership card for the wholesale market. Without it, your strategy books can still plan and forecast — but they cannot walk through the market door to bid, clear, or receive an imbalance bill. With it, the Market Operator knows who is accountable for money and megawatt-hours under your name.
You hold one registration per organisation. One card, one seat, one set of financial security — even if that seat later holds several Trading Units (trader pool, IPP site, off-taker site). The card is the legal container; the units are what the market schedules (§3.3).
You create that card through a registration wizard
on BRP / Market → Registration (/org/brp)
— the Info tab. If you have no registration yet, the
page shows a call-to-action: Start registration wizard.
That opens a modal (a popup window over the page) with six steps. You
can jump between steps freely; green circles mean that step has what it
needs, and Register as BRP only lights up when the
required steps are complete. After you file, the same wizard opens again
in view mode via View registration, so
you can re-read every answer without changing them.
Filing puts the registration in PENDING. You cannot bid yet. Only ACTIVE may. Getting from one to the other is the application board in §3.13A — information, two agreements signed by both sides, approval, then the Market Operator’s Activate. Later the seat can be SUSPENDED or REVOKED. That four-word chain (PENDING / ACTIVE / SUSPENDED / REVOKED) is still the day-to-day answer to may this seat bid today? A REVOKED seat cannot be suspended: the only Market Operator D2 move is Reactivate (back to ACTIVE). The clocks and the paperwork live underneath it (§3.13).
Follow along. Seat: any organisation without a BRP yet (or a demo org you can recreate). Path: BRP / Market → Registration (Info) → Start registration wizard. You should see six step labels across the top: Identity, Party, Trading, Security, Agreements, Review.
3.1.1 How the wizard is organised
The wizard is not a single long form. It is six short rooms in a corridor. You can walk into any room by clicking its step button. Incomplete rooms show a warning; hover them to see what is still missing. Nothing is sent to the Market Operator until you press Register as BRP on a complete application (or Close / Cancel to abandon without filing).
| Step | Name on screen | What you are answering |
|---|---|---|
| 1 | Identity | What shall we call you, and what kinds of work will this seat do? |
| 2 | Party | Under which legal category are you joining, and what are you allowed to register? |
| 3 | Trading | How cautious should your bids be on price? |
| 4 | Security | What financial cushion stands behind your market debts? |
| 5 | Agreements | Which paper trail and fees prove you are joining for real? |
| 6 | Review | Read everything back before you submit |
The sections below explain every field in plain language.
3.1.2 Step 1 — Identity (BRP code, roles, dates)
This step is your name badge and job titles.
BRP code. A short label you choose for this
seat — for example BRP-T1-DEMO or
BRP-SOLAR-WEST. Think of it as the nickname on your market
locker. It must be unique across the platform. It is not the
same as the MPID (Market Participant ID): the MPID is a
permanent number the Market Operator issues later, like a national ID
number for settlement. Your BRP code is the friendly handle people see
on screens while you work.
Roles. Tick every hat this seat wears. The market needs this so it knows what kind of activity to expect.
| Role | Plain meaning | Everyday example |
|---|---|---|
| Generator | You put electricity onto the grid from plant you balance | A solar farm company that is its own BRP |
| Load | You take electricity off the grid for consumption you balance | A factory that is balance-responsible for its own demand |
| Trader | You sit in the middle — buying from generators and selling to customers | An energy trader with a pool of sites |
| Distributor | You are a licensed distributor acting in the market | A municipal distributor buying losses through a market seat |
You may tick more than one. A trader that also owns a solar plant is both Trader and Generator — two hats, one membership card. If you leave a role off, books that need that role will not sit cleanly under this seat later.
Effective from / Effective to. Optional calendar dates for when this registration is meant to apply. Think of them as “valid from / valid until” on a season ticket. Leave them blank if you are not limiting the term yet; the Market Operator’s accession dates (§3.13) still govern when you legally become a Party.
3.1.3 Step 2 — Party (type, qualifying ground, two switches)
This step answers: what kind of creature are you in the Market Code’s eyes?
Party type. The legal flavour of your organisation under the Code. Pick the one that matches how you are licensed and how you actually operate. In the wizard, a ? next to the field lists every choice with a short description (same pattern as other org wizards). A Retailer (a supplier of small customers who themselves cannot join the market) is not admitted as a market participant; that category exists for other records, not for this joining path.
| Party type | Plain meaning |
|---|---|
| Generator | You put generating plant into the market |
| Trader | Licensed trader in the middle — you buy from generators and sell to customers |
| Distributor | Licensed distributor acting as a party |
| Transmission | Transmission licence holder |
| Network Operator | Network operator accountable for network energy |
| Import/Export licence holder | Cross-border import/export licence holder |
| Consumer | Large consumer connected at medium or high voltage |
| Reseller | Reseller treated as a consumer under the Code (§2.1(171)) |
Qualifying criterion (Annexure 1). The specific doorway through which you are allowed to enter. The Code lists five grounds. The ground matters after you join, because it gates what you may register as Trading Units later — like a fishing licence that only covers certain waters.
| Ground | Who it is for | Threshold in plain words |
|---|---|---|
| Annexure 1(1) Generator | Generating plant | At least 100 kW, connected at medium or high voltage, licensed or registered by NERSA |
| Annexure 1(2) Trader | Licensed traders | Any licensed trader |
| Annexure 1(3) Distributor / Transmission | Network licence holders | Any licensed distributor or transmission entity |
| Annexure 1(4) Import/Export | Cross-border licence holders | Any holder of an import/export licence |
| Annexure 1(5) Consumer | Large consumers (and resellers treated as consumers) | Connected at medium or high voltage |
How party type chooses the qualifying criterion. In the wizard you must pick Party type first — Qualifying criterion stays disabled until you do. Choosing a type filters the dropdown to the usual Annexure 1 ground for that type and fills it in. That pairing is a suggestion from the Code’s usual admission path, not a free mix-and-match:
| Party type you select | Qualifying criterion the wizard offers |
|---|---|
| Generator | Annexure 1(1) — Generator |
| Trader | Annexure 1(2) — Trader |
| Distributor | Annexure 1(3) — Distributor or Transmission entity |
| Transmission | Annexure 1(3) — Distributor or Transmission entity |
| Network Operator | Annexure 1(3) — Distributor or Transmission entity |
| Import/Export licence holder | Annexure 1(4) — Import/Export licence holder |
| Consumer | Annexure 1(5) — Consumer |
| Reseller | Annexure 1(5) — Consumer |
Example: if you join as a Generator on Annexure 1(1), you may register generating (and storage) units, not a pure demand-side unit under a consumer ground. If you join as a Trader, your portfolio may hold both generation and load — that is why traders get Annexure 1(2). Distributor, Transmission, and Network Operator share Annexure 1(3) because they are admitted as network licence holders. Reseller shares Annexure 1(5) with Consumer because the Code treats a reseller as a consumer for admission.
Market participant (on/off). When this is on, you intend to trade in the day-ahead and intraday markets (submit bids and offers). Think of it as “I want a stall in the auction hall.” Most applicants leave this on.
Balance responsible (on/off). When this is on, you are accountable through the balancing mechanism for mismatches between what was scheduled and what meters show. Think of it as “if the books don’t balance, the bill lands on me.” These two switches are independent. A network operator might be balance-responsible for losses without ever bidding in the auction — stall closed, but still on the hook for the till.
3.1.4 Step 3 — Trading (safety margin and price taker)
This step is about how carefully your seat prices energy when the platform builds bids for you.
Safety margin (R/MWh). A padding in rand per megawatt-hour. Default is 10. On an offer (you selling), it is added so you ask a little more than the bare opportunity cost. On a buy limit (you buying), it is subtracted so you refuse prices that are only barely attractive. Metaphor: leaving a small cushion on the car’s following distance so a bump in the road does not cause a crash. You may set a different number if your trading policy says so.
Price taker. When this is on, your offers go in at the market floor price — you accept whatever clearing price the auction finds, because you care more about volume certainty than about setting the price. Typical for must-run renewables that will produce anyway (the sun does not wait for a better bid). When it is off, you are a price maker: your ladder can influence or respond to price. Leave this off unless you deliberately want floor-priced offers.
3.1.5 Step 4 — Security (guarantee and warning limit)
Wholesale markets settle in money. This step records the cushion that protects other participants if you cannot pay.
Guarantee type. The kind of financial security behind your seat:
| Type | Plain meaning |
|---|---|
| Bank guarantee | A bank promises to pay if you default — like a surety bond |
| Letter of credit | A bank undertakes to pay against documents under agreed terms |
| Cash | Money parked as cover (often in accounts the Market Operator controls) |
| None | No instrument recorded — only allowed when Market participant is off |
If Market participant is on (you intend to trade in DAM / IDM), the wizard does not offer None and will not let you register until you pick a real instrument and an amount. Trading seats need a cushion; a stall with no cover is not admitted. Turn Market participant off only if you are joining without trading (for example some network roles that are balance-responsible but do not bid).
Who may stand behind non-cash cover is tightly limited later in the Code (a South African licensed bank, or an international bank authorised here) — §3.16. This field only records the instrument kind on the registration.
Guarantee amount (R). How large that cushion is, in rand. If the type is not None, the wizard expects an amount — a promise with no size is not a promise the market can use. When the Market Governance Committee has published a Warning Limit maximum, the wizard recommends that figure as a starting cover and offers Use recommended (it also fills Warning Limit to the same value). You may lodge more or less once you know your exposure; the recommendation is a conservative starting point, not a Code-mandated floor.
Warning Limit (R). A rand threshold you set (capped by the Market Governance Committee). When your exposure approaches this line, the market machinery can warn you before things get worse. Metaphor: a fuel warning light you set yourself — not the empty tank, but the point where you want the beep. You may set it lower than the committee maximum; you may not set it higher. The wizard shows the current MGC maximum when market rules have published one; if none is published yet, it says so and leaves the field for you to set later.
3.1.6 Step 5 — Agreements (paper trail, fee, accounts, commissioning)
Joining is not only data entry. It is also proof that the legal and bank steps exist. This step records that paper trail.
VAT number. Your South African VAT registration
number — compulsory in the wizard. Format: exactly
10 digits starting with 4 (for example
4123456789). Spaces and punctuation are stripped as you
type; anything that does not match is rejected before you can register.
Market invoices and self-billing invoices carry VAT; without a valid
number the tax line on statements has nowhere honest to land.
Accession fee paid. Tick when you have paid the joining fee the Market Operator charges for accession. Think of it as the club joining fee — separate from trading security.
Market Participation Agreement (MPA) reference and MPA executed on. The MPA is the contract that makes you a participant in the day-ahead and intraday markets (the auction hall rules). The reference is the document’s file or contract number; the date is when it was signed. Metaphor: the lease that lets you occupy a stall.
Balancing Agreement reference and Balancing Agreement executed on. A second contract that makes you accountable through balancing (the till that settles mismatches). It is not the same document as the MPA. You can, in some roles, be balance-responsible without bidding — two agreements, two jobs.
Agreement effective date. The calendar day on which you are meant to become a Party under those agreements. Signed packs must reach the Market Operator at least three business days before this date (§3.13) — like posting a cheque early enough to clear before rent day.
Agreements received by MO. The date the Market Operator actually received the signed agreements. That date is what the three-business-day rule reads.
Accounts notified. Tick when you have opened the required Collateral Reserve and/or Trading Clearing Account and told the Market Operator in writing. Opening an account and staying silent is not enough — accession stays blocked until the notice is on file. Details of those accounts are in §3.16.
Testing & commissioning and Commissioning note. Tick if you are participating under a special testing-and-commissioning arrangement before (or alongside) full accession — for example offering energy from plant still under test. The note should say what was agreed with the Market Operator. This is a distinct flag, not a sneaky early ACTIVE, so reports can tell test megawatt-hours apart from ordinary Party volumes.
3.1.7 Step 6 — Review
The last step is a read-back of everything you entered: code, roles, party type, criterion, switches, safety margin, price-taker, guarantee, VAT, agreement references, and the ticks for fee, accounts, and commissioning. Nothing new is typed here. When every required step is green, Register as BRP files the application. The seat appears on your Info page as PENDING. That means filed, not trading — the application board in §3.13A is what follows.
3.1.8 After you register — view and status
Once a registration exists, the Info page shows its header (code, status, roles, guarantee summary) and a detail strip (party type, criterion, VAT, agreements, and related ticks). Use View registration to reopen the wizard read-only and walk the same six steps as a filed record.
Remember: PENDING means filed, not trading. Only ACTIVE may bid. Activation is the last Market Operator step on the application board (§3.13A), not a shortcut from PENDING. The Market Operator console that works those steps is V11 §12.
3.2 The seat holds Trading Units
You do not attach strategy books to the registration. A book is your commercial P&L (V3); the market never sees it. After the seat is ACTIVE, you file Trading Units from the site and pool directories — Register with Market (§3.9B).
A book without a registered unit still forecasts and allocates. It does not enter the DAM/IDM clocks.
3.3 A Trading Unit is not your book
Your book is commercial. You choose it: one per site, one per pool, one per customer segment — however your business is organised.
A Trading Unit is what the market registers, and you do not fully choose it. One rule decides it for you:
A Trading Unit may not span more than one network zone.
For a single-site solar farm the two are the same thing and you can stop reading. For a trader they are almost never the same thing. A portfolio with generation in the Northern Cape and customers in Gauteng is at least two Trading Units — nominated separately, scheduled separately, and balanced separately, which is the word that costs money. Being long in one zone does not cancel being short in another.
The zone rule and what it does to a portfolio is taught in V12 §2. This section is about what you then have to register.
Where the number comes from. Market registry → How many Trading Units do I need? Pick a pool and the screen answers it: one per zone its members sit in, with the zones named. It is a sizing figure for a registration project, not a detail — three zones means three of everything downstream.
When the answer is a lower bound. If the network model cannot place one of your members, the screen says at least N, not N. It will not guess. It names the site that could not be placed and the nearest zone to it, and it says what would fix it: a published zone boundary from the System Operator. Registering that site in the nearest zone would put it in the wrong balancing group and settle its energy against the wrong congestion, which is worse than waiting. The map in use is provisional — V12 §2.3 explains why and what it does not cover.
Each unit carries its own imbalance. Netting across them is a Balancing Group (§3.6) — something you ask for, not something you get.
3.4 A Point of Delivery — and the rule that every meter has two owners
A Point of Delivery is one metered point where energy enters or leaves the grid, registered against a Trading Unit. It carries the electrical node it sits at (the substation busbar, in the System Operator’s own naming), the meter’s device number, and the reference the market’s metering service provider uses to interrogate that meter remotely. Clause §7.2(1)(i) is that record — location, metering, embedded distributor if any, the other BRP, technology, and a SAPP name if the point is an interconnector.
Then the rule that lands hardest:
Every meter has two owners in the market. One party sells through it and one party buys through it. If the second one is missing, the energy through that meter cannot be settled — and not only for you.
The screen calls that second party the counterparty. Most of the time you never type it: the platform derives it from your signed physical PPAs. A generator selling to a trader has that trader as its counterparty at the injection point; the trader selling on to a factory is the counterparty at the withdrawal point too. A trader in the middle is the counterparty at both ends, which is also why the losses and the forecast error land in the trader’s unit rather than anyone else’s.
The registry shows one of three states per point. The last two need different actions from you, which is why the registry lists them separately rather than as one pile of “pending”.
| What the point says | What it means | What fixes it |
|---|---|---|
| Paired | Both parties have declared this node. Settleable. | Nothing. |
| Awaiting counterparty | You named a party and it has been told. It has not yet declared the same node in its own registry. | Chase that party — see §3.5. |
| No counterparty | No signed contract names anyone at this point, so there was nothing to derive from. | A physical contract. This is a commercial gap, not a data-entry one. |
Nothing is invented to fill the gap. A point with no derivable counterparty is shown empty and listed as an exception. A plausible-looking name would settle real energy against a party that never agreed to take it.
One quiet consequence of a virtual deal: it delivers no energy, so it creates no pairing. But the plant behind it is still injecting real electricity into a real network, and that injection still needs a Point of Delivery with a real counterparty — whoever is actually taking that energy. Two separate facts; V0 §5 has the deal side.
The rest of this section is the confusion those rules create for a merchant plant, a factory, and a trader pool — and how you actually clear them.
Two tills — the auction is not the meter
Think of the market stall as having two tills. They ring on different clocks, for different facts, and they do not substitute for each other.
| Till | What it settles | Who the “other side” is | What it needs from you |
|---|---|---|---|
| The auction till | What you were scheduled to do, at the market price | Whoever cleared against the stack that hour — you never meet them | An ACTIVE seat, a registered Trading Unit, a bid that passes the gate |
| The meter till | What the meter says you did, versus that schedule | A named Balance Responsible Party on the other side of that connection | A Point of Delivery on this unit, reciprocally paired |
The Market Operator never owns electricity. It is the auctioneer and the clearing bank, not a buyer. So “the market” can pay you the day-ahead energy payment and still not be allowed to sit as the second name on the meter. Clause §12.3(1) wants two BRPs at the point: one exporting, one importing. The MO is neither.
That is why an IPP that only wanted an unknown spot buyer still sees a PPA chase. The unknown buyer is real for price. The meter still needs a named importer for Actual Energy.
A PPA is not a ticket to the stall
You do not need a PPA to become a BRP. Accession is the Market Participation Agreement, the fee, credit cover, and Activate (§3.13). That is §6.
Once ACTIVE you may register a Trading Unit and, if the unit is in
force, submit day-ahead and intraday bids. Submission
is gated on party state and unit suspension — not on pairing, and not on
§7.2(1)(i). A unit with no meters still gets the warning
REG_NO_POINTS_OF_DELIVERY at registration; the save is
allowed. The nightly re-assertion then fails it for
tomorrow, because a pointless unit cannot be
scheduled against a meter.
What the Code actually requires at the connection is: every metered megawatt-hour is exported by one BRP and imported by another (§12.3(1)); the Point of Delivery names that other BRP (§7.2(1)(i)(d)); both sides declare the same electrical node (§7.1(6)).
The Code does not say “file a PPA.” It says “name who takes or
supplies the energy at this meter.” This platform
proves that name from a SIGNED or
ACTIVE physical PPA. An unsigned or still-negotiating
contract governs nothing yet. Deriving from it would register a pairing
both parties could still walk away from.
A virtual PPA derives nothing. It is a price hedge. No electrons move, so no wheeling pairing arises. The plant is still injecting; it still needs a physical taker at the meter.
| Gate | Needs a physical PPA? |
|---|---|
| Join as a BRP (accession) | No |
| Register a Trading Unit | No (warning if there are no meters yet) |
| Bid into DAM / IDM | No |
| Day-ahead energy payment on the schedule | No — other participants, via the clearing account |
| Attach meters to a trader-pool unit at Register | Yes — the wizard has no Delivery tab; it copies member meters from live PPAs, or it refuses |
| Pair a meter so Actual Energy can be allocated | Yes (or an equivalent signed physical arrangement the derivation can read) |
| Balancing on what the plant actually did | Yes — unpaired points are exceptions, not finished imbalance lines |
Worked hour — the auction paid; the meter did not
Data. Illustrative hour at 18:00 SAST on a Trading Day. SMP R 900.00 / MWh. Plant: a merchant generator that cleared 40.000 MWh unconstrained. The meter later reads 42.000 MWh injected. No physical PPA, so the Point of Delivery has No counterparty.
Inputs
| Fact | Value |
|---|---|
| Unconstrained schedule (what the auction till uses) | 40.000 MWh |
| System Marginal Price | R 900.00 / MWh |
| Metered injection | 42.000 MWh |
| Named importer at the meter | none |
Auction till — energy payment (EPM)
The day-ahead energy line is scheduled quantity times the clearing price, not your offer and not the meter.
R1: 40.000 × 900.00 = R 36,000.00
That rand comes from other participants. Across the whole market the energy pot sums to R 0.00. You can receive it with no PPA. The Bid Desk and §13 own this till.
Meter till — Actual Energy
Allocation wants two legs at the point: +42.000 MWh
on your unit and −42.000 MWh on a named counterparty
unit. With nobody named, the point raises
:single_brp_at_point (§12.3(1)). Balancing has no finished
Actual Energy for that meter. The rest of the market still allocates —
one unpaired point does not halt the day.
The 2.000 MWh the meter ran long of the schedule is exactly the kind of gap imbalance is supposed to price. Without a second name, that gap has nowhere to sit.
Note. You can still participate in market-price settlement on the schedule. You cannot complete imbalance settlement on what the plant did until the meter has two named BRPs. Those are two different tills.
Worked hour — a trader in the middle, meters that do pair
Data. Illustrative. Thread cast: IPP3 Midrand Hybrid injects, T1 Renewables Pool is the trader, OffTaker A Rosebank Mall withdraws. Physical PPAs are signed and both Points of Delivery are Paired.
| Point | Meter says | Primary BRP | Counterparty BRP |
|---|---|---|---|
| Generator injection | +42.000 MWh | IPP3 | T1 |
| Off-taker withdrawal | −38.000 MWh (drawn) | OffTaker A | T1 |
Allocation writes four legs:
| Leg | Unit | Signed MWh |
|---|---|---|
| Injection, primary | IPP3 | +42.000 |
| Injection, counterparty | T1 | −42.000 |
| Withdrawal, primary | OffTaker A | −38.000 |
| Withdrawal, counterparty | T1 | +38.000 |
Trader net: −42.000 + 38.000 = −4.000 MWh.
Σ check: 42 − 42 − 38 + 38 = 0 ✓
The −4.000 MWh is losses and mismatch. Not modelled, not adjusted: it simply is T1’s position, because T1 is the other owner at both ends and there is nowhere else for the difference to go. Metering in full is §14.
T1 appears twice. The 4 MWh gap is T1’s imbalance, not a loss factor applied on the IPP or the mall.
Every Trading Unit needs a meter on this unit
§7.2(1)(i) is checked on every registered Trading Unit the night before the Trading Day — generating, demand-side, storage, interconnector, and mixed. There is no class exemption.
The check is not “does this BRP appear somewhere in pairing?” It is: does this TUID have at least one Point of Delivery on its own row? Being named as the other BRP on someone else’s meter does not put a meter on your unit.
You may create a unit with no meters. That is a
warning. By the eve of a Trading Day it is a failure:
the unit cannot be scheduled against a meter. The Market Operator sees
it as Today’s failures §7.2(1)(i) on
Registry (V11
§22.4). You see an amber line on Market registry:
This unit has no Points of Delivery, so it cannot be
scheduled.
A missing meter (§7.2(1)(i)) is not the same as a meter
with no other owner (§12.3(1) / §7.1(6)). Fix
the meter first, then pairing.
Off-taker — the factory meter
The unit is DEMAND_SIDE. Energy leaves the grid at the site’s revenue meter. That meter must sit on this unit.
If you have not registered yet
- Attach a revenue meter to the OffTaker site (GPS + device). Without it, Register with Market is blocked.
- The organisation must be an ACTIVE Market BRP. The site must sit in a published network zone.
- Path: OffTaker Sites → Register with Market. Rooms: Identity · Zone · Delivery · Demand · Finance.
- On Delivery the meter number is a fact; Electrical node is required; remote access id is optional.
- Register files the unit and the Point of Delivery together. Wizard detail: §3.9B.2.
If the unit already exists and fails
§7.2(1)(i)
Do not re-run the site wizard. Open Units/Groups
(/org/trading-units) — that is the registry home — and
Add Point of Delivery on the unit (electrical node,
meter number, remote access id, site for GPS). The same card lives on
BRP / Market → Market registry. Then get a signed,
active physical PPA so the other BRP can be derived,
and chase Confirm on their inbox (§3.5).
IPP — the plant meter
The unit is GENERATING (or STORAGE if the site is a BESS). Energy enters the grid at the plant meter. That meter must sit on this unit.
If you have not registered yet
- Generator site: ACTIVE / OPERATIONAL, GPS, revenue meter, export at least 100 kW.
- ACTIVE Market BRP; site in a published zone.
- Path: IPP Sites → Register with Market, or Market registry → Register generator site.
- On Delivery: meter number is a fact; Electrical node is required; remote access id is optional.
- Register files the unit and the Point of Delivery. Field meanings: §3.7. Wizard: §3.9B.1.
If the unit already exists and fails
§7.2(1)(i)
Same as the off-taker: Units/Groups (or Market registry) → Add Point of Delivery. Then pairing via a signed physical PPA. A virtual PPA does not create that pairing.
The merchant instinct — “I am selling to the unknown stack” — is the auction till. It does not skip Delivery. Until a residual-grid BRP exists as a pairing source (§17.13), the only name the platform will put on the other side is a physical-PPA counterparty.
Trader pool — not a plant, still a unit
The unit is MIXED, one per zone. A pool is not a physical plant. The clause still applies to that MIXED unit’s own list of Points of Delivery.
On an IPP or off-taker meter the trader is usually the
counterparty. That pairing lives on
their unit. §7.2(1)(i) on the pool unit
means this MIXED TUID has no meters of its own.
The trader wizard has no Delivery tab. Behind
Register it does not invent an empty unit. It copies
meters from signed or active physical PPAs whose
generator or off-taker site sits in the zone you selected
and has a meter number plus remote access id. If there
is nothing to pair, registration is refused
(points_of_delivery_unallocated). That is why a trader hits
the PPA wall earlier than an IPP: they cannot even file
the unit until the commercial graph has metered sites in that zone.
If a MIXED unit already exists empty (older path, API, or a zone that later lost its PPA meters): put a signed physical PPA in force for a metered member site in that zone, then Units/Groups → Add Point of Delivery. Pick the member site. Do not invent a pool-only fake meter.
Being named on someone else’s meter does not satisfy §7.2(1)(i) for your own Trading Unit.
Follow along. Seat: OffTaker A (
offtaker_a@webill.net). After Register with Market, open BRP / Market → Market registry and the new TUID. You should see the Point of Delivery table, not the amber no Points of Delivery line. Seat: Trader 1 (trader_1@webill.net). Trader Pools → Register with Market without a signed physical PPA in that zone should refuse rather than file an empty MIXED unit.
Where this is taught. The Market Operator’s clause list and remedies for every nightly failure: V11 §22.4. Adding a meter after the wizard: §3.7 (Pairing a meter after the wizard). API: V13 §5.12.
3.5 The counterparty inbox
When another party names you at a metering point, the market has to tell you — and you have to answer. That is the counterparty inbox, on the Market registry screen.
Each entry names the electrical node, who declared it, whether the point is being added or removed, and the date it takes effect. You have two answers:
- Confirm — the point is yours. The pairing goes live for both of you and the point becomes settleable.
- Dispute, with a reason — it is not yours. The reason goes to the Market Operator, who resolves it.
Silence is not the safe third option. An unanswered declaration leaves the point half-declared, which means neither side can settle energy through it. If a declaration looks wrong, disputing it is faster and cheaper than letting it sit: a wrong pairing that goes live settles your neighbour’s energy against your account.
Careful. A dispute needs a reason in words. “Wrong” tells the Market Operator nothing it can act on; “that busbar feeds the plant next door” tells it exactly what to check.
3.6 Balancing Groups — netting across your own units
If you have several Trading Units, you can ask for them to be balanced together as a Balancing Group. A unit that over-delivers then offsets one that under-delivers, and neither is penalised for a mismatch that cancelled out inside your own portfolio.
You designate the group on Trading Units
(/org/trading-units). Select two or more of your units,
press Group these units, name the group, confirm the
effective window (the earliest date the §7.1(5) cutoff allows), and
designate. The Market Operator is told; the System Operator is told;
nobody approves it. §13.10(1) makes designation your
act. BRP / Market → Market registry
(/org/brp/registry) shows what the market
holds — status, any administrative suspension, and a cover
forecast for the next Trading Day. Manage membership on Trading
Units; the registry does not.
Three things to know before you plan on it:
- You have to ask. It is a designation, not a default. Two or more units, all belonging to you — you cannot pool with another party.
- The catch is timing. The System Operator can flag a zone whose lines are full — and a zone’s lines are fullest in exactly the hours your positions are largest. The relief you were counting on can be absent in the evening peak and present at 03:00.
- The exclusion is directional, not a blanket. If a zone cannot export any more, the members pushing more energy out than they scheduled are the ones excluded; a member delivering under schedule is relieving the constraint, not adding to it, and stays in. Import-constrained zones work the other way round. That is a zone constraint flag, not an administrative suspension, and it is never stored as a group status.
A group stops in four ways, and they are not the same thing:
| How it stops | Who | What you see |
|---|---|---|
| Duration — it runs to a date | you | effective_to on the card. No :EXPIRED
status. |
| Cancellation — ended early, deliberately | you, or the Market Operator with a reason | CANCELLED and a date. Designate a fresh group if you
need one. |
| Administrative suspension — paused, expected to resume | the Market Operator | a child window with a reason. The group is still the current designation; it is just not in force inside that window. |
| §3.3(6) exclusion — cover lapses in congested hours | the System Operator | computed per member, per hour, from the flag. The group stays designated. |
The worked hour — every step, the money, and the catch — is §6.7. The Market Operator’s tab is V11 §21.12; the System Operator’s flag is V12 §5.5.
3.7 The market asks what your plant can actually do
Screens: BRP / Market → Market registry
(/org/brp/registry) → Register generator
site; IPP Sites → Register with
Market on an unregistered plant; afterwards BRP /
Market → Standing data (/org/brp/standing-data).
Off-taker and Trader file different wizards — those screens, and the
Market Operator’s inspection boards, are §3.9B.
Registering a Trading Unit is not the end of it. Before the market can schedule a plant it wants about thirty facts about what that plant can physically do (§7.2) — and the question is not what the plant is, it is what it can do, minute by minute:
- how fast it loads from minimum generation up to full output, and how fast it comes back down;
- how long it must stay on once it has started, and how long it must stay off once stopped;
- what a start costs in Rand from hot, from warm and from cold, and how long each takes;
- how many megawatts of reserve the System Operator has certified it can hold.
For solar and wind these are all zero or near enough. For anything with a turbine they are real numbers that live in a plant engineer’s head or in commissioning documents, and they are not in any database. That is not a gap in this platform; it is a gap in the industry’s records, and closing it is the longest-lead item in getting a plant to market.
You capture those facts in two places. The first time, the
Register generator site wizard (this section) turns an
operational wheeling plant into a Trading Unit and Point of Delivery.
After that, the Standing data screen is the editor for
a fleet — not a read-only gate. Open a unit with the eye control; every
§7.2 field has an input, its clause, and a provenance you must state. A
value with no provenance is refused. A blank is not written as zero:
type 0 and choose engineering data when
zero is the true answer (solar minimum run time). A zero standing in for
“we do not know” still blocks registration. The Market Operator and
System Operator copies of the same table stay read-only. The journey
around the wizard — who opens it, who supplies what, what happens after
Register — is §3.9A. The field
guide is here.
Three different people have to answer
The standing-data screen groups what is missing by who can answer it, because they are different people on different clocks:
| Who | What they answer | Why nobody else can |
|---|---|---|
| Your plant engineer | ramp rates, run limits, start costs and lead times, capacity | These come from engineering records. Nothing the platform holds can compute them |
| The System Operator | the four certified reserve capacities (§7.2(q)–(t)) | These are certified, not declared. Until the SO certifies, the capacity is zero |
| Your finance team | the account settlement money is paid into (§7.2(c)) | — |
A plant cannot trade until all three have answered.
The System Operator’s answer is the one you cannot hurry, so ask for it
first. You do not have to wait for the SO before you
press Register — §7.1(5) is register-then-supply.
Request certification from the wizard’s last step (§3.7.8);
the SO decides on /so/registry (V12 §6).
3.7.1 How the standing-data wizard is organised
The wizard is not a single long form. It is short rooms in a corridor, under a header that reads SAWEM §7.2 standing data. You can walk into any room by clicking its tab. Incomplete rooms show a red mark; hover them to see what is still missing. Completed rooms show a green check. Back and Continue step through in order. Register appears only when every required field is complete. Nothing is sent until you press it (or Cancel to abandon without filing).
The Site tab is hidden when you opened the wizard from IPP Sites Register with Market — that plant is already chosen.
| Step | Name on screen | What you are answering |
|---|---|---|
| 1 | Site | Which operational generator plant is this Trading Unit? (hidden if already chosen) |
| 2 | Identity | Official name, which capacity figure is MCR, Mingen, EL1, dispatchable (checkbox) |
| 3 | Zone | Which network zone the site GPS falls in |
| 4 | Delivery | Where the meter sits on the network (electrical node; remote access id) |
| 5 | Engineering | Start-up profile, run limits, and the four ramp rates |
| 6 | Finance | The bank account settlement money is paid into |
Register does not wait for System Operator reserve certification. After a successful register you see the new Trading Unit id and may request certification there (§3.7.8).
Follow along. Seat: an organisation with an operational generator site (GPS, a revenue meter, export at least 100 kW). Path: BRP / Market → Market registry → Register generator site, or IPP Sites → Register with Market. You should see the §7.2 header and the step tabs across the top.
The sections below explain every input in plain language.
Required means Register appears only
when every required field is complete. Required fields show a red
* on the label. Optional fields never gate the button.
3.7.2 Step 1 — Site
This step picks the wheeling plant the market seat will speak for. It is required when the tab is shown. Opened from IPP Sites, the tab is omitted and you start on Identity.
The list is not every generator site in the organisation. A site appears only when it is ACTIVE, OPERATIONAL on the grid, has GPS, has a revenue meter, and can export at least 100 kW. Each row shows the site name, technology, export capacity, and meter number. Click a row to choose it — the wizard then prefills later steps from that plant.
If the list is empty, the page says so: bring a site to OPERATIONAL with a meter first (V2 §4).
| Input | What it means | Required? |
|---|---|---|
| Generator site (pick one row) | The operational plant this Trading Unit will be. One click; not a typed name | Required (when this tab is shown) |
3.7.3 Step 2 — Identity (name, MCR, Mingen, EL1, dispatchable)
This step is the plant’s name badge and the three capacity numbers the market will treat as law. The top of every price ladder you ever submit must equal MCR exactly (§3.8), so the choice here is not a label — it is the number that makes or breaks every bid.
| Input | What it means | Required? |
|---|---|---|
| Official name (§7.2(a)) | The name printed on the Trading Unit. Prefills from the generator site name; change it if the market should see a different official title | Required |
| MCR — pick a candidate | Which of the three site capacity figures is the Maximum Continuous Rating — the sent-out megawatts the unit is rated to produce continuously (§7.2(e)). You pick a radio; you do not type a free number. The megawatts come from that site field | Required (a candidate and its source) |
| Decided by | Who made that MCR choice — a name or role the record can stand behind. Empty until you type it | Required |
| Note | Why you chose that figure. Useful when export capacity is a grid-connection cap rather than the plant’s true rating | Optional |
| Mingen (MW) | Minimum generation (§7.2(f)) — the lowest output
the unit can hold stably. 0 for a renewable; a real
floor for thermal plant and for a hybrid with a genset. Prefills
0.000 |
Required |
| EL1 (MW) | Emergency Level 1 (§9.3(4)(c)(vi)) — the output ceiling above MCR, offered as the top block of the production curve. Usually equal to MCR for a renewable (no emergency overload). Prefills to the suggested MCR | Required |
| Dispatchable | Can the System Operator instruct this unit up or down? A checkbox — checked means dispatchable, unchecked means not. Not the same as “flexible”, which is answered per trading period. Defaults to unchecked (not dispatchable). Unchecked is a valid answer | Required (unchecked counts as No) |
Mingen, EL1, and Dispatchable sit on one row (stacked on a narrow screen). Each label shows an i icon; hover it for a short summary of that field.
The three MCR candidates, with the caution the wizard prints under each:
| Candidate | What the number actually is | Caution |
|---|---|---|
| Export capacity (marked closest) | AC megawatts the site record says it can send out | Closest to §7.2(e), but in the records this has sometimes been set by the grid-connection agreement rather than by the plant’s continuous rating. Confirm against the real sent-out figure |
| Inverter capacity | Apparent power (MVA) at the inverter | Before the transformer and before auxiliary load. Not a sent-out MW rating |
| Installed capacity | DC panel capacity (MWp) | Never the sent-out rating. Offered so the record can show why it was not used |
Careful. Prefer Export capacity unless an engineer has confirmed another figure. Installed (DC) capacity is never the Code’s MCR. The platform will not choose for you.
The three numbers must stay in order: EL1 ≥ MCR ≥ Mingen ≥ 0. If they do not, Register is refused — the curve’s top sits under the rating the market requires it to equal. Fix the figures; the market will not sort them.
3.7.4 Step 3 — Zone
This step has no typed field. The platform allocates a network zone from the site’s GPS — never from the Eskom TLF zone on the wheeling record (V12 §2).
| What you see | What it means | Required? |
|---|---|---|
| Allocated to {code} — {name} (green) | The GPS sits inside that zone polygon. The Trading Unit will be registered there | Required — allocation must succeed |
| Zone-gap notice (amber) | The published network model does not cover this location. The nearest zone is shown as context only — the platform will not assign it, because the wrong zone puts the plant in the wrong balancing group and the wrong congestion rules | Blocks Register until the model covers the point (a System Operator job, not a typed workaround) |
An unallocatable GPS is a hard stop in this wizard. Fix the site coordinates if they are wrong; if they are right, the location goes on the list taken to the System Operator. Nothing else about the wheeling site is affected.
3.7.5 Step 4 — Delivery (point of delivery)
This step is the plant’s address on the electrical network — the Point of Delivery the market will meter and settle (§3.4). The meter number and technology are shown as facts from the site; you do not re-type them.
| Input | What it means | Required? |
|---|---|---|
| Remote access id (§7.2(1)(i)(b)) | The identifier used to interrogate the revenue meter remotely. Prefills from the device when the meter already has one. If you type a value here, it is written back onto that device | Optional |
| Electrical node | The network node (bus / connection point) this meter injects at.
Prefills with a site-based placeholder (SITE- plus the
start of the site id) so the field is not blank; replace it with the
node name the network operator uses when you have it |
Required |
Each label shows an i icon; hover it for a short summary of that field.
If the site’s municipality has no registered Distributor party, an amber note says so and flags the row for Market Operator follow-up. That warning is not an input and does not disable Register.
3.7.6 Step 5 — Engineering (start-up, run limits, ramp rates)
This step is the plant engineer’s room. Every field on this tab is required. For solar and wind the wizard prefills the worked renewable mapping: start costs and lead times at zero, run limits at zero, ramp rates equal to the suggested MCR. Those N/A fields are shown disabled (muted) with the assumed value still visible — they do not need typing and do not block Register. Hydro does not share that mapping: start-up, run limits, and ramp rates stay editable (a hydro unit has real commitment constraints). For thermal, BESS, hybrid, and anything else the boxes start empty — zeros here are dangerous (§3.8).
Three flags the Code also asks for — energy-constrained, storage, pumped storage — are not on this tab. The wizard assumes they are off. Set them later on Standing data if the plant is hydro, a battery, or pumped storage.
Start-up profile (§7.2(j)) — eleven values, not twelve. Hot and warm each have a threshold (hours off). Cold is every start above the warm threshold, so there is no cold-threshold box.
| Input | What it means | Required? |
|---|---|---|
| Hot-start threshold (h) | Hours off below which a start counts as hot | Required |
| Hot-start ramp rate (MW/h) | How fast output rises on a hot start | Required |
| Hot-start cost (R) | What a hot start costs in rand | Required |
| Hot-start lead time to synchronisation (min) | Minutes from the start instruction until the unit is synchronised, when the start is hot | Required |
| Warm-start threshold (h) | Hours off above the hot threshold and below which a start counts as warm | Required |
| Warm-start ramp rate (MW/h) | How fast output rises on a warm start | Required |
| Warm-start cost (R) | What a warm start costs in rand | Required |
| Warm-start lead time to synchronisation (min) | Minutes to synchronisation on a warm start | Required |
| Cold-start ramp rate (MW/h) | How fast output rises on a cold start (every start above the warm threshold) | Required |
| Cold-start cost (R) | What a cold start costs in rand | Required |
| Cold-start lead time to synchronisation (min) | Minutes to synchronisation on a cold start | Required |
Run-time limits (§7.2(k)–(l)) — the dangerous-zero pair. A zero is correct for a solar farm and catastrophic for a coal plant: it tells the market the unit may be switched every hour.
| Input | What it means | Required? |
|---|---|---|
| Minimum run time (h) | How long the unit must stay on once it has started | Required |
| Minimum down time (h) | How long it must stay off once shut down | Required |
Ramp rates (§7.2(m)–(p)) — four numbers, not one. They are not interchangeable. Loading and de-loading decide Instructed Energy on an up-instruction and a down-instruction, so collapsing them into one figure changes money.
| Input | What it means | Required? |
|---|---|---|
| Start-up ramp rate (MW/h) | Synchronisation → Mingen | Required |
| Loading ramp rate (MW/h) | Mingen → MCR (Instructed Energy on an up instruction) | Required |
| De-loading ramp rate (MW/h) | MCR → Mingen (Instructed Energy on a down instruction) | Required |
| Shut-down ramp rate (MW/h) | Mingen → off | Required |
Each label shows an i icon; hover it for a short summary of that field.
Certified reserve capacities (§7.2(q)–(t)) are not typed here. They belong to the System Operator. Request them after Register (§3.7.8).
3.7.7 Step 6 — Finance
This step is the one question for your finance team: where settlement receipts land (§7.2(c)). Bank is a card pick of South African banks — each card shows the bank name and its logo, listed alphabetically. The other three boxes start empty. All four are required.
| Input | What it means | Required? |
|---|---|---|
| Bank | The South African bank that holds the destination account — pick a card (name and logo, alphabetic) | Required |
| Branch code | The branch identifier for that account | Required |
| Account number reference | The reference the Market Operator uses to identify the account (not a free-text nickname) | Required |
| Account holder | The name on the account | Required |
This is the payment destination on the Trading Unit, not the Collateral Reserve or Trading Clearing Account you notify when you join as a BRP (§3.1.6, §3.16).
When every required participant tab is green, Register files the Trading Unit and Point of Delivery through the same path the Market API uses. The wizard then moves to the confirmation step.
3.7.8 After you register — TUID and reserve certification
A green confirmation shows the new Trading Unit id (TUID) and official name. That id is the market’s permanent handle for this plant.
You may then request reserve certification — one button per category the wizard offers:
| Button | What you are asking the System Operator to certify |
|---|---|
| Request REGULATING certification | Regulating Reserve capacity (§7.2(q)) |
| Request INSTANTANEOUS certification | Instantaneous Reserve capacity (§7.2(r)) |
| Request TEN_MINUTE certification | Ten-Minute Reserve capacity (§7.2(s)) |
Each request is sent at the unit’s MCR as the requested megawatts. It
does not gate Register — you have already registered.
The SO decides on /so/registry (V12 §6). Until
certified, those capacities are zero and every reserve availability
indicator in a submission is U.
Synchronous Condenser Operation (§7.2(t), MVAr) is the fourth certified category. It is not a button on this confirmation step; request it from the SO registry when the unit needs that carve-out.
Done or Close leaves the wizard. Finish remaining catalogue gaps on Standing data. Modifications take effect under the §7.1(5) 08h00 D−1 rule (deferred when submitted late).
Changing a registered unit — dated, not in place
A registered Trading Unit is not edited in place. Units/Groups (the registry home) and Market › Registry both open an effective-dated modification for MCR, ramps and zone. You name the date the new row starts. Clause 7.1(5) requires the change in writing by 08:00 SAST on the day preceding that date. A request after that cutoff for the next Trading Day is refused and names the cutoff — the console does not silently move the date under you. The API may still schedule D+1; the screen will not.
Pairing a meter after the wizard
The wizard registers a Point of Delivery when it has one. After that, Units/Groups → Registry on the Trading Unit row is where you add, remove or re-pair a meter. An unpaired point is a settlement incident on that card — energy through it cannot be settled for you or the counterparty (§12.3(1)). Removing the last paired point says so; it does not leave a silent empty list.
Trader-pool onboarding will not register one Trading Unit per zone with empty Points of Delivery. It pairs from a signed or active PPA, or it refuses with the remediable reason the register already names. Why that is not “a PPA to join the market”, and what still settles without one: §3.4.
Asking for reserve certification
On Standing data, expand the unit. The reserve board
is no longer display-only: Request certification
(#reserve-cert-request) starts the SO queue. Certified
capacity stays zero until the System Operator decides. Storage units
also show the §7.4 storage profile; hydro / energy-constrained units
show the §7.3 profile. Internal battery parameters (max cycles per day,
degradation cost, minimum spread) are not registry fields.
Uploading a fleet CSV without inventing provenance
Standing data can download the fleet file and upload
it back. A value whose provenance column is blank is skipped or
refused — the importer never invents where a number came from.
That is the same rule the isolated BulkImport helper
already enforced.
The standing-data screen is a work list, not a form
After a unit exists, BRP / Market → Standing data is
the place you maintain it. The IPPs table lists each
registered plant with a Fields count (how many of the
thirty §7.2 answers are supplied, for example 30/30) and an
Actions view icon — hover for View, to
the left of the icon. Click the icon to expand certified reserve
capability and the Trading Unit field cards under that
row (scroll inside the panel). Click View
again to close it. “Eighteen fields missing” tells you nothing you can
act on. So the gate says eleven questions for your plant engineer,
four for the System Operator, one for your finance team, names each
field and the clause that requires it, and says why it is that person’s
to answer. That is three phone calls instead of a red form.
3.8 Why zeros are dangerous
Here is the trap, and it is worth understanding before you fill anything in.
“Minimum run time: 0 hours” is correct for a solar farm and catastrophic for a coal plant.
On a solar farm it is true: there is no commitment constraint, the plant follows the sun, and it can stop and start freely. On a coal plant the same entry tells the market the unit can be switched on and off every hour. The market will believe it, schedule it that way, and the plant will fail to follow a schedule it could never have followed — and you pay the imbalance, not the market.
Nothing about the number distinguishes the two cases. A zero looks like a zero. So the platform records, for every field, where the value came from:
| What it says | What it means |
|---|---|
| engineering data | From the plant’s own engineering records |
| measured | From a commissioning or performance test |
| assumed | Nobody has supplied it and somebody entered something plausible |
| not supplied | No answer. This blocks registration |
0.0 recorded as engineering data registers. The same
0.0 with nobody standing behind it does not. That is the
whole mechanism, and it is the reason the screen refuses a blank field
instead of defaulting it.
Assumptions are allowed, and they are visible.
Refusing to record an assumption does not make it go away — it gets
typed in as though it were engineering data, and then nobody knows. So
assumed is a valid answer that lets a plant register, and
the Market Operator’s console lists every unit that carries one. If a
schedule is ever disputed, the assumed field is where the argument will
be.
Which capacity number is “the” capacity
One field deserves its own note. Your plant record holds three capacity figures — installed panel capacity, inverter capacity, and export capacity — and §7.2(e) wants exactly one of them: the most the plant can send out continuously.
Export capacity is closest and is not automatically right, because export capacity is sometimes set by a grid-connection agreement rather than by what the plant can actually produce. The platform will not choose for you: it shows all three, says what each one is not, and records which you chose and why. That matters more than it looks — the market requires the top of your price ladder to equal this figure exactly, so a wrong number makes every submission you ever make invalid, silently.
3.9 Compliance nudge (≥ 10 MW)
SAWEM expects generators of 10 MW and up to be balance-responsible. Sites that size without a registered book appear here (and wear a “No BRP” chip on the IPP Sites directory). It is a warning, never a block — the platform nudges; the regulator enforces.
3.9A Bringing a generator site to market
Screen: BRP / Market → Market registry
(/org/brp/registry) → Register generator
site, or IPP Sites → Register with
Market on an unregistered plant (site already chosen).
§7.2 standing data is captured at registration, not invented later. The wizard has one job: turn an operational wheeling generator site into a Trading Unit and Point of Delivery through the same registration path the Market API uses.
Every tab and every input — what it means, required or optional — is in §3.7. This section is the journey around that form.
| Who | What they supply |
|---|---|
| The site | Name, GPS → Network Zone, meter number, technology, emissions, remote-access id (when the Device has it) |
| The plant engineer | MCR (chosen from the three site figures — never defaulted), Mingen, EL1, start-up profile, run limits, ramp rates, dispatchable yes or no |
| Finance | Payment destination account |
| The System Operator | Certified reserve capacities (§7.2(q)–(t)) — never typed in by
the participant; request from the wizard’s last step, decide on
/so/registry |
An unallocatable GPS blocks with the zone-gap notice
— the platform does not guess a nearest zone. Register
appears only when every required participant field in §3.7 is filled.
Reserve certification is requested after registration — it does not gate
the button. Gaps the participant is not required to answer stay
registerable exactly as §7.1(5)’s register-then-supply sequence intends;
finish them on Standing data
(/org/brp/standing-data). The same filing is published live
to three registers: the participant Standing data tab,
the Market Operator IPPs sidebar
(/mo/ipps), and the System Operator
Registry (/so/registry). Each row shows
the plant, the organisation name, the BRP ref when the organisation has
one, and how many of the thirty §7.2 fields are supplied. Click the
View icon to expand certified reserve and the §7.2
field cards under that row (click again to close). Modifications take
effect under the §7.1(5) 08h00 D−1 rule (deferred when submitted
late).
Where to go next. Field-by-field wizard (§3.7). The other three seats’ Trading Unit screens (§3.9B). Bid Desk (§4). MO activation (V11 §12). SO registry inbox (V12 §6).
3.9B Trading Unit registration wizards
Three participant seats file a Trading Unit. Each opens a different wizard, because the Code asks a different question of a generator, a consumption site, and a trader pool. The Market Operator does not file units — that seat inspects what the participant already registered.
| Seat | Where you open it | Heading on the wizard | What is filed |
|---|---|---|---|
| IPP | IPP Sites → Register with Market, or BRP / Market → Market registry → Register generator site | BRP Standing Data IPP Registration (from Sites) or Register generator site (from the registry) | One GENERATING unit and its Point of Delivery |
| Off-taker | OffTaker Sites → Register with Market | BRP Standing Data OffTaker Registration | One DEMAND_SIDE unit and its Point of Delivery |
| Trader | Trader Pools → Register with Market | Trader Pool Market Trading Unit Registration | One MIXED unit per selected zone (no meter on the wizard) |
| Market Operator | no filing button | — | Inspects units on Participants → Registrations and IPPs |
The BRP cell on Sites and Pools stays blank until the organisation is an ACTIVE Market BRP with a BRP code. A pending application does not unlock Register with Market. On a site that is not in a published network zone the cell says No Market Zone instead of offering the wizard. A trader pool may register in any published zone — member GPS is not a gate.
After a unit exists, Trading Units
(/org/trading-units) is the directory: TUID, official name,
class, zone, MCR, status, and site or pool. Filters:
Zone and Class.
Where this is taught. IPP field meanings and dangerous zeros: §3.7 and §3.8. The generator-site journey: §3.9A. Zone allocation: V12 §2. Site and pool directories: V2 §3, V2 §4, V2 §5.
How every participant wizard is built
All three wizards share the same chrome. The form is a modal over the page you opened it from (it lives inside the page’s main column — it is not a separate route). The overlay dims the board behind it. Nothing is sent until you press Register.
Header. An eyebrow reads SAWEM §7.2 standing data. Under it, the heading in the table above, then a one-line subtitle. Top-right is an X that abandons without filing.
Stepper. Numbered tabs across the top. You can click any tab — the rooms are a corridor, not a locked sequence. The current tab sits on a white chip with a gold ring. A completed room shows a green check. An incomplete room shows its number and a red triangle; hover the tab for a Still needed list of the missing required fields. The stepper is hidden on the confirmation step.
Footer.
| Control | When you see it | What it does |
|---|---|---|
| Back | every step except the first and the confirmation | Previous room |
| Cancel | every step except confirmation | Abandon without filing |
| Close | confirmation only (same control as Cancel) | Leave after a successful register |
| Continue | every step except Finance and confirmation | Next room |
| Register | only when every required field on every tab is complete | Files the unit(s) |
Register is not a greyed-out button. It is absent until the stepper is all green. Hover the gold button for a short tooltip of what will be filed. If you somehow submit incomplete, a rose banner says Complete every required field before registering. A refused filing shows Registration refused and the invariant that blocked it.
Required labels carry a red *. Optional labels do not.
Several IPP and Off-taker fields have an i icon; hover
it for the clause in one sentence.
3.9B.1 IPP — Register generator site
Path: IPP Sites → Register with Market on an unregistered, allocated plant (site already chosen; the Site tab is hidden). Or BRP / Market → Market registry → Register generator site (you pick the plant on step 1).
Subtitle: Prefills from the site, provenance-stamped, one write path.
| Step | Name on screen | What the room contains |
|---|---|---|
| 1 | Site | Clickable list of ACTIVE / OPERATIONAL generator plants with GPS, a revenue meter, and export of at least 100 kW. Each row: name, technology, export capacity, meter number. Hidden when the plant is already chosen |
| 2 | Identity | Official name; MCR as three radios (Export / Inverter / Installed) plus Decided by and optional Note; Mingen, EL1, and Dispatchable on one row |
| 3 | Zone | No typed field. Green Allocated to {code} — {name} from site GPS, or an amber zone-gap notice. A map of the site pin on the zone polygon |
| 4 | Delivery | Meter number (fact); optional Remote access id; required Electrical node. Amber note if the municipality has no registered Distributor |
| 5 | Engineering | Start-up profile, run limits, four ramp rates. Solar and wind prefill and disable the N/A zeros. Hydro stays editable |
| 6 | Finance | Bank cards (logo + name, alphabetic), then Branch code, Account number reference, Account holder |
Register files the Trading Unit and Point of Delivery on the same path the Market API uses. The confirmation is a green panel: Registered {TUID} and the official name. Three buttons then let you request REGULATING, INSTANTANEOUS, and TEN_MINUTE reserve certification at the unit’s MCR. Done / Close leaves. Finish remaining catalogue gaps on Standing data.
Every input — required or optional, what the number means, why a zero is dangerous — is §3.7. Who supplies what, and the three live registers the filing appears on, is §3.9A.
Follow along. Seat: an IPP organisation that is an ACTIVE Market BRP, with an operational generator site. Path: IPP Sites → Register with Market. You should see the §7.2 eyebrow, heading BRP Standing Data IPP Registration, and the Identity tab first.
3.9B.2 Off-taker — demand-side registration
Path: OffTaker Sites → Register with Market on an unregistered site that sits in a published network zone. The site is already chosen — there is no Site picker.
Subtitle: Register this consumption site as a demand-side Trading Unit.
The unit class is DEMAND_SIDE. Generation-catalogue fields the Code still asks for on every Trading Unit are stamped assumed (zeros; ramps equal declared consumption) so the completeness gate that the IPP wizard satisfies with engineering data does not block a load. You do not type those fields here.
Identity
The room opens with Registering {site name} as a demand-side Trading Unit.
| Input | What it means | Required? |
|---|---|---|
| Official name (§7.2(a)) | The name printed on the Trading Unit. Prefills from the site name | Required |
| Declared consumption (MW, standing default) | The standing megawatt figure used when no period-specific declaration exists (§2.1(53)). Prefills from the site’s estimated monthly kWh ÷ 730. Hover the i for that sentence | Required |
Zone
No typed field. The platform allocates from the site’s GPS — never from the Eskom TLF zone on the wheeling record (V12 §2).
| What you see | What it means |
|---|---|
| Green Allocated to {code} — {name} | The GPS sits inside that zone polygon. Colour swatch matches the SO/MO zone register |
| Amber zone-gap notice | The published model does not cover this location. The closest zone is shown as not assigned. Register stays blocked |
| Map | Site pin on the zone polygon when GPS is present; a dashed empty frame if GPS is missing |
Delivery
The meter number is shown as a fact. A rose banner appears if the site has no revenue meter — a demand-side unit cannot be registered until one is attached.
| Input | What it means | Required? |
|---|---|---|
| Remote access id (§7.2(1)(i)(b)) | Identifier used to interrogate the revenue meter remotely. Prefills from the device when it already has one | Optional |
| Electrical node | Network node this meter draws at. Prefills SITE- plus
the start of the site id |
Required |
An amber note appears when the site’s municipality has no registered Distributor party. That warning is flagged for Market Operator follow-up and does not disable Register.
Demand
This room never blocks Register. The checkbox is a real choice, not a required tick.
The copy says a Demand Side Unit can respond to a System Operator load-curtailment instruction (§2.1(61)), and that accepting curtailment under a PPA is not the same thing.
| Input | What it means | Required? |
|---|---|---|
| Designate as a Demand Side Unit | Checkbox. Checked means the unit is dispatchable as a DSU. Unchecked (the default) is a valid answer | Optional — unchecked counts as No |
Under the label the wizard prints the site’s curtailment
acceptance (yes / no) so you can see
what the wheeling record already said. That fact does not flip the
checkbox for you.
Finance
Same bank-card room as the IPP wizard. All four answers are required.
| Input | What it means | Required? |
|---|---|---|
| Bank | Pick a South African bank card (logo + name, alphabetic). Selected card gets a gold ring | Required |
| Branch code | Branch identifier for that account | Required |
| Account number reference | Reference the Market Operator uses to identify the account | Required |
| Account holder | Name on the account | Required |
This is the payment destination on the Trading Unit, not the Collateral Reserve or Trading Clearing Account you notify when you join as a BRP (§3.16).
After you register
A green panel: Registered {TUID} — {official name}. If a System Operator notice was written, the same panel says SO notice recorded. There are no reserve-certification buttons on a demand-side unit. Close leaves. The Sites BRP cell then shows the TUID above the zone swatch; click either to open Trading Units.
Follow along. Seat: OffTaker A (
offtaker_a@webill.net) — ACTIVE (BRP-OFFTAKER-A). Path: OffTaker Sites → Register with Market on an allocated site that has no TUID yet. You should see heading BRP Standing Data OffTaker Registration and five tabs: Identity · Zone · Delivery · Demand · Finance.
3.9B.3 Trader — pool registration
Path: Trader Pools → Register with Market on a pool, once the organisation is an ACTIVE Market BRP.
Subtitle: One Trading Unit per selected pool zone (§2.1(212)(a)).
A trader pool is not a meter. The wizard files one MIXED Trading Unit per zone you select, because a unit may not span zones. There is no Delivery tab — the pool is not a plant. Behind Register, meters are copied from signed or active physical PPAs whose member sites sit in that zone. If there is nothing to pair, registration is refused. Long / short is not a registration field. Why a pool still needs those meters, and how an empty MIXED unit is fixed afterwards: §3.4.
The Pools BRP cell shows a count once units exist. Hover the number for each TUID and its colour-coded zone; click the count to open Trading Units. Register with Market stays beside the count until every published zone has a unit.
Identity
The room opens with Registering Trading Units for {pool
name}. It previews the official-name pattern:
{prefix} · ZN.
| Input | What it means | Required? |
|---|---|---|
| Official name prefix (§7.2(a)) | Stem printed on every unit this pass. Prefills from the pool name.
Each filed unit becomes {prefix} · {zone code} — for
example T1 Industrial Pool · Z3 |
Required |
Zones
No GPS check. Every published network zone is a card. You may register this pool in any of them.
| Control | What it does |
|---|---|
| Select all zones | Ticks or clears every zone that is not already registered. Disabled when none remain |
| Zone card | Colour swatch, code, name, and a check mark. Click to select or deselect. A gold ring marks a selected unpublished zone |
| Already registered | Card is muted and locked. The check mark stays on. You cannot file a second unit in that zone from this wizard |
Register needs at least one newly selected zone. If every published zone is already registered, the step stays incomplete.
Finance
The same four required answers as IPP and Off-taker — bank cards, branch code, account number reference, account holder. One payment destination is copied onto every unit created in this pass.
After you register
A green panel lists every new TUID, comma-separated, and says one Trading Unit per selected zone. Close leaves. The Pools count updates; hover it to see the new TUIDs and zones.
Follow along. Seat: Trader 1 (
trader_1@webill.net) — ACTIVE (BRP-T1-DEMO). Path: Trader Pools → Register with Market on a pool that still has unpublished zones. You should see heading Trader Pool Market Trading Unit Registration and three tabs: Identity · Zones · Finance. Select all zones sits above the zone cards.
3.9B.4 Market Operator — no filing wizard
The Market Operator does not open Register with Market. Participants file; this seat sees the units.
Participants → Registrations
(/mo/participants). ACTIVE seats only. Columns: BRP
REF, Organization (name + status chip),
Registered, Trading Units,
Actions. The totals line under the table counts
registrations and trading units.
| Trading Units cell | What it does |
|---|---|
| 0 (muted) | The seat has no units. Not a button |
| Count (brand colour, underlined) | Click to expand a table under that row. Click again to close. A chevron shows open / closed |
The expand table is the party’s registered units — not strategy books:
| Column | What it shows |
|---|---|
| TUID | Permanent market handle |
| Official name | The name filed on the wizard |
| Class | Demand side / Generating / Storage / Mixed / Interconnector |
| Zone | Colour swatch + code |
| Status | REGISTERED / SUSPENDED / DEREGISTERED |
| Site / Pool | Generator site, off-taker site, or trader pool name |
View on the row still opens the seat drawer (Suspend / Revoke). That is the party, not the unit.
IPPs (/mo/ipps). Generator filings only
— the units the IPP wizard created. Columns: IPP /
site, Organisation, BRP ref,
TUID, MCR, Fields
(for example 30/30), Actions. The eye icon
expands certified reserve and the §7.2 field cards under that row; click
again to close. New filings arrive live. The participant
Standing data table works the same way. On
/so/registry the eye View opens that IPP
on its own page (/so/registry/ipps/{id}) instead of
expanding the row.
The Market Operator does not type reserve capacities and does not complete a participant’s Finance tab. Those answers stay with the plant engineer, the finance team, and the System Operator (§3.7, V12 §6).
Follow along. Seat: Market Operator (
mo@webill.net). Path: Participants → Registrations. Click a Trading Units count. You should see TUID, official name, class, zone, status, and site or pool — not a Books table. Then IPPs in the sidebar for generator field cards.
3.10 Registration is the boundary of accountability
Your strategy book can forecast and allocate without a market seat. It cannot submit, clear, or receive an imbalance result until the organisation has an ACTIVE registration and the energy sits on a registered Trading Unit. Treat the registration as the legal and financial container; the units are what the clocks see.
PENDING here means “not yet allowed to bid”. The paperwork that turns it into ACTIVE is the fifteen-status board in §3.13A, not a single Activate from arrival. A suspended or revoked registration retains history but cannot produce a new DAM or IDM submission.
| Field you enter | Why the market needs it | What you should verify |
|---|---|---|
| BRP code | identifies the accountable party | matches the MO-issued code exactly |
| roles | states Generator, Load, Trader or Distributor capacity | covers every Trading Unit you will file |
| guarantee | records financial security | is current before activation |
| safety margin | protects a ladder from small price errors | is R 10/MWh unless your policy differs |
| price-taker setting | makes offers use the floor | is deliberate, not a shortcut |
3.11 Register Trading Units in the right order
First create or locate the organisation registration and take it to
ACTIVE. Register with Market stays locked until then.
Then file each Trading Unit from the site or pool it belongs to — not by
attaching a book. Confirm the units on Trading Units
(/org/trading-units) before the first gate: TUID, class,
zone, and status.
- File the registration while it is PENDING.
- Work the application board through to ACTIVE (§3.13A) — or, in the demo, use a seat that is already ACTIVE.
- Return to the registration page and confirm ACTIVE.
- Open Register with Market on each IPP site, off-taker site, or trader pool that should trade (§3.9B).
- Confirm the new TUIDs on Trading Units. A Day-ahead submission names the registration and the unit, not a book.
Follow along. Seat:
trader_1@webill.net(BRP). Path: Trader Pools → Register with Market on a pool that still has unpublished zones — or Trading Units to see units already filed. You should see:BRP-T1-DEMO, an ACTIVE status chip, and TUID + zone + class — not a book attach table.
3.12 The 10 MW nudge is not an approval
An eligible generator at or above 10 MW can appear in the compliance list without a registered Trading Unit. The No BRP chip says the platform has identified an operational risk; it does not decide regulatory eligibility or stop the site. Resolve it by taking the organisation to ACTIVE and filing Register with Market on that site (§3.9B), then retain the evidence outside this screen where your compliance process requires it.
Careful. Deregistering or suspending a Trading Unit prevents future market clocks from using it. It does not alter completed strategy runs, accepted schedules, or monthly market-file history.
3.13 Joining the market, and how long it takes
Everything above is the platform’s view of a registration. This is the Market Code’s. Becoming a Party — the accession — is a statutory process with deadlines on both sides, and the deadlines are counted in business days — so a five-day clock over a long weekend is a calendar week.
| Step | Who | How long | If it is missed |
|---|---|---|---|
| 1. You apply, with the accession fee | you | — | — |
| 2. The MO may ask for more information | Market Operator | 10 business days | the window closes; your application is assessed as filed |
| 3. You answer | you | 20 business days | deemed withdrawn — extendable on written request |
| 4. The MO issues the two agreements | Market Operator | 10 business days | a compliance finding against the MO; nothing happens to you |
| 5. You return them signed | you | 10 business days | deemed withdrawn — extendable on written request |
| 6. …and they must arrive | you | at least 3 business days before the effective date | too late for that date; agree a later one |
| 7. You open an account and tell the MO in writing | you | before the effective date | accession is blocked |
| 8. You become a Party | — | on the effective date | — |
The number everyone asks first: about fifty business days. That is the sum of the four forward clocks — roughly ten calendar weeks — if nobody uses an extension and nobody is late. It is not a target; it is what the Code allows each side, and both sides usually use some of it.
Two things in that table are easy to misread.
Step 2 is a permission, not a promise. The Market Operator may ask for more within ten business days. If it does not, nothing has gone wrong — your application was complete on arrival, and the ten days to issue the agreements start from the day you applied rather than from an answer you never had to give.
Step 6 runs backwards, and it can catch you out even when you are early. The three business days are counted back from the effective date, not forward from anything. Sign on day 2 of your ten and you can still be late, if the effective date is the day after tomorrow. The Market Operator needs those three days to make you live. Your compliance panel shows both dates.
The two agreements
You sign a Market Participation Agreement and a Balancing Agreement. They are not the same document and not the same obligation: one makes you a participant in the day-ahead and intraday markets, the other makes you accountable through the balancing mechanism. A party can be one without the other — a network operator buying its own losses through a designated participant is balance-responsible without ever bidding.
How the console prepares those PDFs, how the Market Operator signs them before you can see them, how you view and countersign them, and how approval becomes activation, is §3.13A · How agreements are issued, viewed and signed.
Asking for more time
Two applicant-owned clocks are extendable on written request,
which the Market Operator shall not unreasonably withhold
(§6.2(5) clarification response, §6.2(7) agreement return). In the
console those states are INFO_REQUESTED and
CONTRACTS_ISSUED. Market Operator clocks — including
PENDING, INFO_SUBMITTED, and
CONTRACTABLE — are not extendable on
request; there is no form for them.
How to file a request
Path: BRP / Market → Registration. While one of the extendable clocks is yours and no request is outstanding for it, the Request more time panel appears under Your application:
- enter how many business days you need beyond the current deadline (1–60);
- enter the reason for the request (required);
- submit Request extension.
The console then shows that a request is with the Market Operator. Your Due date on the page has not changed yet.
What the request is — and what it is not
The Code treats an extension as a thing that happened, not a date somebody edited. The platform therefore keeps a record with:
- when you asked;
- the deadline that was in force when you asked;
- how many business days you asked for (and the date that implies);
- your reason.
Three consequences follow:
- the request on its own moves nothing. If you ask on day 19 and hear nothing, you are still on the original deadline — chase the Market Operator’s Extension Requests queue;
- a refusal must give a reason, because “shall not unreasonably withhold” is otherwise untestable;
- submitting the request broadcasts live to any open Market Operator Participants → Extension Requests tab, so the row appears without the clerk refreshing the page.
When you cannot ask again
You cannot file another extension for the same clock while:
| Situation | What you see |
|---|---|
| A request is still undecided (neither granted nor declined) | Amber banner: request is with the Market Operator; the form is hidden |
| A request for this clock / application state was declined | Rose banner: declined; you cannot ask again while the application remains in this state; the form stays hidden |
A grant is different: after a grant, a later second
extension for the same clock is allowed again (extensions can stack
under the Code). A decline for INFO_REQUESTED does not
permanently bar an extension later if the application moves on and a new
extendable clock starts (for example CONTRACTS_ISSUED) —
the block is per clock / state, not for the whole application
forever.
When the Market Operator decides
You do not need to refresh. An open Registration page receives the decision live:
| Decision | What happens on your page |
|---|---|
| Granted | Flash names the new due date; the Due clock updates to that date (Pending Clocks for the Market Operator moves the same way); the pending banner clears |
| Declined | Flash says the original deadline still applies; the declined banner appears; you cannot open the request form again for this clock |
Until a grant is recorded, quote the original deadline on every call. After a grant, quote the new one — it is the date the daily clock and Pending Clocks both use.
Trading before you are a Party
There is one lawful route: testing and commissioning by agreement with the Market Operator. You may offer energy from plant being commissioned before you accede, and an existing participant may do the same for additional capacity. It is a distinct status, not an early activation — you are not yet a Party, you have no agreement in force, and your volumes are reported distinctly everywhere. That is deliberate: a market notice has to be able to say which megawatt-hours came from plant still under test.
Follow along. Seat: any BRP seat. Path: BRP / Market → Registration → Market Code compliance. You should see your state, whatever clock is running, whose deadline it is, and how many business days are left.
3.13A The application board, step by step
§3.13 is the Code’s version of joining: four clocks and two agreements. This is the console’s version of the same journey. The platform gives the journey fifteen named statuses, so that at any moment you and the Market Operator are looking at the same word for where the application is, and the same date for when it is due.
The statuses refine the Code; they do not replace it. Every period below is one of the Code’s, in business days. Where the Code is specific, the Code wins.
Think of three labels that sit on the same seat and answer three different questions:
| Label | How many words | The question it answers |
|---|---|---|
| Application state | 15 | Where is this application right now? |
| Party state | 7 | Where is this party in Market Code §6? |
| Registration status | 4 | May this seat bid today? |
Application state is the one you work. The other two are derived from it. That is why this section is organised around the fifteen statuses, not around PENDING → ACTIVE. PENDING → ACTIVE is still the honest answer to may I bid today? — only ACTIVE may. Getting there is the journey below, not a single Market Operator button.
The happy path, in plain words
If nothing is missing and nobody is late, joining looks like this.
The Market Operator may ask for more information before CONTRACTABLE. That detour is INFO_REQUESTED → INFO_SUBMITTED, then back onto this rail.
- You file the wizard. The application arrives as pending.
- The Market Operator either asks a question, or decides the file is complete and marks it contractable.
- The Market Operator prepares the two agreements, digitally signs both, and only then issues them to you. Until that issue, you cannot see the drafts.
- You read both on screen and sign them as a pair.
- The Market Operator approves the signed pack.
- The Market Operator activates you. On that day you become a Party and may bid.
That is the whole joining story. Everything else in this section is either a detour (more information, a missed deadline, a withdrawal, a decline) or what happens after you are already a Party (suspension, revocation, coming back).
Two screens, one story
You and the Market Operator never share a page. You share a status.
Your page is BRP / Market →
Registration (/org/brp). The card is titled
Your application. It shows the status, a plain-English
explanation, the Due date if a clock is running, whose
clock it is, any question the Market Operator asked, files you attached,
the agreements once they have been issued, the buttons that are yours,
and a History timeline.
The Market Operator’s page for work still in
progress is Participants → Pending Clocks
(/mo/participants/clocks). Every non-ACTIVE application is
a row: party, status, whose move, the deadline. The eye icon opens a
drawer. ACTIVE seats live on Participants →
Registrations instead — the operational list of who may bid
today. Opening View there is read-only for joining; the
only buttons left are Suspend and
Revoke.
If there is no button on your page, the next step is not yours. The card says so in words: Nothing for you to do — the next move is the Market Operator’s.
What you see on Registration
The Your application card is built the same way in every status. Learn the parts once.
| Part of the card | What it is |
|---|---|
| Status chip | The machine word (PENDING,
CONTRACTS_ISSUED, …) in the same coloured badge as
Participants → Pending Clocks. The italic gloss is not
repeated beside it |
| Explainer | One or two sentences in ordinary English: where you are, how long, whose move |
| Due | The calendar date the clock ends, how many business days are left (or overdue), and whether the clock is yours or with the Market Operator |
| Information request | The Market Operator’s question and your reply, as a conversation — only when one has been asked |
| Supporting files | Files you attached to answer a question. You can View or Download your own files. You can Remove a file only while you are still allowed to submit |
| Your agreements | The issued pack, once it exists. Each row has a status badge and an eye icon (View). There is no download |
| Your buttons | Only the moves that are yours in this status. A second confirmation appears on Sign contracts and Withdraw |
| Request more time | Only while the clock is yours and extendable — see Asking for more time |
| History | Every move so far, as a timeline: from → to, when, who, and any note |
Agreements you have not been issued do not appear. A draft the Market Operator is still signing is invisible to you on purpose.
What the Market Operator sees
Pending Clocks
Path: Participants → Pending Clocks. Columns: Party (code and organisation), State, Whose (Market Operator or applicant), Deadline, and an eye icon (View pending application). An overdue row is tinted rose.
The drawer has four tabs and a sticky Actions strip that stays at the bottom while the details scroll.
| Tab | What is on it |
|---|---|
| Application details | The current clock (clause, owner, deadline, days left — or overdue); the information-request conversation; the filed facts (organisation, code, roles, party type, criterion, VAT, guarantee, the three lifecycle labels); and the Agreements list |
| Files | Everything the applicant attached, with View and Download |
| History | The same timeline the applicant sees |
| Ask for information | A form to send a written question. Shown while the application is
PENDING or INFO_SUBMITTED |
Actions are the Market Operator’s lawful next moves for this status — Request information, Mark contractable, Decline, Prepare contracts, Approve, Activate, and so on. If the next move is the applicant’s, the strip says so and offers no button.
Prepare contracts is not a status change. It creates
the two PDF drafts. Digitally sign sits on each draft.
The application becomes CONTRACTS_ISSUED only after
both drafts have been signed by the Market Operator —
there is no separate “send” button. Signing the second one issues the
pack.
Registrations
Path: Participants → Registrations. This list is ACTIVE seats. Trading Units is the count of registered units on that seat — click the number to expand TUID, official name, class, zone, status, and site or pool (§3.9B.4). View opens the same details / files / history drawer, without Ask and without prepare-or-sign. Suspend and Revoke sit on the sticky footer. Those two buttons change whether the seat may bid today; they are not joining steps.
Where this is taught. Working the Extension Requests queue is V11 §12.5. This section names the clocks that can be extended; that section teaches Grant / Decline.
The four things you can do, and nothing else
Whatever status the application is in, exactly four moves are yours:
| Your button | When it appears | What it does |
|---|---|---|
| Submit information | INFO_REQUESTED |
Sends your written answer and any attached files; the status becomes
INFO_SUBMITTED |
| Sign contracts | CONTRACTS_ISSUED |
Signs both issued agreements in one action; the status becomes
CONTRACTS_SIGNED |
| Withdraw | any status from which withdrawal is lawful | Ends the application; you would have to ask to come back |
| Request reinstatement | EXPIRED, WITHDRAWN, DECLINED,
or REVOKED |
Asks the Market Operator to put the application back in play |
Everything else is the Market Operator’s. Showing you a button that would be refused would be worse than showing none.
Every status
A blank period means no clock, and that is
deliberate. A timer on ACTIVE would expire a live
participant. A timer on WITHDRAWN would expire a decision.
Only the seven statuses in the middle of the joining journey have a
clock.
Use the table as an index; the notes under it are what each screen actually shows.
| Status | What it means | Period | Whose move | Lawful next statuses |
|---|---|---|---|---|
PENDING |
Arrived. The Market Operator is reading it. | 10 | Market Operator | INFO_REQUESTED, CONTRACTABLE,
DECLINED, WITHDRAWN |
INFO_REQUESTED |
It has asked you for something. | 20 | you | INFO_SUBMITTED, EXPIRED,
WITHDRAWN |
INFO_SUBMITTED |
You answered; it is reviewing. | 10 | Market Operator | CONTRACTABLE, DECLINED,
INFO_REQUESTED, WITHDRAWN |
CONTRACTABLE |
Every question answered. Agreements may be prepared. | 1 | Market Operator | CONTRACTS_ISSUED, DECLINED,
WITHDRAWN |
CONTRACTS_ISSUED |
Both agreements signed by the MO and sent to you. | 10 | you | CONTRACTS_SIGNED, REVOKED,
EXPIRED |
CONTRACTS_SIGNED |
You signed both. | 10 | Market Operator | APPROVED, WITHDRAWN |
APPROVED |
The signed pack is approved. | 3 | Market Operator | ACTIVE |
ACTIVE |
You are a Party and may trade. | — | Market Operator | SUSPENDED, REVOKED |
SUSPENDED |
Participation is paused. | — | Market Operator | ACTIVE, REVOKED |
REVOKED |
Participation has ended. | — | you | REINSTATE_REQUESTED |
EXPIRED |
A deadline passed without the next step. | — | you | REINSTATED, REINSTATE_REQUESTED |
WITHDRAWN |
You withdrew it. | — | you | REINSTATED, REINSTATE_REQUESTED |
DECLINED |
The Market Operator said no. | — | you | REINSTATED, REINSTATE_REQUESTED |
REINSTATE_REQUESTED |
You have asked to come back. | — | Market Operator | REINSTATED, WITHDRAWN,
ACTIVE |
REINSTATED |
A doorway back to where it had reached. | — | Market Operator | the status it was in before |
PENDING — arrived, being read
The application has been filed. The Market Operator has ten business days in which it may ask for more. Letting those ten days pass is not a breach — the file is then assessed as you sent it (§3.13). The clock never expires this status.
You see. Chip PENDING. Explainer: the
application is with the Market Operator. Due counts the
ten-day window and says with the Market Operator. No
agreements. No files panel unless a later round left some. Buttons:
Withdraw only. The card says the next move is
theirs.
The Market Operator sees. Pending Clocks row, Whose = Market Operator. Drawer Ask for information is open. Actions: Request information, Mark contractable, Decline. Decline asks for a written reason — that reason is what you will be told.
INFO_REQUESTED — they asked; the clock is yours
The Market Operator has sent a written question. You have
twenty business days to answer (clause 6.2(5)). This
clock is yours, and it is extendable — Asking for more time. If you do not
answer in time, the daily clock moves the application to
EXPIRED. Nobody decided against you; the deadline
lapsed.
You see. Chip INFO_REQUESTED. The
explainer names the twenty days. Due says
yours. The Information request block shows
their question. Supporting files lets you attach
evidence (title required, description optional) and Submit
information with a written response. Request more
time appears unless a request is already outstanding or was
declined for this clock. Withdraw remains.
The Market Operator sees. Whose = applicant. Actions strip: Waiting on the applicant. They can read Files as you attach them. They cannot submit your answer for you.
INFO_SUBMITTED — you answered; they are reviewing
Your answer is in. The Market Operator has ten business days to review it. If that period runs out, the daily clock marks the application contractable anyway — this automatic move favours you.
You see. Chip INFO_SUBMITTED.
Explainer: they have ten days; if they do not act, you become
contractable. Due is with the Market Operator.
The conversation now shows their question and your reply. Files stay
visible (view / download; no remove). Buttons: Withdraw
only.
The Market Operator sees. Whose = Market Operator. Ask for information is available again if the answer was not enough. Actions: Mark contractable, Decline, Request information.
CONTRACTABLE — ready for the two agreements
Every question has been answered. The Market Operator has one business day to get the agreements out. The drafts are prepared on this status; you still cannot see them.
You see. Chip CONTRACTABLE. Explainer:
the agreements will be prepared and issued. Due is
with the Market Operator. Your agreements is
still empty. Buttons: Withdraw only.
The Market Operator sees. Actions include Prepare contracts (amber) while no drafts exist, then Digitally sign on each draft. Until both are signed, an amber note says Digitally sign both agreements to issue them to the applicant. Decline and Withdraw remain lawful. Issue contracts is not a button you press — signing the second agreement issues the pack and moves the status.
If this one-day clock runs out, the daily job prepares the pair (if needed), signs them as the Market Operator, and issues them — so a clerk who is away for a day does not strand you.
CONTRACTS_ISSUED — the pack is in your hands
Both agreements have been signed by the Market Operator and issued. You have ten business days to sign and return them (clause 6.2(7)). This clock is yours and extendable.
You see. Chip CONTRACTS_ISSUED.
Explainer: sign and return within ten business days.
Due says yours. Your
agreements lists both rows: title, reference, clause,
Signed by the Market Operator (name) on date, badge
ISSUED, eye icon View. Opening the eye
shows the PDF in a large window — read it there; you cannot download it
from this page. Sign contracts asks you to confirm that
your signature binds the terms on screen. Request more
time is available. Withdraw is not offered
from here — the lawful exits besides signing are the Market
Operator’s.
The Market Operator sees. Whose = applicant. Agreements show MO signature (name and SAST time) and sent date. Actions: Revoke (with a reason). An overdue row is marked overdue — nothing happens automatically. The daily clock does not expire this status. A person decides. An applicant who signs on day eleven is usually given the day.
CONTRACTS_SIGNED — you have signed; they approve
You signed both. The Market Operator has ten business days to approve the pack.
You see. Chip CONTRACTS_SIGNED.
Explainer: they have ten days to approve. Due is
with the Market Operator. Each agreement now also says and
by you on the date you signed, and the badge reads
SIGNED. View still opens the PDF.
Buttons: Withdraw only.
The Market Operator sees. Applicant signer name with (applicant) and the SAST time. Actions: Approve, Withdraw.
APPROVED — approved; not yet live
The signed pack is approved. Clause 6.2(7) wants three business days between approval and the day you become a Party. On that day the Market Operator activates you.
You see. Chip APPROVED. Explainer:
three business days, then you become a Party. Due is
with the Market Operator. Agreements stay
SIGNED and viewable. No button of yours.
The Market Operator sees. Action: Activate. Pressing it records the written account notification if that tick was still missing, and brings a future effective date forward to the move date, so accession is not blocked by paperwork the clerk is completing in the same step. After Activate, the seat leaves Pending Clocks and appears on Registrations.
ACTIVE — you are a Party
You may trade. There is no clock. The Market Operator may later Suspend or Revoke.
You see. Chip ACTIVE. Explainer: you
are a Party and may trade. No Due. Agreements remain
viewable. No joining button.
The Market Operator sees. The seat is on Registrations, not Pending Clocks. View is read-only for joining. Footer: Suspend, Revoke.
SUSPENDED — paused, not erased
Participation is paused. Bids already accepted for periods before the effective date still stand (clause 6.4). There is no clock.
You see. Chip SUSPENDED. The explainer
says so. No Due. No joining button — coming back from
suspension is the Market Operator’s Activate, not your
reinstatement request.
The Market Operator sees. On Registrations (or the enforcement queues in V11 §12.5). Actions: Activate (lift the pause) or Revoke.
REVOKED — participation has ended
The seat is finished. Your obligations have not: Required Credit Cover stays in place until every amount is paid (clause 15.10(7)(e)). You may ask to come back.
You see. Chip REVOKED. Button:
Request reinstatement.
The Market Operator sees. The seat is no longer an ACTIVE bidder. They wait for your request unless they are working a related enforcement file.
EXPIRED — a deadline lapsed
A clock ran out and the daily job closed the application. This is not a decision against you. You may ask for it to be put back.
You see. Chip EXPIRED. Explainer:
nobody decided against you. Buttons: Request
reinstatement. (The Market Operator can also
Reinstate directly from the drawer when that is the
lawful next step.)
The Market Operator sees. Pending Clocks, no running period. They can reinstate, or wait for your request.
WITHDRAWN — you took it back
You ended the application. You may ask to put it back.
You see. Chip WITHDRAWN. Button:
Request reinstatement.
The Market Operator sees. Same shape as expired, except the history shows it was your move.
DECLINED — they said no
The Market Operator declined, with a reason. Unlike an expiry, this was a decision. You may still ask to be reinstated on that basis.
You see. Chip DECLINED. The history
carries their reason. Button: Request
reinstatement.
The Market Operator sees. The reason they typed is on the timeline.
REINSTATE_REQUESTED — you have asked to come back
Your request is with the Market Operator. There is no clock.
You see. Chip REINSTATE_REQUESTED.
Explainer: the request is with them. You may still
Withdraw the request.
The Market Operator sees. Actions: Reinstate (returns the application to where it had reached), or Withdraw. Activate from here is only lawful if you were ACTIVE before — see Reinstatement.
REINSTATED — a doorway, not a waiting room
The application does not sit here. The platform records the
reinstatement and immediately continues to the status the history says
it had reached. You will see that earlier status, not
REINSTATED, on the next refresh.
Every transition
A transition is one allowed step from one status to
the next. The machine refuses anything else — you cannot jump from
PENDING to ACTIVE, because that would make a
Party with nothing signed.
Who may press the button is fixed by the destination, not by a private list per screen:
- You may move an application to
INFO_SUBMITTED,CONTRACTS_SIGNED,WITHDRAWN, orREINSTATE_REQUESTED. - The daily clock is the only actor that may move an
application to
EXPIRED. - The Market Operator may make every other lawful move.
| From | To | Who | How it happens | What you notice |
|---|---|---|---|---|
PENDING |
INFO_REQUESTED |
Market Operator | Request information (or Ask for information → Send request), with a written question | Their question appears; your twenty-day clock starts; Submit information and file attach appear |
PENDING |
CONTRACTABLE |
Market Operator | Mark contractable | Explainer changes; they can Prepare contracts; you still see no agreements |
PENDING |
DECLINED |
Market Operator | Decline, with a reason | You are told no; Request reinstatement appears |
PENDING |
WITHDRAWN |
you | Withdraw (confirm) | Application ended by you |
INFO_REQUESTED |
INFO_SUBMITTED |
you | Submit information (response required; files optional) | Conversation shows your reply; clock becomes theirs |
INFO_REQUESTED |
EXPIRED |
daily clock | Overnight, after twenty business days | Status becomes expired; you may ask to come back |
INFO_REQUESTED |
WITHDRAWN |
you | Withdraw | Application ended by you |
INFO_SUBMITTED |
CONTRACTABLE |
Market Operator, or daily clock | Mark contractable, or overnight after ten business days | Ready for agreements |
INFO_SUBMITTED |
DECLINED |
Market Operator | Decline, with a reason | Decision against the file |
INFO_SUBMITTED |
INFO_REQUESTED |
Market Operator | Request information again | A new question; a new twenty-day clock |
INFO_SUBMITTED |
WITHDRAWN |
you | Withdraw | Application ended by you |
CONTRACTABLE |
CONTRACTS_ISSUED |
Market Operator, or daily clock | MO Prepare contracts → Digitally sign both (signing the second issues the pack). Overnight, the clock prepares, signs as the Market Operator, and issues | Your agreements appears with ISSUED and View; your ten-day clock starts |
CONTRACTABLE |
DECLINED |
Market Operator | Decline | Decision against the file |
CONTRACTABLE |
WITHDRAWN |
you | Withdraw | Application ended by you |
CONTRACTS_ISSUED |
CONTRACTS_SIGNED |
you | Sign contracts (confirm) | Both badges become SIGNED; clock becomes theirs |
CONTRACTS_ISSUED |
REVOKED |
Market Operator | Revoke, with a reason | Participation ended from the offered pack |
CONTRACTS_ISSUED |
EXPIRED |
lawful, not automatic | The edge exists for a person or a later system rule. The daily clock does not take it | Overdue stays overdue until someone acts |
CONTRACTS_SIGNED |
APPROVED |
Market Operator | Approve | Three-day clock to activation |
CONTRACTS_SIGNED |
WITHDRAWN |
you | Withdraw | Application ended after you had signed |
APPROVED |
ACTIVE |
Market Operator | Activate | You are a Party; seat moves to Registrations |
ACTIVE |
SUSPENDED |
Market Operator | Suspend on the Registrations drawer (reason) | You may not bid; history remains |
ACTIVE |
REVOKED |
Market Operator | Revoke on the Registrations drawer (reason) | Participation ended |
SUSPENDED |
ACTIVE |
Market Operator | Activate | Pause lifted |
SUSPENDED |
REVOKED |
Market Operator | Revoke | Pause becomes an ending |
REVOKED |
REINSTATE_REQUESTED |
you | Request reinstatement | They decide |
EXPIRED |
REINSTATE_REQUESTED |
you | Request reinstatement | They decide |
EXPIRED |
REINSTATED |
Market Operator | Reinstate | Doorway, then back to where it had reached |
WITHDRAWN |
REINSTATE_REQUESTED |
you | Request reinstatement | They decide |
WITHDRAWN |
REINSTATED |
Market Operator | Reinstate | Doorway, then back |
DECLINED |
REINSTATE_REQUESTED |
you | Request reinstatement | They decide |
DECLINED |
REINSTATED |
Market Operator | Reinstate | Doorway, then back |
REINSTATE_REQUESTED |
REINSTATED |
Market Operator | Reinstate | Doorway, then back |
REINSTATE_REQUESTED |
WITHDRAWN |
you or Market Operator | Withdraw | Request (or application) ended |
REINSTATE_REQUESTED |
ACTIVE |
Market Operator | Activate — only if you were ACTIVE before | Straight back to trading |
REINSTATED |
earlier status | system, immediately | Automatic second step after Reinstate | You land on PENDING, INFO_REQUESTED,
INFO_SUBMITTED, CONTRACTS_ISSUED, or
CONTRACTS_SIGNED — whichever the history records |
How agreements are issued, viewed and signed
You sign two documents, and they are treated as one pack.
- The Market Participation Agreement is the contract that lets you into the day-ahead and intraday markets — the rules of the auction hall.
- The Balancing Agreement is the contract that makes you accountable through balancing — the till that settles the difference between what you scheduled and what the meters did.
They are not the same obligation. A party can be balance-responsible without ever bidding. In the console they are still issued together, signed together, and effective on the same date (clauses 6.2(6) and 6.2(7)). You will not be asked to sign one and leave the other.
The wizard’s Agreements step (§3.1.6) is the paper trail you typed at filing — references, dates, ticks. The PDFs themselves are created later, on the application board, as follows.
1. Prepare — drafts the Market Operator can see, and you cannot
Once the application is CONTRACTABLE, the Market
Operator presses Prepare contracts. The platform writes
both PDFs, gives each a reference, and stores them as drafts. On the
drawer they appear under Agreements with a
Digitally sign button. Your agreements
on Registration stays empty. That is the rule: an unsigned draft is not
an offer.
2. The Market Operator signs each PDF
Digitally sign on a draft records the Market Operator’s signature on that document and rewrites the PDF so the signature is in the file. The default signatory on the console is Loyiso Mokoena, Authorised signatory, Market Operator, with the date and time in SAST. Signing one of the two leaves the application where it is. The amber note remains until the second is signed.
3. Issue — only after both are signed
When the second draft is signed, the platform issues
the pack: each agreement’s status becomes ISSUED, the
application moves to CONTRACTS_ISSUED, and Your
agreements appears on your page. There is no extra “Send to
applicant” click. If the one-day CONTRACTABLE clock runs
out first, the daily job does the same work unattended — prepare if
needed, sign as the Market Operator, issue.
4. You view, then you sign
On Registration each issued row shows the title, the reference, who signed for the Market Operator and when, the ISSUED badge, and the eye icon. View opens the PDF in a window over the page. Read it there. Close when you are done.
Sign contracts signs both in one
action. The default applicant signatory on the console is
William Wordsworth, Authorised signatory.
After you confirm, both badges become SIGNED, each row
adds and by you with the date, and the status becomes
CONTRACTS_SIGNED.
Both signatures bind the same terms. If a term changed after the Market Operator signed, your signature would not match and the pack has to be prepared again. That is the protection: you cannot countersign something the Market Operator never saw.
5. Approve, then activate
Approve is the Market Operator accepting the signed
pack (APPROVED). Activate is the step that
makes you a Party (ACTIVE). Activate also completes the
last accession housekeeping: it records that accounts were notified if
that tick was still missing, and it will not leave you waiting on an
effective date that is still in the future — that date is brought to the
day of the move.
Careful. Issued agreements are viewed, not downloaded, on Registration. Treat the on-screen PDF as the document you are signing. The Market Operator can still download supporting files you uploaded; that is evidence, not the contract.
What happens overnight
A job runs once a day, early, before the Market Desk opens. It makes exactly three moves, each only when that status’s period has run out:
| From | To | Why |
|---|---|---|
INFO_REQUESTED |
EXPIRED |
you did not answer within your twenty business days |
INFO_SUBMITTED |
CONTRACTABLE |
their ten business days to review ran out — this one favours you |
CONTRACTABLE |
CONTRACTS_ISSUED |
the pack is prepared, signed as the Market Operator, and issued |
Nothing else moves automatically.
PENDING never expires: the ten days to ask a question are a
window that closes, not a duty they breached. An overdue
CONTRACTS_ISSUED is shown as overdue, nothing happens
automatically and waits for a person.
Every change reaches you
Each status change sends you a notice with three things: where the application now is, what that means, and what happens next — including the deadline and whose it is.
If the platform cannot reach you, the change is not marked as communicated. It stays on a queue the Market Operator can see, and the daily job retries. A change that was never delivered is visible as undelivered rather than assumed to have arrived.
Reinstatement puts you back where you were
An application that expired, was withdrawn or was declined can be
reinstated. It returns to the status it had actually
reached, read from its own history, not to the beginning. One
that never got past PENDING starts again there, because
there is nothing earlier to restore.
REINSTATED is a doorway: the platform logs the
reinstatement and continues immediately to that earlier status.
One rule on the way back is worth reading twice: a
reinstatement request can only go straight to ACTIVE if you
were active before. If you never were, you have never signed
the agreements clause 6.2(7) requires, so you are put back where you had
reached and you finish the application.
Follow along. Seat: any BRP seat. Path: BRP / Market → Registration → Your application. You should see the status, the plain-English explanation, the deadline and whose it is, your agreements if they have been issued (eye icon, no download), your own buttons, and History. From the MO seat: Participants → Pending Clocks → eye icon, then Details / Files / History / Ask and the sticky Actions. After Activate, the same seat is on Participants → Registrations → View.
3.14 What happens if you get it wrong
Nothing here happens suddenly, and every step has a date you can see.
A default is not a suspension. You keep trading through the first two steps, and the whole point of the delay is that you have time to fix it.
A Default Notice tells you three things, and it has to: what the default is, how long you have to fix it, and anything else the Market Operator reasonably requires. The remedy time is at least two business days and is often more — your panel shows the date you were actually given and the statutory minimum, so you can see whether you were given extra.
You are still trading while in default. This surprises people in the opposite direction from the rest of this section: a default does not stop you bidding. It cannot, or the remedy period the Code gives you would be worthless.
A suspension order cannot issue until one business day after the notice. And when it issues, it does not bite immediately: it takes effect only after a delay period set by the Market Governance Committee, counted in business days, and different for demand-side units and generators. Between the order and its effective date you are still in the market. Before it bites, the MGC can amend or lift it — for some of your Trading Units and not others.
Two protections are worth knowing by name.
Credit cover. No suspension order may issue solely because your credit cover was absent during a period you were permitted to replenish it, or during the ten business days you are allowed to find a new Credit Cover Provider. Losing a provider is not the same event as being in default. Note solely: if you are also in breach of something else, that other ground is not protected.
Demand. A suspension cannot take effect at all in respect of a demand-side unit unless the Market Governance Committee has directed that the demand at that unit will be met by a Default Retailer. Suspending a load does not stop the load — the electricity keeps flowing and somebody has to be settled for it — so until an alternative supplier is arranged, the suspension is on the file and doing nothing. Your panel and the MO’s board both show that as blocked, with the reason.
Leaving. Termination, voluntary termination and deregistration all end your participation. What they do not end is §3.15.
3.15 Pay now, argue later
The single most surprising rule in the Code, and the one worth reading twice:
Payment obligations continue notwithstanding any query, dispute, shortfall, bad debt, default, suspension, deregistration or termination.
A disputed invoice is still due on its due date. If your dispute succeeds, the correction arrives through a Settlement Rerun — not by the original invoice going away. There is no netting-off while an argument is open, and no grace period for one.
The same principle runs past the exit:
- your Required Credit Cover stays in place until every amount is paid — not until you terminate, which can be months earlier;
- each deregistered Trading Unit keeps its Fixed Credit Requirement until the last Settlement Rerun for the day it was deregistered. That date is not knowable in advance: a rerun can be triggered any time data is revised, so the requirement is released when the last rerun has actually run, never on a timer.
Money stays computable for a party that no longer trades. That is not an oversight in the design; it is the design.
3.16 The three accounts, and which money is yours
When you join the wholesale electricity market, money stops moving directly between you and the people you trade with. It moves through the Market Operator instead. To do that, the Market Operator keeps three bank accounts at one bank — the Market Bank — and all three are in the Market Operator’s own name, not yours. Your money sits inside one of them under a label with your name on it. That is the whole idea, and almost every question about these accounts is really a question about what that label does and does not give you.
| Account | In one sentence | Everyday comparison |
|---|---|---|
| Trading Clearing Account | The market’s current account — everyone’s trading money flows in and out of it every month | The office petty-cash tin everybody pays into and gets paid out of |
| Collateral Reserve Account | Your safety deposit, which you cannot take back on request | A rental deposit held by the landlord |
| Market Operator Charge Account | The Market Operator’s own fee income, fenced off from everything else | The shop’s own till, separate from customers’ layby money |
They look like one thing with three labels. They are not, and the differences decide what you can do.
| Account | Whose name | Can you withdraw? | Interest to |
|---|---|---|---|
| Trading Clearing Account | the MO’s, on trust | yes | you |
| Collateral Reserve Account | the MO’s, sole name | no | you |
| Market Operator Charge Account | the MO’s, ring-fenced | n/a | the MO |
Six words you need first
In the Market Operator’s name. The bank’s records show the Market Operator as the account holder. If you telephoned the Market Bank, it would not discuss the account with you. You are not the customer; the Market Operator is.
On trust. The Market Operator holds money that legally belongs to you. Think of a conveyancing attorney holding your deposit while a house sale goes through: it is in their trust account, they control the movements, but it is your money and they cannot spend it on their own business. Two consequences follow: the Market Operator must not mix it with its own money (§15.2(4)), and any interest it earns is yours, because it is interest earned on your money.
Sole name. No trust. The account belongs to the Market Operator outright, and your claim on what is inside it is weaker than in a trust account. This is deliberate for the Collateral Reserve Account, and the next subsection explains why.
Designation. A label inside the account that says which participant a slice of the money belongs to (§15.2(2)). One real bank account, many labels.
First fixed charge. A legal lock. Money under a fixed charge cannot be paid away to anyone until the person holding the charge is satisfied. Comparable to a bond over a house: the house is yours but you cannot sell it and keep the proceeds while the bank’s bond stands. Here the Market Operator holds the charge as trustee for market creditors — meaning it holds the lock on behalf of whoever the market ends up owing money to, not for its own benefit.
Ring-fenced. Walled off. Money in a ring-fenced account may not be reached to cover someone else’s problem, ever, no matter how bad the problem is.
The Trading Clearing Account
The market’s shared current account. Every month, every participant that owes the market pays into it, and every participant the market owes gets paid out of it. Your slice is your designation inside it.
Everyday comparison. The office coffee tin. Everyone who owes for coffee drops money in; the person who bought the beans takes money out. The tin is one tin. Whose money is whose is a matter of the list stuck to the lid, not of separate tins.
Money in: your payment of a market Invoice (a bill from the Market Operator to you). Money out: the Market Operator’s payment of a Self-Billing Invoice — a bill the Market Operator writes on your behalf, to itself, because the market owes you. You do not have to invoice the market; it invoices itself for what it owes you (§2.1(178)). Money out, unhappily: if you default, your balance here can be applied to what you owe.
| Question | Answer | Clause |
|---|---|---|
| Whose money is it? | Yours. The MO holds it on trust | §15.2(4) |
| Can you withdraw your balance? | Yes | §15.1(5)–(7) |
| Can the MO mix it with its own money? | No | §15.2(4) |
| Who earns the interest? | You | §15.2(4) |
| Can it be used to cover a shortfall? | Yes | §15.3.4 |
The account is shared. Your money and every other participant’s money are in the same real bank account. You are not exposed to their trading losses — the designations keep the arithmetic straight — but the timing of the market’s cash does affect you, and the worked month below shows exactly how.
The Collateral Reserve Account
Where the cash part of your security sits. The market will not let you trade on nothing but goodwill: before you can run up a bill, you have to put up something the market can grab if you stop paying. That something is Posted Credit Cover, and it can be either a bank guarantee or cash. The cash goes here.
Everyday comparison. A rental deposit. You paid it, it is your money, the landlord holds it, and you cannot ring up in month six and ask for it back because you are short that month. It comes back when you move out and nothing is owed — not when you would like it.
This is the single most important rule about this account, and it has a one-line justification:
Cover you could withdraw at will would be cover only until the moment it was needed.
The one moment the market needs your deposit is the moment you are in trouble — which is exactly the moment you would want it back. So §15.2.1(5) removes the option. The account is in the Market Operator’s sole name (not on trust), with a first fixed charge in its favour as trustee for market creditors (§15.2(2)). The platform refuses a withdrawal request and names the clause. It still records the request, because a run of withdrawal requests during a cash squeeze tells the Market Operator something worth knowing.
| Event | Effect on this account |
|---|---|
| You post cash cover | money in |
| Your required cover goes up and you top up | money in |
| You fail to pay an invoice | the MO draws on it to cover the gap |
| Your obligations end and nothing is owed | released back to you |
| You ask for it back for any other reason | refused, with the clause |
Release is an outcome, never a request. Posted cover is released when the obligations it secures have gone.
If your cover is a guarantee rather than cash, the guarantor is a Credit Cover Provider — see Who can provide credit cover below.
The Market Operator Charge Account
The Market Operator’s own income. It charges fees for running the market, and those fees land here.
Everyday comparison. The shop’s own till, kept separate from the customers’ layby payments. The shopkeeper can spend what is in the till. They cannot dip into layby money — and they cannot be made to put till money into the layby drawer to cover a customer who never came back.
Its balance may never be used to cover a shortfall or a bad debt (§15.3.4(6)). Not “should not”. Never. If it could, the Market Operator’s fee income would quietly be underwriting the market it administers — it would become a participant in the risk it is supposed to referee. So when the cascade in the worked month runs out of money, it does not reach into this account.
| Event | Effect |
|---|---|
| Market Operator charges are invoiced and paid | money in |
| The Market Operator pays its own costs | money out |
| Somebody defaults and the market is short | nothing. Ever. |
You never see inside this account, and nothing you do moves it except paying your MO charges.
A worked month, with real numbers
Everything below is arithmetic you can check. Dates are business days from the gazetted holiday calendar, not counted on fingers. The four parties are a teaching cast for this month — not the demo seats.
| Party | What they do | Position for August 2026 |
|---|---|---|
| Sunfields Solar | generates and sells | market owes it R 900 000 |
| Windgap Wind | generates and sells | market owes it R 300 000 |
| Kalahari Trading | trader, bought more than it sold | owes R 500 000 |
| Metro Foods | factory, consumes | owes R 700 000 |
Owed to parties = R 1 200 000. Owed by parties = R 1 200 000. It balances, and it must — the market does not create or destroy money, it only moves it between participants.
| Step | Date | Time | Why this date |
|---|---|---|---|
| Statement issued | Mon 7 Sep 2026 | — | the month’s figures are final |
| You pay your invoice | Thu 10 Sep | by 12:00 | 3 business days (§15.3.4(2)(d)) |
| The market pays you | Fri 11 Sep | by 17:00 | 4 business days (§15.3.4(2)(e)) |
Why the extra day? The Market Operator must collect before it distributes. It has no money of its own in this loop — it is passing yours along. The one-day gap is the market’s cash-flow buffer, and it is the reason a non-payment hits other participants in the same month rather than the next.
Scenario A — everybody pays.
flowchart LR
K["Kalahari Trading<br/>pays R 500 000"] --> TCA
M["Metro Foods<br/>pays R 700 000"] --> TCA
TCA["Trading Clearing Account<br/>R 1 200 000 in · R 1 200 000 out"]
TCA --> S["Sunfields Solar<br/>receives R 900 000"]
TCA --> W["Windgap Wind<br/>receives R 300 000"]
The account ends at zero. That is normal and healthy: it is a pass-through, not a savings account. Nobody’s Collateral Reserve Account moved. The Market Operator Charge Account was not involved.
Scenario B — Metro Foods pays short, and it reaches other people’s money. This is the scenario worth understanding, because it is the only one where your account balance depends on somebody else’s behaviour.
Metro pays R 400 000 instead of R 700 000. It is R 300 000 short. A short payment is not a smaller payment. §15.3.4(2)(d) requires payment in full, without deduction or set-off, so what Metro has actually created is a Shortfall of R 300 000 — whatever Metro believes it is owed on something else.
Step 1 — the tin is short.
| R | |
|---|---|
| Kalahari paid | 500 000 |
| Metro paid | 400 000 |
| In the Trading Clearing Account | 900 000 |
| Owed out | 1 200 000 |
| Gap | −300 000 |
Step 2 — call Metro’s deposit. Metro had posted R 250 000 of cash cover in its Collateral Reserve Account. The Market Operator draws all of it. Metro’s deposit is gone. Metro must put it back by 17:00 on Mon 14 Sep — the second working day after the notice (§15.10.2(2)). Until it does, it is short of cover as well as short of cash.
| Collateral Reserve (Metro) | Trading Clearing Account | |
|---|---|---|
| Before the draw | R 250 000 | R 900 000 |
| Draw | −R 250 000 | +R 250 000 |
| After | R 0 | R 1 150 000 |
| Still short | R 50 000 |
Step 3 — the remaining R 50 000 comes off the creditors, pro rata. This is the debit-note cascade. There is no more money, so the people expecting to be paid are each paid slightly less, in proportion to what they were owed.
| Creditor | Owed | Share of total | Reduction | Actually receives |
|---|---|---|---|---|
| Sunfields Solar | 900 000 | 75.0 % | −37 500 | 862 500 |
| Windgap Wind | 300 000 | 25.0 % | −12 500 | 287 500 |
| Total | 1 200 000 | 100 % | −50 000 | 1 150 000 |
R 1 150 000 paid out of R 1 150 000 held. The account closes at zero again.
flowchart LR
K["Kalahari Trading<br/>owes R 500 000"] -->|"pays in full"| TCA
M["Metro Foods<br/>owes R 700 000"] -->|"pays R 400 000 — short R 300 000"| TCA
MCRA["Metro's Collateral<br/>Reserve Account<br/>R 250 000"] -->|"drawn in full"| TCA
TCA["Trading Clearing Account<br/>holds R 1 150 000<br/>owes out R 1 200 000"]
TCA -->|"R 862 500 — reduced R 37 500"| S["Sunfields Solar<br/>expected R 900 000"]
TCA -->|"R 287 500 — reduced R 12 500"| W["Windgap Wind<br/>expected R 300 000"]
MOCA["MO Charge Account"] -.->|"never — §15.3.4(6)"| TCA
This is how these accounts interact with other traders’ accounts: they interact through the pool. Sunfields did nothing wrong, has no relationship with Metro Foods, and still receives R 37 500 less this month — because it is a creditor of the market, and the market was short. Not a bug; the design. And it is why credit cover exists at all: Metro’s deposit absorbed R 250 000 of the R 300 000 before anybody else felt it.
What did not happen: the Market Operator Charge Account was never touched. Its balance could have covered the R 50 000 comfortably. §15.3.4(6) forbids it.
The follow-up. When Metro pays the R 50 000 late, with interest, the Market Operator credits Sunfields and Windgap back in the next cycle. The cascade is a timing shift, not a write-off — unless Metro never pays, at which point the shortfall becomes an Unsecured Bad Debt and the reduction becomes permanent.
The sharing basis in this picture is what each creditor was owed, so you can see the three accounts move. The Code’s collection basis is actually what each creditor paid into the market that month — two different numbers, which is why a net buyer can owe cash after somebody else defaults. That surprise, and the Excess Participant, is §15.3.
Two more things about accounts.
Before you can accede you must have opened a Collateral Reserve Account or a Trading Clearing Account as required and told the Market Operator in writing. Opening one and saying nothing does not satisfy the requirement, and accession is blocked until the notification is on file — not reminded about afterwards. A live participant with no account produces an invoice with nowhere to charge it.
Not the same as a Trading Unit’s payment destination. The bank details on a Trading Unit are where you want your settlement receipts sent, and they are per unit because different units can have different funders. The three accounts above are party-level and in the Market Operator’s name. The difference between them is the difference between money held on trust and money paid away.
Where the money actually is, and how you move it
§3.16 explains what the three accounts are. This is how you use them on the platform: two screens, and two kinds of movement you start yourself.
| Who | Screen | What it is |
|---|---|---|
| You | Market Accounts
(/org/market-accounts) |
Your own bank account, your two designations, invoices, and both statements |
| The Market Operator | Accounts (/mo/accounts) |
All three market accounts, every designation, every bank transaction, this month’s cash, and the monthly fee |
Two buttons that move money: Add funds, and Pay
Both sit on Your money, next to your own-bank balance. They are easy to confuse and they are not the same transaction.
Add funds is a deposit into your own bank account. It is money arriving from your own business. It has nothing to do with the market. Your own-bank statement labels it that way so it can never be mistaken for market income. The market accounts do not move. You press it when the operating balance is too low to post cover or pay an invoice.
Pay is a deposit into the Collateral Reserve
Account — cash credit cover, under your BRP designation
(BRP-…/COLLATERAL_RESERVE). It leaves your own bank account
and lands in the market’s Collateral Reserve, labelled as yours. Once
posted it cannot be withdrawn on request (§15.2.1(5)). The confirmation
box says so before you press the button. On the Market Operator’s board
the same movement appears under Recent deposits, with
your BRP code and designation.
A third movement you start yourself is Pay by EFT on an invoice. That is a payment, not a deposit: it leaves your own bank account and lands in the account the invoice names.
| What you press | What it is | Leaves | Lands |
|---|---|---|---|
| Add funds | Deposit from your own business | outside the market | your own bank account |
| Pay | Deposit of cash credit cover | your own bank account | Collateral Reserve, under your designation |
| Pay by EFT on a trading invoice | Payment of what you owe the market | your own bank account | Trading Clearing |
| Pay by EFT on a Market Operator Charge | Payment of the monthly fee | your own bank account | MO Charge Account |
Every one of those is an EFT (§15.2(7)). There is no other payment method. And none of them can exceed the balance in your own bank account. The amount field is capped at that balance; submitting more is refused and nothing moves. An account that could go negative would be inventing money.
The organisation screen — Market Accounts
Path: Market Accounts
(/org/market-accounts) → Your money. The
sidebar item sits under Configuration.
Your own bank account is the only account that is really yours. It opens with R3 000 000 when your registration is created, because you need funds before you can post cover or pay a first invoice. It is not one of the three §15 accounts. The card shows the name, the masked number, the balance, and any amount already instructed but not yet settled. Add funds and Pay sit on the right. If you are short of what you owe the market, a warning appears here — before the due date, not at 12:00 when it is too late.
Invoices and payments due. Each outstanding document shows its kind, reference, status, what is still owed, and Pay by EFT. A trading invoice pays into Trading Clearing. A Market Operator Charge — the monthly fee the Market Operator sets on its own Accounts screen — pays into the MO Charge Account. An unpaid MO charge is not a Shortfall: it does not draw your cover and it does not cascade onto other participants.
Tick Automatic EFT for the monthly Market Operator fee if you want that invoice paid the moment it arrives, from your own bank account, provided the balance covers it in full. If you cannot afford it, the invoice stays and you pay it by hand after Add funds.
Three things the screen does that are worth knowing about in advance:
- It tells you if you cannot afford a trading invoice, before the due date.
- It will not let you overdraw. A payment larger than your own-bank balance is refused.
- It lets you pay a trading invoice short, and warns you what that means. Paying short is not a smaller payment. §15.3.4(2)(d) requires payment in full, so the balance becomes a Shortfall: your posted cover is drawn, and any remaining gap comes off other participants’ receipts. The confirmation box says so before you press the button.
Your slices of the market’s accounts. Two cards — Trading Clearing and Collateral Reserve — with your designation and your balance. You do not have your own Trading Clearing Account; you have a designation inside the market’s one. The Collateral Reserve card carries the warning that you cannot withdraw it. You never see inside the Market Operator Charge Account. Its fees appear on your statement as deductions from Clearing, labelled Market Operator fees.
Your statement. Two of them, both expandable. Statement lists every movement in and out of your designations, each with a sentence explaining it. Your own bank statement lists your own account with a running balance, like an ordinary bank statement.
The line that matters most. If a month ever comes where you are paid less than your Self-Billing Invoice, your statement carries two lines: what you were paid, and a reduction that says why — “the market collected less than it owed, and you were 75 % of the creditors that cycle”. You did nothing wrong; somebody else did not pay, their cover did not cover it, and §15.3.4 spreads the rest across the creditors in proportion. Being told which and by how much is the difference between a dispute and an explanation.
Follow along. Seat: any BRP seat. Path: Market Accounts (
/org/market-accounts) → Your money. You should see your own bank account with Add funds and Pay, two cards for Trading Clearing and Collateral Reserve, the automatic-EFT tick for the monthly fee, and any outstanding invoices with Pay by EFT. Open Pay, enter an amount no larger than your balance, and confirm: the Collateral Reserve card updates under your BRP designation. Add funds only raises your own-bank balance.
The Market Operator screen — Accounts
Path: Accounts (/mo/accounts). This is
the other side of every movement above.
The reconciliation line is first, because it can invalidate everything below it. Each of the three accounts must have a bank balance equal to the sum of the designations inside it. When they agree, the line says so. When they do not, it names the account and the difference — a money event has written one layer and not the other.
The three account cards. Trading Clearing, Collateral Reserve, and the MO Charge Account. Each shows the bank balance, the designated total, and — where money sits — every BRP designation and its slice. The MO Charge Account is marked ring-fenced: its balance may never be applied to a shortfall (§15.3.4(6)).
View transactions on each card opens that account’s bank statement: date, what happened, amount, running balance. A Pay on the organisation screen appears here as a credit-cover deposit on the Collateral Reserve. A Pay by EFT on a trading invoice appears on Trading Clearing. A monthly fee appears on the MO Charge Account.
Recent deposits lists cash cover as it arrives — date, BRP, designation, amount — so a posting on Market Accounts is visible here without a refresh.
The monthly tariff lives on the MO Charge Account card. Set the amount in rand and press Save and charge this month: every ACTIVE organisation is issued a Market Operator Charge invoice for that amount. Issue this month’s invoices bills anyone not yet charged this period, without changing the tariff. Organisations that have automatic EFT on, and that can afford it, are paid at once into this account; the rest stay outstanding on their Market Accounts screen.
Cash position is this billing month: expected in, received, the gap, and what is still to be paid out. That is the number that decides whether a cascade is needed. Who cannot pay lists participants whose own-bank balance is already short of what they owe — before the due date. If a cascade is needed, the board says so and reminds itself that the MO Charge Account is not available for one.
Follow along (Market Operator). Path: Accounts (
/mo/accounts). Confirm the reconciliation line is green, open View transactions on Collateral Reserve after a participant has pressed Pay, and find their BRP on Recent deposits. On the MO Charge Account card, set a monthly tariff (for example R 5 000) and Save and charge this month. Then, as that organisation, open Market Accounts and find the Market Operator Charge invoice.
Who can provide credit cover
A Credit Cover Provider must be a bank holding a South African banking licence, or an international bank authorised to provide banking services in South Africa. Nothing else qualifies — not a parent-company guarantee, not an insurer, however well capitalised. Credit cover has to be callable on demand by the Market Operator on the day the participant it covers has stopped paying, and a guarantee from an entity with no banking authorisation is a promise that has to be litigated at exactly that moment.
If your provider withdraws, you have ten business days to appoint another, and no suspension order may issue solely because cover is absent in that window.
Where this is taught. V3 teaches book structure and risk limits. V21 teaches seed, worker and operational recovery procedures.
Data. full_demo · seed 42 · stage S08 (market loop) · registration example
BRP-T1-DEMOfor T1 Industrial Pool.
4. The Bid Desk
Screen: Bid Desk (/org/brp/bid-desk).
Daily is the front door. Submissions, IDM, Forward, Settlement and
Imbalance share a Trading Day and a Trading Unit. DAM and IDM bids for
registered books still live here: build, submit, watch clearing, drill
provenance. Settlement and Imbalance are Bid Desk rooms for the
delivered day (V10
§12.6, V10 §12.7).
The Billing Period wallet is Market Month (V10 §13). The
organisation screen map for this desk is V10 §12. The Market Operator
reads the same day on Bidding
(/mo/bidding) — V11 §12.7.
Do not look for a sidebar item named Bidding on this seat.
4.1 From run to net position
The bridge from book to market is the hourly net position. Read the latest completed strategy run (NOMINATED if fresh for the trading day, else FORECAST). For each SAST hour:
net (MWh) = Σ spill (long, +) − Σ shortfall (short, −)
Decomposition is kept — each component carries the opportunity cost strategy already computed (V3).
Worked example — hour 12 (canonical BidBuilder demo). Two spill lines: firm take-or-pay 5.00 MWh (spill value 0) and wind 1.71 MWh (spill value 40 c/kWh). Net: +6.71 MWh long, decomposed as
[firm 5.00 @ 0c, wind 1.71 @ 40c].A P90 evening hour: firm-demand shortfall 6.0 MWh, Eskom top-up 210 c/kWh. Net: −6.0 MWh short.
Provenance: unit-test / BidBuilder worked ladder (same numbers as M6 gate narrative). Not a sealed-DB statement line — re-run the Bid Desk against your book for live figures.
4.2 The bid ladder
Never sell below what the energy is already worth to you; never pay more than the gap would otherwise cost — then apply the safety margin. Markets quote R/MWh (1 c/kWh = R 10/MWh).
| Direction | Pricing |
|---|---|
| Offers (long) | Each component → rung at
max(opp. cost × 10, floor) + safety margin, cheapest
first |
| Buys (short) | One line for the gap at
min(cheapest avoided × 10, cap) − safety margin |
| Price taker | Every offer rung collapses to the market floor |
The ladder is how this desk prices rungs. What the Market Operator stores and clears is the curve on a Submission — §4.8.
Hour 12 ladder. Firm:
0 × 10 + 10→ 5.00 MW @ R 10/MWh. Wind:400 + 10→ 1.71 MW @ R 410/MWh. Short evening:210 × 10 − 10→ 6.0 MW limit R 2 090/MWh.
Open-position clamp. If the book has an
OPEN_POSITION_MW risk limit (V4
risk limits), no hour may exceed it. Excess is dropped; every clamp
is logged as a clip on the Bid Desk.
The forecast provenance popover includes the latest day-ahead nMAE, measured P90 coverage, and paired-hour count. A missing row says no scorecard. Open the plant’s Forecast page for the weekly source comparison and XML packs. The chip is evidence for the trader’s judgement; it adds no automated bid gate.
4.3 Clearing and DAM uplift
SAWEM is blind, uniform-price: offers clear when rung ≤ SMP, buys when limit ≥ SMP — everything trades at SMP, not at your bid.
At hour 12 with prototype SMP R 980/MWh, both rungs clear:
revenue = 6.71 × 980 = R 6 575.80 counterfactual = 1.71 MWh @ 40 c/kWh = R 684.00 DAM uplift = 6 575.80 − 684 = R 5 891.80That uplift is what the MARKET dashboard panel accumulates. The R 980 hour is the desk demo (BidBuilder canonical ladder). The Code price on the golden day is R 900 at 18:00 — §4.12.
Bid status: DRAFT → SUBMITTED → ACCEPTED / PARTIAL / REJECTED / EXPIRED. Past the DAM gate without submit → EXPIRED + critical gate-miss alert. A rollover is not a sixth status on this desk: it is the Market Operator writing a Submission from your last accepted horizon (§4.10).
4.4 Cross-book netting
When one registration balances several books, the market settles the registration, not each book. Long and short books in the same hour are netted; only the residual is bid. Component ladders merge — prices are never blended; attribution keeps each book truthful at SMP.
Hour 12: trader +6.71 MWh, IPP −2.00 MWh → netted +4.71 MWh one OFFER. Revenue
4.71 × 980 = R 4 615.80equals the gross trade at SMP. What you gain is execution risk and open-position headroom (8.71 → 4.71 MWon the Bid Desk badge).
4.5 What you do on the screen
Open Bid Desk → Submissions. Pick a Trading
Unit (the TUID is in the URL when you arrive from a Daily unit
action — the first-registered unit is not a silent default). The live
object is a 168-period WB.Sawem.Submission. A line that has
not left the desk shows the banner: This draft has not been sent.
Review the automation level in Controls to see whether the worker may
send it. You have two ways the same payload leaves this desk:
- Automatic. Under AUTO_WITHIN_LIMITS,
SubmitDamBidsruns at 03:00 SAST on D−1 and, after the participant checks,PUTs the Submission to/api/v1(WB.Brp.MarketClient.put_submission/4). You do not have to sit here at three in the morning. - Manual. Submit on this screen calls that same HTTP path — the object Validate already checked. Use it when you rebuilt after 03:00, or when you want the payload on the wire before the worker.
If curve emission fails, Submit refuses and says why. There is one write path. The Market Operator clears the Submission, not a book ladder.
A line that has not left the desk is DRAFT. After Submit it is SUBMITTED. The gate countdown on the ribbon is our clock, not your browser’s — if the laptop is four minutes fast the desk shows the skew rather than quietly trusting either one.
After 12:00 FetchSchedule fills accepted volumes and the
System Marginal Price. Open the line drawer for
provenance — strategy run, members, opportunity costs.
The curve the Market Operator actually cleared is on their
Bidding → Submissions drawer, not as 168 editable
periods on this desk.
IDM lives on the same desk (§5). Imbalance after delivery: §6.
4.6 Worked ladder — preserve why every rung exists
You need to know whether a line is a sale of a genuine leftover or a bid whose economics were guessed. The desk answers that with a rung per long component and a provenance drawer per rung.
Data. full_demo · seed 42 · stage S08 (market loop) · BidBuilder canonical ladder, re-derived 2026-07-18.
| Input | Hour 12 long | Hour 19 short |
|---|---|---|
| firm spill / avoided top-up | 5.00 MWh @ 0c/kWh | 6.00 MWh @ 210c/kWh |
| wind spill | 1.71 MWh @ 40c/kWh | — |
| safety margin | R 10/MWh | R 10/MWh |
| net position | +6.71 MWh | −6.00 MWh |
Start with the conversion: R/MWh = c/kWh × 10. Firm
energy is 0 × 10 + 10 = R 10/MWh, so it offers 5.00 MW at R
10. Wind is 40 × 10 + 10 = R 410/MWh, so it offers 1.71 MW
at R 410. The short hour has one buy limit:
210 × 10 − 10 = R 2,090/MWh for 6.00 MW.
Day-ahead worked ladder
| Hour 1 | Direction 2 | Volume 3 | Limit 4 |
|---|---|---|---|
| 12:00 SAST | Offer · firm | 5.00 MW | R 10/MWh |
| 12:00 SAST | Offer · wind | 1.71 MW | R 410/MWh |
| 19:00 SAST | Buy | 6.00 MW | R 2,090/MWh |
- 1Hour is the SAST delivery interval.
- 2Direction follows the signed net position.
- 3Volume retains component provenance.
- 4Limit is an eligibility threshold, not revenue.
At an SMP of R 980/MWh, both offer rungs clear. The market revenue is
6.71 × 980 = R 6,575.80. Wind’s counterfactual is
1.71 × 400 = R 684; its market uplift is
R 6,575.80 − R 684 = R 5,891.80. Conservation is
5.00 + 1.71 = 6.71 MWh = cleared volume ✓.
4.7 Netting, clips and statuses
Netting happens before a market order, but attribution remains per
book. A trader long 6.71 MWh and an IPP short 2.00 MWh produce
+6.71 − 2.00 = +4.71 MWh. The registration submits 4.71
MWh; its market value is 4.71 × 980 = R 4,615.80.
Attribution remains R 6,575.80 for the trader and −R 1,960 for the IPP,
therefore R 6,575.80 − R 1,960 = R 4,615.80 ✓.
If an open-position cap clips a line, the clip is evidence that the desk did not silently submit the entire run. Open Rebuild from latest run after a strategy refresh, inspect every clip, then submit.
Follow along. Seat:
trader_1@webill.net(BRP). Path: Bid Desk → Submissions → Rebuild from latest run → review the draft banner and ladder → Submit. You should see: the Gate countdown, a draft-not-sent banner, a rung drawer with source run and component values, and a submitted status before 10:00 SAST.
EXPIRED is your status. If you never pressed Submit, the ladder dies on this desk. Rollover is the Market Operator’s act — they generate a Submission from day 2…7 of your last accepted horizon. You will see a rolled-over badge on their board, not a red alarm. §4.17.
4.8 What you are actually submitting
The desk still shows rungs and provenance so you can see why
a volume was priced. That is a local explanation. The market
object is the Submission. Submit and the 03:00 worker emit
curves with BidBuilder.build_curves/4 and PUT
them to /api/v1. The Market Operator clears that
Submission. The counterpart who opens Bidding →
Submissions sees it: 168 structured periods, consent, curves,
energy limits. This desk does not draw those 168 periods as an
editor.
A real submission is not a price and a volume. It is, for every hour of the next seven days:
- how much you can produce in that hour — your Declared Available Capacity;
- a price ladder for it, expressed as a five-block curve rather than a list of rungs;
- whether the market may move you — one character, and the most consequential one on the form;
- whether you are offering reserve in each of three categories.
Seven days, 168 hours, every one of them declared. Tomorrow is the one that clears at the gate; the six behind it are how the market sees you coming.
| Envelope field | In plain speech |
|---|---|
| Trading Unit | Who this is for — the TUID, not the book name on this desk. |
| Trading Day | The first of the seven days. Tomorrow is what clears at 10:00. |
| Sequence | Version of this unit’s bid for that day. Later seq replaces earlier. |
| Consent | You said the payload is complete and you will stand behind it. |
| 168 periods | Seven days × 24 hours. A 24-period payload is refused, not stored. |
| Curves | Production stairs and/or consumption ladder for each period. |
| Energy limits | Reservoir-style caps across the horizon — §4.19. |
The five blocks
The curve is not five prices for five products. It is one rising cost curve for the same megawatt-hour, cut at four points you nominate:
| Block | From → to | What it is |
|---|---|---|
| Must-run | 0 → Mingen | What the unit produces if it is on at all. You do not choose this hour by hour; it is a property of the plant, and the registry holds it. |
| First flexible | Mingen → E1 | The cheapest energy you can choose to produce. |
| Second | E1 → E2 | Dearer. |
| Third | E2 → E3 | Dearer again. E3 is your Maximum Continuous Rating — the registry holds this one too. |
| Emergency Level 1 | E3 → EL1 | Capacity above your rating, available only when the System Operator declares an emergency, priced accordingly. |
Mingen and E3 are locked on the desk. They come from your registered standing data, not from the submission form, and the two most common rejections in any electricity market are a curve whose bottom does not match the registry’s Mingen and one whose third elbow does not match its MCR. On this desk you cannot author either mistake — the fields render read-only with the registry value in them. If the number is wrong, the registry is where you fix it, and the fix is effective-dated.
The blocks may be zero-width, and usually are. A
solar farm submits Mingen = E1 = E2 = 0 with
E3 = MCR: four empty blocks and one real one. That is not a
degenerate case to be worked around, it is the shape every renewable
submits, and the desk accepts it without comment.
You are paid the hourly price, not your block price
This is the part that surprises people. The prices in your curve decide whether you are scheduled and how much of you is scheduled. They do not decide what you are paid.
Whichever blocks clear, every megawatt-hour is settled at the System Marginal Price for that hour — one price, the same for everyone. If your must-run block is priced at R350 and the hour clears at R900, that block earns R900. Your curve is a statement about your costs so the market can stack you correctly. It is not an invoice.
The consequence worth internalising: pricing a block low does not mean being paid less for it. It means being scheduled sooner. Pricing it high does not earn more; it risks not running.
4.9 The flexible indicator
One character per hour. F or I. It is the
most consequential single character on the form, and it is routinely set
without thought because it looks like a checkbox.
| What you are saying | What the market may do | Can you set the price? | |
|---|---|---|---|
F |
flexible | schedule you anywhere between Mingen and your declared capacity | yes |
I |
inflexible | schedule you at exactly your declared capacity | no |
I is a commitment, not a ceiling. This
is the misreading, and it costs money. I does not mean
at most this much. It means the market will schedule you at
precisely the figure you declared, and you are then obliged to deliver
it.
Work it through for a solar farm. At 09:00 the desk shows tomorrow’s
18:00 hour and your forecast says 40 MW. Declare 40 MW / I
and you have not capped yourself at 40 — you have
promised 40. If the cloud arrives you are short against
an instructed position, and the shortfall settles against you in the
balancing mechanism at whatever the imbalance price turns out to be.
Nobody instructed you to be short; you declared a number and the market
believed you.
What you get in exchange is that an inflexible offer cannot
set the System Marginal Price. The market had no choice about
you, so your price is not the marginal one. For a non-dispatchable unit
that could never have set the price anyway, that is no loss at all —
which is why I is the honest declaration for a unit that
genuinely cannot be moved, and a bad one for a forecast.
The trade is real in both directions: F accepts being
moved in exchange for the chance to be the price setter; I
buys certainty of volume at the cost of being unable to influence what
it is paid.
4.10 Missing the gate is not the end of the day
The DAM gate closes at 10:00 SAST on the day before delivery. Miss it and the desk does not leave you with nothing. The Market Operator generates a rolled-over submission on your behalf.
The rule is simple and worth knowing exactly, because it decides what you are committed to:
Day 1 of the rollover is day 2 of your last submission, day 2 is day 3, and so on. Day 7 repeats day 7 — there is no day 8 to shift from.
In plain terms: we re-use yesterday’s plan, shifted a day. Everything you declared for the day after tomorrow becomes what you have declared for tomorrow. Your energy limits shift with it, on the same rule. You will be notified every time this happens; a rollover is never silent.
The gate clock on the desk is the server’s, not your browser’s. It renders the Market Operator’s own instant, and if your machine’s clock disagrees the desk shows you the skew rather than quietly trusting either one. A gate decision made against a laptop running four minutes fast is a gate decision made against nothing.
Why a week of misses is a real problem
Roll forward once and you are submitting a plan that was a day old. Roll forward seven times and every day of your horizon is the same day-7 profile, repeated — the fixed point the rule converges to. Nothing is broken, no submission is rejected, and you are declaring a week-old profile as your intent for next Tuesday.
That is why the desk carries staleness as a number
(staleness_days) and not just a badge. Each rollover
increments it, the unit shows it, and crossing the threshold raises an
alert rather than continuing quietly. A unit that has rolled over four
days running is not having a quiet week; it has stopped participating
and nobody has noticed.
The next chance to change the plan after a missed DAM gate is the first IDM iteration that still covers the hour (§5.1) — a patch, not a new bid. You cannot re-price.
4.11 Pre-flight, and one implementation of the rules
The desk’s Validate action runs the full submission code set — every structural, curve, indicator, energy-limit and storage rule — and reports the result as a checklist, each failure with its clause and what to do about it. Run it before you commit.
It matters that this is the same code the API’s dry run and the real submission call. A pre-flight check that reimplements the rules in the browser drifts from the server’s, and the drift shows up in exactly one place: a participant told its submission was clean, and rejected at 09:59.
A 409 (gate closed) or a refused horizon is not
lost. The Market Operator sees it on Bidding →
Submissions (#submissions-rejected) — the intake
audit — and can tell you “we have your 409”. See V11
§12.7.
Follow along. Seat:
trader_1@webill.net(BRP). Path: Bid Desk → Submissions → pick a Trading Unit → day selector → Validate. You should see: 24 rows for the selected day with DAC, the flexible indicator and three reserve indicators; Mingen and E3 read-only in the curve editor; the server gate clock with its countdown; and a clean checklist before you submit.
4.12 What happens after the gate
The gate closes at 10:00 and the market runs an auction. Not a negotiation, not a queue — a single clearing that looks at every submission at once.
Sellers are stacked cheapest first. Buyers are stacked most-willing-first. The auction walks up one stack and down the other until they cross, and the volume up to that crossing point trades.
Use the worked hour. Five Trading Units, 18:00:
| Rung | Who | Volume | Their price |
|---|---|---|---|
| 1 | interconnector import | 20 MW | R0 |
| 2 | solar farm | 75 MW | R0 |
| 3 | coal, 0→200 | 200 MW | R350 |
| 4 | coal, 200→300 | 100 MW | R420 |
| 5 | coal, 300→400 | 100 MW | R640 |
| 6 | coal, 400→500 | 100 MW | R900 |
| 7 | gas peaker, 0→60 | 60 MW | R2 800 |
Demand is 440 MW of distributor load that cannot be shed, plus a factory drawing 90 MW of which 40 MW is must-serve and the rest it has priced. The stacks cross inside rung 6, with the coal plant at 435 MW.
Everybody who cleared trades at R900. The plant that offered R350 for its first 200 MW is paid R900 for them. The solar farm that offered R0 is paid R900. The factory pays R900 for every megawatt-hour it drew, including the blocks it valued at R4 800.
That is not a quirk; it is the whole design. Your offer decides whether you clear and how much of you clears. It does not decide what you are paid. Pricing a block low means being scheduled sooner, not being paid less — which is why the honest thing to offer is what the energy actually costs you.
The 14:00 publication is a chalkboard. Energy money
(EPM) is calculated immediately and paid with the month. Do
not treat the schedule report as a deposit.
4.13 Why the price is sometimes lower than the most expensive plant running
At 19:00 the sun is down, the distributor is drawing 520 MW, and the market is tight. The coal plant runs to its full 500 MW, the gas peaker is started at its minimum of 60 MW, and the factory is curtailed from 90 MW down to 60.
The most expensive plant running is the peaker at R2 800/MWh. The price is not R2 800.
A plant held at its minimum cannot set the price. The peaker cannot run at 50 MW — it runs at 60 or not at all. The market did not choose to buy its sixtieth megawatt-hour; it chose to start the unit, and the minimum came with it. An offer the market had no choice about is not a marginal offer.
The same applies in three other situations, and they are worth recognising because each one means your offer was not price-setting that hour:
| Situation | Why you cannot set the price |
|---|---|
| At or below your minimum stable generation | The market did not choose that level; the plant did. |
You declared I |
You were scheduled at exactly what you declared. There was no choice to be marginal to. |
| Your ramp rate bound | You could not have gone higher within the hour whatever the price. |
| You were held up by Regulating Down reserve | You are standing ready to reduce; you cannot also be the one being reduced. |
The last two are properties of the clearing, not of your submission. You cannot tell from your own schedule that a ramp bound — which is why the schedule tells you (see §4.15).
If every unit is inflexible in a period, the price is zero. Not the highest inflexible price: zero. An hour in which nothing flexible ran has no marginal cost to reveal.
The one we have decided and the market has not
At that 19:00 hour, the genuinely marginal resource is the factory choosing not to consume. It shed a block it valued at R2 600/MWh. Economically that is the value of energy in that hour, and it is what a sixth megawatt-hour would have been worth to somebody.
The Market Code is written in generation vocabulary and never says whether a partially-curtailed load may be the price setter. The two readings differ by R1 700/MWh in that single hour.
We treat the factory as price-setting. It is the
economically correct reading: under the other one, scarcity is invisible
in the price — the market says R900 while a customer is switching off
machines it valued at R2 600. But the rule is not
settled, the Market Governance Committee has not decided, and
every clearing we publish records what the price would have been under
the other reading so the divergence is measured rather than argued
about. You will see it on the console as [D-08].
4.14 Two schedules, and why
Every Trading Day is cleared twice. Zones do not set the price.
Daily (/org/brp/bid-desk) shows the
hourly forecast and a unit’s published schedules in Details
& destinations. Bid Desk › Settlement
(/org/brp/after-delivery) retains the detailed schedule
view. Unpublished results and missing forecast hours remain visibly
different from zero.
Where this is taught. The overview, chart and evidence drawer are in V10 §12.2.
The unconstrained schedule ignores the network. It is the market’s answer to “what is the cheapest way to meet this demand?” — and it is the one that sets the price and the one your energy payment is struck on.
The constrained schedule adds the System Operator’s security limits: this corridor cannot carry more than so many megawatts, this zone cannot export past a cap. It is the one the system is actually run from.
Where they differ, you are compensated separately — at your own offered price, not at the market price, and the cost goes to the System Operator rather than to other participants.
Work the worked day again. The solar farm clears at 75 MW unconstrained. The System Operator caps exports from its zone at 60, so the constrained schedule cuts it to 60 and lifts the coal plant from 435 to 450.
| Energy payment | 75 MWh × R900 = R67 500 — struck on the unconstrained volume |
| Constrained sales charge | ∫ of its own offer between 60 and 75 = 15 × R0 = R0 |
| Net | R67 500 for 60 MWh actually generated |
Fifteen megawatt-hours it never produced, at R900 each. That is not a bug in our implementation; it is what the Market Code says, and it follows from the charge being struck at the unit’s own offered price — which for a renewable offering at zero is zero. The chalkboard writes that as CSC R 0.00 with the sentence zero-priced curve, not as a blank cell.
Two consequences worth internalising, because they point in opposite directions:
- Being curtailed by the System Operator is free. The compensation is struck at your own offer.
- Re-declaring your own capacity down is not. That is an intraday decision and it is charged at the intraday price. §5 covers it.
A participant who re-declares defensively when a constraint was coming anyway pays for the privilege.
4.15 Reserve prices sit at their floor most of the time
Alongside the energy price, four reserve prices are published every period: Regulating Up, Regulating Down, Instantaneous and Ten-Minute.
They are usually at their floor, and the board says so with an at floor badge. That is not a fault and not a placeholder — it is the normal state of an uncongested hour, and here is why.
A unit holding back capacity for reserve gives up the profit it would
have made selling that energy. That forgone profit is
market price − the unit's own cost. When the unit holding
the reserve is also the unit setting the price, those two are the same
number and the difference is zero. So the price falls
back to the floor the Market Governance Committee published.
What lifts a reserve price off its floor is a plant whose own cost is below the market price, held back to stand ready. A unit costing R400 in a market clearing at R900 gives up R500 for every megawatt it holds — and that R500 is what the reserve is worth that hour.
So an at-floor reserve price tells you something real: nobody was holding back anything valuable. A reserve price above its floor tells you the system was leaning on plant that could profitably have been generating.
4.16 Reading your own schedule
The Bid Desk shows your day-ahead schedule once the Market Operator publishes it — by 14:00 on the day before delivery.
Both volumes are there, side by side, and every period says why it landed where it did: at your declared capacity, at your minimum, ramp-bound, held by down-regulation, or cut by a network constraint — each as a sentence rather than a code.
That is deliberate. The System Operator is obliged to explain a dispatch instruction if you ask. Putting the reason on the schedule means you do not have to ask, and it saves a query on the days the answer is “your ramp rate bound at 18:00”.
A binding constraint is named as a sentence on the constrained volume (“export cap on this zone”), not as a code. When the constrained-off volume settles at your own offer of R 0, the line is CSC R 0.00 — that is data, not a missing charge.
Where this is taught. V3 owns run construction and component economics. V8 §7 owns contract adjustment pricing after metering.
4.17 Three doors into a Submission
A Submission reaches the Market Operator through one of three doors. Who may use them: the registration is ACTIVE, the Trading Unit is not suspended, and a unit still in commissioning may submit only where the Code allows a commissioning bid.
| Door | Who presses it | What arrives |
|---|---|---|
| Auto | SubmitDamBids at 03:00 D−1 |
A 168-period payload built from the latest nominated run. |
| API | Your integration, PUT |
The same envelope. The dry-run path is the same code as live. |
| Rollover | The Market Operator, after 10:00 | Day 2 of your last accepted horizon becomes day 1. You are notified. |
You do not pick the door on this desk. Auto and manual Submit share door 1. Door 3 is never a BRP button.
Data. full_demo · seed 42 · Trading Day 2026-07-15 · hour 18:00 · SAWEM-SPEC §10 / market-dam.md §11.
4.18 The consumption curve
A load does not offer cost stairs. It states what the energy is worth — willingness to pay — and a block the market may not shed at any price.
| Field | What you are saying |
|---|---|
| Declared consumption | How many megawatts the site wants this hour. |
| Elbows | Where willingness-to-pay steps. Shed the cheapest-valued block first. |
| Must-serve (below E3) | The market may not cut this at any price. A collapsed curve (all must-serve) is legal — that is most industrial sites. |
The factory on the golden hour wants 90 MW: 40 must-serve, then 10 at R4 800, 20 at R2 600, 20 at R1 500. When the system is tight the last blocks go first.
4.19 Energy limits are not the sum of the dailies
A hydro or a battery can be honest about every hour and still be lying about the week. The hour says 80 MW; the reservoir cannot release 80 × 168.
Energy limits sit on the horizon, not on the sum of the twenty-four daily caps. The Market Operator validates them as a reservoir: what you declared across the seven days cannot exceed what you said you have. If the daily figures add to more than the limit, the payload is refused — the hours were each legal and the week was not.
Where this is taught. Field catalogue stays in this chapter. The Market Operator’s read-only drawer is V11 §12.7. IDM cannot rewrite these limits (§5.9).
4.20 Bid Desk — Daily and the destination rooms
The jobs used to share one scrolling page. They now have addresses.
The sidebar still says Bid Desk. Daily is the front
door. Submissions, IDM, Forward, Settlement and Imbalance share a
Trading Day and a Trading Unit. The Billing Period wallet is
Market Month (sidebar After Delivery — V10 §13). A Balancing
Group never totals EPM.
Daily /org/brp/bid-desk
| Expected 1 | Publication 2 | Your EPM 3 | Silent 4 |
|---|---|---|---|
| 2 | Published at 13:40 | this org | none |
- 1Expected is how many of your units should have spoken.
- 2Publication is a sentence, not a blank R 0.00 table.
- 3Your EPM is this organization’s pot — not the market’s R 0.00.
- 4Silent names who will roll if you do nothing.
Submissions /org/brp/bid-desk/submissions
| TUID 1 | Source 2 | Draft 3 | Validate 4 |
|---|---|---|---|
| TU-PV1 | Rolled over | not sent | same code |
- 1TUID opens the drawer — no price-edit form.
- 2Source badges rollover; it is not alarm-red.
- 3Draft is visible before Submit or 03:00.
- 4Validate is the same function the API write calls.
IDM /org/brp/bid-desk/idm
| Iteration 1 | Class 2 | Lodgements 3 | Ledger 4 |
|---|---|---|---|
| 4 | against | none lodged | this platform |
- 1Iteration is one of the five gates.
- 2Class is certain before you commit; the price is an estimate.
- 3Lodgements use a sentence when the day is empty.
- 4Ledger is this platform’s book ladder, not the market stack.
Settlement /org/brp/after-delivery
| Status 1 | Energy 2 | CSC 3 | Payout 4 |
|---|---|---|---|
| Published at 13:40 | your Σ EPM | R 0 · own offer | chalkboard |
- 1Status is unpublished, or published at HH:MM.
- 2Energy is your pot. The market nets to R 0.00; you will not.
- 3CSC carries a sentence when the amount is zero.
- 4Payout is not an Invoice and has no Pay button.
Imbalance /org/brp/after-delivery/imbalance
| SE 1 | IE 2 | AE 3 | Deviation 4 |
|---|---|---|---|
| ticket | SO path | meter | priced gap |
- 1SE is Contracted Energy after IDM.
- 2IE is the instructed path, or SE if nobody instructed.
- 3AE is the meter, allocated to this unit.
- 4Deviation is what this hour will price. The month wallet is Market Month, not this desk.
Deep links keep the date:
/org/brp/bid-desk/submissions?date=2026-07-15,
/org/brp/bid-desk/idm?date=2026-07-15&iteration=4,
/org/brp/after-delivery?date=2026-07-15.
You cannot edit a Mingen or an MCR from this desk. Those are registry fields. You change a curve by sending a new sequence.
4.21 Operate 2026-07-15 from the stall
Data. full_demo · seed 42 · Trading Day 2026-07-15 · hour 18:00 · org-dam.md §15 / §16.7.
Seat: trader_1@webill.net /
supersecret.
- Open Bid Desk → Submissions with
?date=2026-07-15. Find the draft banner if a ladder has not left the desk. - Submit, or leave it for the 03:00 worker. Do not invent a 24-period body.
- Open Daily. Every owned Trading Unit has a row. Missing filters the units without a submission.
- After publication, open Settlement. Read unconstrained 75 MWh against constrained 60 MWh. The CSC line that reads R 0.00 must carry the own-offer sentence.
- Open IDM. Decide carry versus re-declare before the next gate. The book table is this platform’s ledger.
Follow along. Seat:
trader_1@webill.net(BRP). Path: Bid Desk → Submissions (?date=2026-07-15) → Daily → Settlement → IDM. You should see: a draft or a sent seq, unit rows, a chalkboard that is not an invoice, and five iteration chips.
4.15 Participant trading checks
New registrations start at PROPOSE. The worker builds a draft for review; it does not submit it. MANUAL also retains the draft. AUTO_WITHIN_LIMITS permits worker submission after all six participant checks. The demo estate opts into that level explicitly. Raising a level requires an independent active member’s approval; lowering it applies immediately.
Before transport, each attempt records capability, price collar, daily Rand notional, line count, duplicate content, and the named book OPEN_POSITION_MW check. A refusal leaves the draft available for correction. A member must explicitly accept soft warnings before retrying. The automatic path records soft warnings in the audit. VaR and counterparty limits remain alert-only.
Capability uses declared MCR, then the effective MEC limit, site export capacity, or a configured MW cap. The initial tolerance is 0%. The initial forecast collar is P10–P90 ±20%, bounded by the market floor and cap. Missing forecast evidence produces a warning while market bounds still apply. Manual lines have no builder exemptions. The Controls tab labels derived values; onboarding includes entering the customer’s daily Rand cap.
For a 75 MW connection, offers of 60 MW at R480 and 900 MW at R950 total 960 MW and are refused. With P10 R612 and P90 R1,190, the lower bound is R489.60 and upper bound R1,428. The notional is R883,800; the derived daily cap at a R5,396.40 market cap is R9,713,520. Correcting the offers to 60 MW at R490 and 9 MW at R950 passes these bounds.
An unsubmitted PROPOSE draft is escalated at gate minus 30 minutes. The alert never submits it. See the Controls tab and Approvals inbox.
5. Intraday and IDM
Contracted battery reserve lines
A battery’s bilateral reserve commitment specifies MW, direction, sustain duration, active hours and a capacity price. It is honoured by the battery plan before the IDM decision reads the net position. UP reserves discharge power and stored energy; DOWN reserves charging power and empty storage. BOTH does both. Reserve power is never added to energy available for sale.
A 2 MW commitment for four hours at R220/MW/h creates four zero-kWh
BESS_RESERVE capacity lines worth R1,760 in total. This
revenue contributes to total margin and is shown separately to the
owner. It is not energy delivery or a reserve-market clearing result.
Activations use the existing System Operator instruction path to correct
state of charge and replan the remaining hours; the unchanged day-ahead
plan remains available for comparison.
Reserve-market clearing remains behind backlog item 4. This commitment register records a bilateral product; it does not claim that the platform runs a reserve auction.
Screen: Bid Desk → IDM tab
(/org/brp/bid-desk).
The day-ahead market locks a schedule the day before. Weather and load still move. The intraday market lets you re-declare what your plant will do for hours not yet delivered — and it charges you for the privilege in a way the day-ahead market does not.
5.1 Five auctions, at fixed times
There is no rolling window. The intraday market runs five auctions a Trading Day, at times that do not move:
| Iteration | Gate | What it can still move |
|---|---|---|
| 1 | 18:00 the day before | every hour of the Trading Day |
| 2 | 00:00 | 01:00 onwards |
| 3 | 06:00 | 07:00 onwards |
| 4 | 12:00 | 13:00 onwards |
| 5 | 18:00 | 19:00 onwards |
Iteration 4 is the golden-hour gate: 18:00 can still move; after 18:00 it cannot.
A re-declaration applies to each remaining hour. Iteration 5 closes at 18:00, so it can move 19:00 and cannot move 18:00 — the hour whose delivery is beginning as the gate shuts — let alone anything earlier.
The desk shows all five with a countdown, and the countdown comes from our clock, not your browser’s. A laptop four minutes fast would otherwise show you four minutes you do not have, and the gate you miss is real. Selecting an iteration chip loads that iteration’s lodgements and the carry / re-declare decision — the chips are not cosmetic. There is no rolling T−60 window; the worker rings these five Code gates only.
Your day-ahead submission carries over automatically into every iteration: price curves, technical parameters, availability. A re-declaration is a patch, never a replacement — you change your Declared Available Capacity or your declared consumption, and everything else stands. You cannot re-price mid-day. If you could, you could watch the intraday stack form and then move the price you are about to be paid at.
| Field you send | What it is |
|---|---|
| Iteration | Which of the five auctions. |
| Periods | The hours you are patching — only hours this iteration may still move. |
| DAC / DC | New declared available capacity, or new declared consumption. |
| reason_code | Why you are moving (forecast, outage, instruction). |
| reason_note | The sentence a human reads. |
| Consent | A separate form. You are standing behind the patch. |
5.2 Changing your own mind costs money; being moved does not
This is the section to read twice.
When the System Operator moves you off your schedule, you are compensated at your own offered price — which for a renewable offering at zero is nothing, and you keep the full day-ahead payment (§13.4). Being constrained off at a zero offer is free. Re-declaring is not.
When you re-declare your own capacity down, that is
charged at the Intra-Day Price, flat. Your own offer
buys you nothing. The IDM tab shows the IdmDecision (carry
or re-declare) before you lodge; a submit that cannot show that decision
is refused. Consent is a separate control — changing it does not
silently re-declare volume. The worker writes a TUID re-declaration, not
a book-level :IDM bid.
Follow along. The worked delivery day, 18:00 period. Heavy cloud arrives at 11:30 and the solar farm re-declares from 60 MW to 20 MW before the 12:00 gate.
| Day-ahead schedule after the network constraint | 60 MWh |
| Re-declared at iteration 4 | 20 MWh — a 40 MWh reduction |
| Classification | purchase against instruction (clause 10(6)(i)) |
| Intra-Day Price for that iteration | R945/MWh |
| Charge | 40 × R945 = −R 37,800 |
Σ check: 67,500 − 0 − 37,800 = 29,700 — the farm keeps R
29,700 for the 20 MWh it actually generates, an effective R 1,485/MWh
against a market price of R900. Still favourable, and only because the
System Operator’s curtailment was free while its own re-declaration was
not.
Turn it round and the lesson is sharper. Had the System Operator constrained all 55 MWh instead, the farm would have kept the whole R 67,500 and paid nothing.
Careful. If a constraint is coming anyway, re-declaring first transfers value away from you. The desk’s recommendation (§5.5) exists for exactly this decision.
The same clause runs the other way for the units that pick up the slack. The coal plant lifted 450 → 465 MWh and the factory curtailed 90 → 65 MWh were moved, not volunteers: they are on instruction, and they keep the better of their own offer and the Intra-Day Price.
5.3 We tell you before you commit
Enter a re-declaration on the desk and, before you submit it, the screen tells you how it will be classified and what that means for the price:
PURCHASE_AGAINST_INSTRUCTION · clause 10(6)(i) This is against instruction. 40.000 MWh will be charged flat at the Intra-Day Price for this iteration — not at your own offered price.
The classification is certain, not a guess. The
Market Code decides it from your declaration, not from what the
market later does, so it can be stated before the auction runs. The
price is the estimate, and it is labelled as one. The most useful API
field on that preview is estimated_classification — it is
what the desk is showing you.
A single hour can carry both: raise your capacity by 10 MW, get scheduled up by 15 MWh, and 10 of it is against instruction while the other 5 is on. The preview says so rather than picking one.
5.4 The intraday price is capped near the day-ahead price
Every iteration produces its own price per period, and it is held within ±5 % of that period’s day-ahead System Marginal Price.
The worked day’s iteration 4 is a good example of why that matters.
The units the market moved offered R900, R1 500 and R2 600 for the
megawatt-hours it took, which averages R1 412.50. The
cap pulls it back to R945.00 — 5 % above the day-ahead
R900. That clamp is [D-03]: the Code’s lower-bound wording
is misdrafted, so both the indicative average and the applied collar are
published (§17).
The desk shows you both numbers with a collared badge, so you can see when the cap moved the price and by how much. Rendering only the capped figure would hide that the market wanted a different answer.
Two smaller rules worth knowing. Only the movements the Market Operator chose set the price — a participant that re-declares its own capacity does not get to drag the price it will then be charged at. And where the iteration’s changes net to nothing, the intraday price simply is the day-ahead price.
5.5 Carry it, or re-declare it?
The platform used to re-bid any hour that drifted a megawatt-hour
from schedule. Under SAWEM that rule is wrong, and wrong in the
expensive direction. The desk now walks IdmDecision in
order: instruction → band → compare IDP vs
balancing.
The desk now compares.
| What is true | What we recommend | Why |
|---|---|---|
| A System Operator instruction is expected | carry | An instructed deviation settles at your own offered price. For a zero-priced unit that is free — and re-declaring would convert it into a charge. |
| The deviation is inside your Metering Accuracy Band | carry | It settles at the day-ahead price with no penalty at all. An intraday round trip cannot beat no penalty. |
| Outside the band, and balancing is dearer | re-declare | Past the band the whole deviation reprices, not the excess, so the comparison is worth making. |
| Outside the band, and the intraday price is dearer | carry | Take it as imbalance instead. |
The band is a percentage of your contracted position, not a fixed megawatt-hour figure — a 500 MWh unit and a 20 MWh unit have very different room.
Note. The recommendation comes with its reason on screen. “Carry” means three different things in the table above, and which one applies decides what changes if your forecast moves again.
5.6 Reversals: you do not pay twice for changing your mind twice
If a later iteration undoes an earlier one, the earlier charge is given back for the part that was undone. In the worked day the cloud thins at 18:00 and the farm goes back from 20 MW to 40 MW: half the 40 MWh it re-declared away is restored, so half the R 37,800 comes back.
That netting reaches all the way back — past iteration 1, to the day-ahead constrained adjustment itself. A unit returned to exactly the schedule the day-ahead market gave it has a net intraday position of R 0.00, whatever route it took to get there. Back to the DAM constrained schedule ⇒ net IDM R 0.00.
5.7 Contracted Energy is what balancing measures you against
Your Contracted Energy is the schedule from the most recent iteration plus any registered forward volume for that Trading Period — not the day-ahead residual alone. It is what every balancing deviation is measured against once the day is delivered, and the desk and the API both publish it per period.
If nothing was re-declared, it is the day-ahead constrained residual plus the forward base. If iteration 4 moved you, it is iteration 4’s residual plus the same base, and iteration 5’s after that. The forward base does not change between iterations; only the residual does.
5.8 Let instructions win
An instruction changes what the asset is allowed to do. If a curtailment, outage or dispatch constraint applies, investigate that instruction before building an intraday correction. The desk can show the condition; it never turns an instruction into commercial advice.
Careful. A closed gate and an instruction-blocked interval are different facts. The first leaves a normal market deviation; the second may produce an instructed, excusable one once the System Operator’s evidence is present.
Where this is taught. V3 owns forecast and allocation runs. V12 §3.2 owns instruction treatment; §13 owns the day-ahead money the intraday market adjusts; V8 §11 owns reruns and post-metering correction.
Data. full_demo · seed 42 · Trading Day 2026-07-15 · hour 18:00 · SAWEM-SPEC §10 / market-dam.md §11.
5.9 What the IDM does not change
An IDM iteration patches remaining hours. It does not rewrite the day-ahead auction.
| Stays as the DAM left it | Why |
|---|---|
| The DAM bid | You cannot re-price mid-day. |
| The DAM curve | The stairs that set the SMP are yesterday’s. |
| The SMP | One country-wide price per hour, already published. |
EPM |
Struck on the unconstrained DAM volume. Do not subtract the IDM charge from it. |
The IDM has its own price (IDP) and its own charge
(IDC). Those sit beside the chalkboard, not inside it.
5.10 On the MO Bidding IDM tab
The Market Operator does not lodge your patch. They watch the five
auctions on Bidding → IDM
(/mo/bidding/idm). The stack they see is anonymised —
prices and volumes, no TUID. Your name is on the lodgements table, not
on the stairs.
IDM MO sample
| Iteration 1 | Hour 2 | IDP 3 | Moved 4 |
|---|---|---|---|
| 4 | 18:00 | R 945 collared | 40 MWh against |
- 1Iteration is which of the five gates.
- 2Hour is still movable at that gate.
- 3IDP shows indicative and applied when the collar bit.
- 4Moved is volume, not a Trading Unit name.
The teaching home for that console is V11 §12.7.
5.11 On the Bid Desk IDM tab
Your patch is lodged from Bid Desk → IDM
(/org/brp/bid-desk/idm), not from the Market Operator’s
stack. Five iteration chips keep the date. The classification preview is
certain before you commit; the price is an estimate. When nothing was
lodged, the table says so — it does not draw zeroes.
IDM Bid Desk
| Chip 1 | Class 2 | Lodgements 3 | Ledger 4 |
|---|---|---|---|
| 1…5 | against / on | none lodged | this platform |
-
1Chip patches
?iteration=and keeps the trading date. - 2Class is §10(6)–(9) before the gate.
- 3Lodgements are yours. An empty day is a sentence.
- 4Ledger is this platform’s book ladder, labelled as such.
The five-tab map is §4.20. The Market Operator’s anonymised stack stays in §5.10.
6. Imbalance
Screen: Bid Desk › Imbalance
(/org/brp/after-delivery/imbalance) — a Bid Desk room for
one Trading Day and one Trading Unit (V10 §12.7). Deep links
carry ?date= and ?tuid=. The headline is the
eleven §13 legs per Trading Unit (#balancing-statement),
loaded from the same
GET /balancing/trading-units/:tuid/:date surface the Market
Operator publishes. This platform’s book figure, if shown, is labelled
book actual − scheduled and is not §13. A mismatch
between the book and the statement is shown as a variance, not silently
preferred. Metering exceptions sit on the same tab
(#allocation-exceptions-view) with the vintage stamped on
them. Month › Balancing equals the sum of published §13 statements for
that Trading Unit, or “no statement”.
After delivery the market compares what you contracted for with what your meters actually did, hour by hour, and settles the difference. There is no single “imbalance price”. Market Code §13 asks a short series of questions about each hour, and the answers decide both the volume you are charged on and the price it is struck at.
This chapter walks the questions in the order the Code asks them.
What changed. Until MS11 this platform priced a single number: the whole deviation, at a short or surplus price. §13 has eleven payment legs, two balancing prices, a 5 % tolerance that an instruction removes, and a complete override for Balancing Groups. Your imbalance figures have changed materially, in both directions. §6.8 says how, and what it means for the risk limits you set in V3.
6.1 The three quantities
Everything in §13 is written over three numbers for each Trading Unit and each Trading Period.
| Symbol | Name | Where it comes from |
|---|---|---|
| SE | Contracted Energy | your most recent IDM schedule (else the DAM constrained residual) plus registered forward volume |
| IE | Instructed Energy | what you would have delivered had you followed the System Operator’s dispatch instructions, ramps included |
| AE | Actual Energy | what your meters recorded, allocated to the Trading Unit |
AE needs a Point of Delivery with two named BRPs. An unpaired meter, or a unit with no meters, does not rewrite SE or the day-ahead energy payment. The two tills are §3.4.
All three are signed: positive is produced, negative is consumed. A load contracted at −65 MWh that consumed 66 is short — in exactly the same direction as a generator that under-produced by 1 MWh.
The one that surprises people is SE. If the
intra-day market moved your schedule at 12:00, your deviation is
measured against the moved schedule, not against what you sold the day
before. DAM EPM is not recalculated here.
6.2 The decision tree
Ask these in order.
Did the System Operator tell you to do something?
Yes — that part of your movement is settled at your own offer price, and your 5 % allowance no longer applies to anything in that hour.
No — are you within 5 % of your contract?
Yes — you settle at the day-ahead price (the System Marginal Price). No penalty.
No — the whole deviation, not just the part beyond the 5 %, is priced at the balancing price.
Two of those branches are worth stating twice, because they are where money actually moves.
An instruction removes the 5 % tolerance entirely. The tolerance is called the Metering Accuracy Band and it exists for metering error on a position you scheduled yourself. It is not a free allowance against a dispatch instruction. If the SO instructed you in an hour, the band does not exist in that hour — for any part of your deviation, instructed or not.
Missing the band is a cliff, not a slope. Miss by 4.9 % and you pay the day-ahead price on the shortfall. Miss by 5.1 % and you pay the balancing price on everything.
The same instruction that made IDM say carry (§5.5) is the instruction that removes the band here. Do not re-declare an hour the System Operator already owns, then argue the band on the imbalance screen.
6.3 The cliff, with numbers
You contracted for 20 MWh and nobody instructed you. Your 5 % allowance is 1 MWh, so anything from 19.000 to 21.000 MWh is inside the band.
| You delivered | Inside the band? | Clause | You pay |
|---|---|---|---|
| 19.100 MWh | yes, by 0.1 MWh | §13.5.2 | 0.9 × R900 =
R810.00 |
| 18.500 MWh | no, by 0.5 MWh | §13.9.2 | 1.5 × R2 742.86 = R4
114.29 |
Six hundred kilowatt-hours more shortfall costs R3 304.29 more — because it did not merely add volume, it moved the price basis. The 0.9 MWh that used to settle at R900 now settles at R2 742.86 along with everything else.
The Imbalance screen shows this as a counterfactual whenever you breach the band: what the same deviation would have cost inside it, and the difference. If you are routinely a few hundred kilowatt-hours outside, that panel is the cheapest thing on the screen to act on.
6.4 Where the balancing price comes from
The balancing price is not a multiple of the SMP. The Market Operator builds a merit order — the Balancing Energy Sold stack — out of every flexible, available unit’s submitted offer curve, and averages it over however much energy the market as a whole was short in that hour.
Two consequences you should plan around.
It is a market-wide price, not yours. You are 1.5 MWh short; the price you pay was computed over the market’s shortfall, which in the worked hour is 3.734 MWh across four units.
It can be enormous. In a tight evening hour, with the sun down and a cheap unit already at full output, the marginal balancing energy is a factory choosing not to consume at R2 600/MWh and a gas turbine at R3 100. The average comes out at R2 742.86/MWh against energy that was worth R900. A BRP 10 MWh short in that hour pays R27 428.60 for energy worth R9 000 — 3.05 times.
That is the mechanism that punishes optimistic forecasting.
6.5 And it can be zero
Now the uncomfortable part.
Clause 13.7(2) excludes the most expensive part of the stack, up to a parameter called Out of Merit Energy. Annexure 2 sets that parameter at 2 000 MW. In a comfortable hour the whole available balancing stack can be smaller than 2 000 MW — in the worked example it is 160 MW — so the exclusion removes everything, there is nothing left to average, and the rule that floors the price at the SMP becomes the whole answer.
The Balancing Price (Buying) equals the System Marginal Price. The penalty vanishes. A participant that missed its schedule by 7.5 % pays exactly what the energy was worth, which is no penalty at all.
We do not hide this. When it happens:
- the Imbalance screen shows the price with its reason — the stack volume, the volume excluded, and the clause — rather than a bare figure that happens to equal the SMP;
- the Market Operator console raises a market-integrity alarm for the period;
- the public price API publishes the same diagnostics alongside the price.
On the real national system the sold stack is tens of gigawatts and the 2 000 MW exclusion bites only at the tail. In any sub-market, island, simulation or early-market condition it removes the balancing penalty entirely. We are raising this with the market governance committee, together with the related observation that the Market Code defines a “Balancing Penalty Factor” — apparently to guarantee a minimum penalty — and then uses it in no formula at all. Both are implemented as parameters so the answer can be adopted without a code change.
6.6 If you were instructed
An instruction changes the shape of the settlement, not just the size.
The part of your movement that follows the instruction is settled at your own submitted offer curve, floored at the SMP if you sold and capped at it if you bought back. That is usually favourable: you offered that price, and the market took you at it.
Two details worth knowing.
You are paid for what you delivered, not what you were told. The Code’s published formula integrates up to Instructed Energy, which would pay you for energy you never generated. We integrate to what you actually delivered, capped at what was instructed. In the worked hour that is R8 100.00 rather than R9 210.94 — and the leg on your statement says which basis was used and why.
There is a gap the Code does not price. If you beat
your contract but missed your instruction — you were told 475 MWh, you
were contracted for 465, and you delivered 474 — the difference falls
between two clauses and no clause reaches it. We do not invent a charge
for it. We report it: your statement shows
1.234 MWh unpriced with the clause reference. That number
is the evidence we are putting behind a Modification Proposal.
6.7 Balancing Groups, and why they are worth having
Think of two pockets in the same pair of trousers. One pocket has R8 too much. The other is R8 short. You are the same person. You did not lose R8 — you moved it from one pocket to the other. The market, left to itself, does not see the trousers. It sees two pockets, bills each one, and you pay a penalty on both.
A Balancing Group is you asking the market to look at the trousers.
What you are grouping
A Trading Unit is the bundle the market schedules and settles — usually one per network zone, because a unit may not span two zones. After the hour, the market compares three numbers for each unit (§6.1):
| Word | Plain meaning |
|---|---|
| Contracted (SE) | What you promised for that hour — your latest schedule |
| Actual (AE) | What the meters said happened |
| Deviation | Actual minus contracted. Too much is long. Too little is short |
Each unit also has a 5 % band (§6.2): a small tolerance for metering error. Stay inside it and you settle at the day-ahead price — the System Marginal Price (SMP). Step outside it and the whole deviation is priced at a harsher balancing price. Missing the band is a cliff, not a slope (§6.3).
If you never ask for a group, each unit walks that cliff alone. Being long in one zone does not cancel being short in another.
The group is a settlement overlay. It does not merge the units, move the meters, or change the zones.
Who sets it up — and who does not
You do. The BRP that owns the units designates them. Market Code §13.10(1). It is a request, not a default. Two rules:
- At least two Trading Units (§2.1(21)). One unit has nothing to net against.
- All yours. You cannot put another party’s unit in your group.
The Market Operator does not create the group for you. The System Operator does not approve it. The SO’s power is the opposite: it can take the benefit away for a congested zone — that is the catch below.
On this platform you designate the group on Trading
Units (/org/trading-units): select the units,
Group these units, name it, set the window, designate.
The Market API
(POST /api/v1/registry/participants/:mpid/balancing-groups)
does the same act for a machine. BRP / Market → Market
registry (/org/brp/registry)
shows the groups you have already designated — name,
member TUIDs, dates, status, and a cover forecast for
the next Trading Day. The forecast is an expectation: it uses
the scheduled position as a direction proxy because actuals do not exist
yet, and it labels itself as such. How to ask, and what a group is not,
is also §3.6.
A Balancing Group is not a trader pool (your commercial book), not a Trading Unit (what is scheduled), and not the Balancing Agreement you signed to join the market.
A worked hour — why the group is worth having
Same trader, one hour, nobody instructed. Prices are the ones this chapter already uses: SMP R900.00/MWh, selling balancing price R500.00/MWh, buying balancing price R2 742.86/MWh (§6.3).
| Member | What it is | Contracted | Actual | Deviation |
|---|---|---|---|---|
| Solar (Z1) | A plant that injects | 20 MWh produced | 28 MWh produced | 8 MWh long (too much sun) |
| Load (Z6) | A factory that draws | 100 MWh consumed | 108 MWh consumed | 8 MWh short (used more) |
Step 1 — each unit’s own 5 % band.
- Solar: 5 % of 20 MWh = 1 MWh. An 8 MWh miss is far outside.
- Load: 5 % of 100 MWh = 5 MWh. An 8 MWh miss is outside.
Both units have fallen off the cliff. Without a group, each is priced at the balancing price on all 8 MWh, not just the bit past the band.
Step 2 — ungrouped money (two pockets).
- Solar is long, so the market buys the extra 8 MWh from you
at the selling balancing price:
8 × R500.00 = +R4 000.00. - Load is short, so you buy 8 MWh from the market at the
buying balancing price:
8 × R2 742.86 = −R21 942.88.
Net: −R17 942.88. The extra solar and the extra factory use cancelled in the real world. The prices did not cancel, because selling-balancing and buying-balancing are different numbers. You paid a penalty for being the same person in two zones.
Step 3 — grouped (the trousers).
Add the two promises, then add the two meters:
- Group contracted:
20 produced − 100 consumed = 80 MWh net consumption. - Group actual:
28 produced − 108 consumed = 80 MWh net consumption. - Group deviation: 0.
The 5 % band is now asked of the group. Zero is inside any band. §13 stops asking “did this unit miss?” and starts asking “did this group miss?”
Each member still settles its own 8 MWh — but at the SMP, which is what the energy was worth that hour:
- Solar:
8 × R900.00 = +R7 200.00 - Load:
8 × R900.00 = −R7 200.00 - Net: R0.00
No penalty exists anywhere in that settlement. The two halves are the same price, so they cancel.
| Ungrouped | Grouped | |
|---|---|---|
| Solar, 8 MWh long |
|
|
| Load, 8 MWh short | − R 21 942.88 | − R 7 200.00 |
| Net to you | − R 17 942.88 | R 0.00 ✓ |
Grouped, both legs use the SMP. That is why they cancel. Ungrouped they use two different balancing prices, so they cannot.
That is the strongest argument in the Market Code for putting a whole portfolio under one BRP and then designating the units. You set a group up when you hold several units whose misses tend to offset — a trader with generation in one zone and load in another is the usual case.
The catch — the trousers can lose a pocket for an hour
The System Operator can flag a zone’s exports or imports as full (§3.3(6)): the wires cannot take any more out, or cannot take any more in. Then §13.10(2) does not switch the whole group off. It drops only the members who are making that jam worse, and only in the hours the flag covers.
Think of a one-lane bridge at rush hour. The group is a car-pool sticker. If the bridge is jammed outward, the officer pulls out the passenger who is pushing more traffic onto the bridge — a generator that produced above schedule, or a factory that used less than scheduled (both send extra energy out of the zone). The passenger who is relieving the jam stays in the car. A unit exactly on schedule is never pulled out: there is no direction to a miss of nothing.
The other way round if the zone cannot import.
This is checked hour by hour. The group can be intact at 14:00 and broken at 18:00.
Same numbers, catch applied. The SO flags Z1 (the solar zone) as export-constrained in this hour. The solar unit produced 8 MWh above schedule — that is extra energy leaving Z1 — so it is excluded. The load in Z6 stays. There is no group left to net against.
The solar unit is now alone (and long). The load is now alone (and short, outside its 5 % band). You are back on the ungrouped line: −R17 942.88. The relief you counted on vanished in the hour the network was tight — which is usually the hour you most wanted it.
At 18:00 the solar unit is pushing extra energy out of a full zone, so it leaves the group. The load stays. Netting collapses. The empty-road hour at 03:00 has the sticker back.
So the benefit is real, and it is contingent. Treat the group in V3 as a scenario, not as an assumption in every hour. The group view on the Imbalance screen shows every exclusion with its reason and its clause. A member silently dropped would look like a bug.
The cover forecast on Market registry is the answer to this warning before the hour: for the next Trading Day it names, per period, which members are expected to be excluded given the flags in force. It is labelled an expectation, not a settled result — actuals do not exist yet. If a Z1 member is out between 17:00 and 20:00 tomorrow, that is where you see it.
Careful. Designating the group does not move energy across a congested boundary. It only changes how the market prices mismatches that already cancelled inside your portfolio — and only while the wires can take it.
6.8 Preliminary and official
Balancing prices are calculated after the fact. A preliminary figure is published by 17:00 on the day after the Trading Day, from provisional metering. The official figure lands on day seven, once metering is verified and the dispatch instruction log is verified with it.
They are different numbers and both stay on the platform. The preliminary one is what you plan against; the official one is what you are invoiced on. A dispute does not hold either up — the Code requires payment first and argument after, and an adjudicated correction arrives later as a Settlement Rerun, which records a new figure rather than erasing the one you were invoiced.
The screen labels every figure with its stage and the metering vintage behind it. If you export imbalance data, export the label with it.
6.9 What the screen shows
Per Trading Period:
- The three quantities — contracted, instructed, actual — and the deviation.
- Whether an instruction applied, and if so which clause removed your 5 % band.
- The band allowance, and the counterfactual if you breached it.
- The System Marginal Price and both balancing prices, with diagnostics if either is degenerate.
- Every leg: its clause, the volume, the price basis and the amount.
- Any unpriced volume, with its clause.
- For a grouped unit: the group’s netting, the response allocated to each member, and any exclusion.
Two rules the screen keeps in front of you:
- Imbalance is per hour. A perfect month with one bad afternoon still pays for that afternoon — and if that afternoon was a tight hour, it pays three times over.
- It is attributable. Drill into the legs before you argue with the MO file (§8).
PPA settlement vs balancing. Contract settlement (V4) prices delivered energy under your PPA. Balancing is the wholesale settlement of schedule error. They share meters; they are not the same ledger.
Follow along. Seat:
trader_1@webill.net(BRP). Path: BRP / Market → Imbalance → choose delivery date → open a Trading Period. You should see the three quantities, the band status, both balancing prices with diagnostics, and every leg with its clause.
The Market Operator does not re-price imbalance on
Bidding. The MO stack is the anonymised Balancing desk
(/mo/balancing) — both prices, the [D-07]
alarm, preliminary vs official. This screen
(/org/brp/imbalance) is where the organisation reads
its own legs. The two views are the same run seen
twice; they are not two models.
Where this is taught. V3 sets the risk limits this chapter’s numbers feed. V8 §8 teaches the contract ledger; it is not the balancing ledger. V21 owns the D+1 worker operation.
6.10 How a DAM hour shows up after meters
Do not subtract the IDM charge from EPM. They are
different pots.
Data. full_demo · seed 42 · Trading Day 2026-07-15 · hour 18:00 · SAWEM-SPEC §10 / market-dam.md §11.
TU-PV1 at 18:00:
| Ledger | Figure | What it is |
|---|---|---|
| EPM | + R 67,500 | 75 MWh unconstrained × R 900. Stays. |
| CSC | R 0.00 | 15 MWh constrained off a zero-priced curve. |
| SE after IDM | 20 MWh | Iteration 4 re-declaration. |
| IDC | − R 37,800 | 40 MWh × R 945, against instruction. |
| AE vs SE | balancing | Meters against 20, not against 75. |
8. Reconciliation and disputes
Screen: After Delivery
(/org/brp/after-delivery/month) — the Market Month room (V10 §13). The old Recon tab is
the file-join on this page. It hosts the settlement statement
(#settlement-statement) and the query clocks
(#query-workflow), not only a file join.
ReconcileMonth runs at 07:00 on the 3rd of
each month — or you trigger the same path from the screen / MO
publish.
8.1 MO settlement file ≠ PPA settlement
Disambiguation. This chapter is the Market Operator’s monthly charge file vs your internal market ledger (accepted volumes × SMP, imbalance positions). Contract settlement under a PPA — banking, shortfall, statements — lives in V8 · Settlement. Same meters can feed both; they are different ledgers.
8.2 Line join
Internal expectation joins the MO file on
(settlement period, charge type):
| Classification | Meaning |
|---|---|
| MATCHED | Agree to the cent |
| WITHIN_TOLERANCE | Differ by less than tolerance — not flagged |
| VARIANCE | Real discrepancy — human worklist |
| MISSING_MO | You have a line the MO didn’t bill |
| MISSING_INTERNAL | MO bills something you have no record of |
Default tolerance: max(R 50, 0.1%) per line
(configurable per registration). Variance is signed MO −
internal.
Root-cause hints: quantities match, prices differ → PRICE; energy quantity differs → QUANTITY; imbalance quantity differs → METER.
Worked month (canonical recon narrative). 2 209 lines, 98.9% matched, net variance −R 8 420. Two flagged lines under a tight R 10 tolerance:
- 13 Aug 12:00 ENERGY — Internal
6.71 × 980 = R 6 575.80; MO R 6 609.35 (6.71 × 985) → variance +R 33.55, hint PRICE.- 14 Aug imbalance — Internal
1.51 × 1 850 = −R 2 793.50; MO −R 3 108.00 (1.68 × 1 850) → variance −R 314.50, hint METER.Offsetting errors are never netted. Each line stands alone.
Provenance: recon unit / demo narrative. Live: pick a reconciled month on the screen.
8.3 Dispute lifecycle
The inbox is the three-tier machine, not a legacy case list. Org Recon and the MO inbox (
/mo/dispute) are the sameMo.Settlement.Queryresource. Data Query, then Settlement Query, then Settlement Dispute — each with its own window and its own clock. The order is compulsory: you cannot reach a dispute without a query first. Pay now, argue later (clause 15.5(1)): opening or resolving a query never holds an invoice.
On a flagged line: Accept (absorb, leave the
worklist) or Raise query — the Code path. Evidence is
the bid, the meter and the schedule, not a JSON stub.
Escalation is Data Query → Settlement Query → Settlement Dispute and
writes the same Mo.Settlement.Query resource the MO inbox
uses. The cheap window is the Data Verification Period; use it. An
internal DisputeCase kanban may still exist as a case file;
it is not the primary action.
The query is already in the MO inbox. The MO (V11 §12) resolves it — or, if the correction crosses the Settlement Recalculation Threshold, reruns for every participant. An unset threshold refuses the rerun. An invoice is never paused.
The query panel shows the Market Operator’s deadline
(#query-clock) and what happens if the query is upheld
(#if-upheld-materiality) before you escalate.
Next. Notices (§9). Worked delivery day that ends in recon (§12).
8.4 Join every line before you net anything
Your problem is not the monthly total; it is the individual MO line that does not explain itself. The join key is settlement period plus charge type. Classify each result before any human accepts or disputes it.
| Class | Meaning | First check |
|---|---|---|
| MATCHED | same amount | retain the joined evidence |
| WITHIN_TOLERANCE | small signed difference | confirm tolerance policy |
| VARIANCE | material difference | price, quantity or meter evidence |
| MISSING_MO | internal line absent from file | publication scope |
| MISSING_INTERNAL | file line has no expectation | charge type mapping |
Data. full_demo · seed 42 · stage S08 (market loop) · reconciliation narrative with 2,209 lines and 98.9% matched.
Line A begins with 6.71 × 980 = R 6,575.80 internally.
The MO says 6.71 × 985 = R 6,609.35, therefore
R 6,609.35 − R 6,575.80 = +R 33.55, a PRICE hint. Line B
begins with 1.51 × 1,850 = −R 2,793.50; the MO says
−1.68 × 1,850 = −R 3,108.00, therefore
−R 3,108.00 − (−R 2,793.50) = −R 314.50, a METER hint.
Their net is −R 8,420 across the complete worklist; neither line is
allowed to hide inside that net total.
Follow along. Seat:
trader_1@webill.net(BRP). Path: Reconciliation → month → variance line → Accept or Dispute → Mark submitted. You should see: period, charge type, internal and MO amount, signed variance, classification, hint and evidence pack fields.
The evidence pack contains the line ID, registration, period, charge type, both amounts, variance, classification, root-cause hint, source schedule and meter/instruction references. Its lifecycle is DRAFT → SUBMITTED → RESOLVED or WRITTEN_OFF; the MO seat controls the terminal decision.
Where this is taught. V8 §10 teaches contract-chain reconciliation, which is distinct from this MO file. V21 owns monthly worker operation.
9. Notices and market rules
Screen: Notices (/org/brp/notices).
9.1 Market notices
The MO broadcasts text notices to all BRPs. Types:
| Type | Use |
|---|---|
| GENERAL | Operational announcements |
| SYSTEM_STRESS | Grid / market stress messaging |
| PRICE_CAP_EVENT | Cap or floor events that change trading context |
Read them before you override a clock or chase a variance — the notice often explains why a gate moved or a band looks wrong. Publish side: V11 §12.
9.2 The market rule set — twenty-four numbers and eight switches
Every market parameter is versioned data, not a constant in code. Every bid pins the version it was built under. When the MO publishes a new version, clocks and validation follow the new row — no redeploy.
There are twenty-four Annexure 2 / MGC figures, grouped as the Market Code groups them, plus a twenty-fifth market phase row that is a NERSA determination rather than a Code clause (§18). The MO console publishes all of them with the clause each comes from and the date it took effect (V11 §12). What follows is what each Annexure 2 figure does to you.
The three that change your money most.
| Parameter | Value | What it means for you |
|---|---|---|
| Market Price Cap | R 5 396.40/MWh | The most a megawatt-hour can be worth in an hour. Offer above it and you are not paid above it — but a separate payment exists for the energy you were scheduled for anyway, and several clawbacks apply if you then do not deliver. |
| Metering Accuracy Band | 5 % | Slack. Miss your contracted position by less than 5 % and the difference settles at the ordinary hourly price, with no penalty. Breach it and the whole deviation reprices — a cliff, not a slope. |
| Out of Merit Energy | 2 000 MW | An allowance in the penalty formula so large it can switch the imbalance penalty off entirely. When it does, the platform raises an alarm rather than quietly banking the free ride. |
Prices and caps. The price floor (−R 1,000/MWh) is the least a megawatt-hour can be worth — negative, because at times it is worth paying to stop generating. The intraday price collar (±5 % of the day-ahead price) bounds how far an intraday auction can move away from the day-ahead result, so a thin auction cannot mint a wild price.
Standby (reserve) floor prices. Three numbers — instantaneous R 50, regulating R 50, ten-minute R 0 per megawatt — the least you are paid for holding capacity in reserve, whatever the auction clears at. The ten-minute floor being zero means ten-minute reserve can genuinely pay nothing.
Gates. Day-ahead gate closure is 10:00 the day before. The intraday market is five fixed auctions, not a rolling window: 18:00 the day before, then 00:00, 06:00, 12:00 and 18:00 on the delivery day. Practical consequence: the last chance to correct a 19:00 position is the 18:00 auction, not 18:00 minus an hour.
Settlement and disputes. The Materiality Threshold (R 100,000) is the size a settlement error has to reach before it is worth reopening a closed period. Default interest on a late invoice runs at FNB prime overdraft, compounded monthly. The Settlement Recalculation Threshold — how big a change forces a rerun — is one the Market Governance Committee has still to set.
Security. Four numbers govern how much money you must put up and when you are warned: the Settlement Risk Period, the Undefined Exposure Factor, the maximum Warning Limit and the Credit Cover Adjustment Trigger. All four are undetermined — the Committee sets them annually and has not yet. The console shows them as MGC determines rather than as zero, because a zero here would compute a security requirement of nothing.
Who can be in the market at all. A generating trading unit is capped at 1 000 MW — a bigger plant becomes more than one registration. A generator needs 100 kW at medium or high voltage to participate at all.
The eight switches. Eight places where the published Market Code is unreadable or silent, each shipped as a parameter with a documented default rather than as a decision buried in code. The console shows which setting is live for each, with its defect number. They matter because they change money: whether a factory that chooses not to consume can set the market price; whether you are paid for what you produced or for what you were told to produce; whether an over-delivery penalty exists at all. The full list, with what each choice is worth, is in the programme’s decisions register.
9.3 Price forecast (ribbon, not bid prices)
RefreshPriceForecast at 12:30 builds
trailing P10 / P50 / P90 quantiles from recent clearing
prices (28-day history, bucketed by market × month × day-type × hour).
The Bid Desk shows a P10–P90 ribbon for context.
Rule: the forecast changes positions (hold
vs sell, netting, battery reserve) — never the price a
bid goes in at. Ladder maths from §4 stays
opportunity-cost truthful. Demo MO history is flat TOU, so the ribbon
can read 980 / 980 / 980 at noon; noisy real history
spreads the bands.
Strategy use of CE / netting. Book-level interpretation of market outcomes and certainty-equivalent decisions stay in V3; this volume owns the clocks and screens that feed them.
9.4 Rules are evidence, not screen decoration
Your ladder must be explainable under the rules that applied when you built it. A MarketRules version therefore travels with the bid: published rules change validation prospectively, never the historical meaning of a bid.
| Default | Value |
|---|---|
| price floor | −R 1,000/MWh |
| Market Price Cap | R 5 396.40/MWh |
| DAM gate | 10:00 SAST D−1 |
| IDM auctions | 18:00 D−1, then 00:00 / 06:00 / 12:00 / 18:00 on D |
| maximum bid lines | 96 |
Careful — this changed. The prototype carried a price cap of R 32,000/MWh. The Market Code sets it at R 5 396.40. A cap six times too high does not merely allow silly prices: five mechanisms in the Code fire only when a price exceeds the cap, so none of them ever fired. Numbers you saw before this correction, in any hour where a price approached the cap, were wrong.
9.5 Forecast bands are context only
Suppose the trailing noon history yields P10 R 700/MWh, P50 R 980/MWh and P90 R 1,400/MWh. The ribbon means one in ten comparable history points cleared at or below R 700, the middle point is R 980, and one in ten was at or above R 1,400. It does not mean “offer at R 980.”
Rule 1 is absolute: bid prices are frozen by opportunity cost and the safety margin when the ladder is built. A later forecast refresh can help you decide whether to preserve energy, net books or reserve a battery; it cannot rewrite a submitted rung.
Follow along. Seat:
trader_1@webill.net(BRP). Path: Notices → open a notice; then Bid Desk → Day-ahead → inspect the forecast ribbon. You should see: GENERAL, SYSTEM_STRESS and PRICE_CAP_EVENT notices, plus P10/P50/P90 shown separately from a rung’s price.
Where this is taught. V3 teaches the decision made from price context. V21 teaches the refresh job; this chapter owns the versioned market boundary.
Data. full_demo · seed 42 · stage S08 (market loop) · the Market Code commencement parameter set and a deterministic forecast ribbon.
9.6 Read notices before changing a process
GENERAL notices explain routine operations. SYSTEM_STRESS notices explain the operating context around an hour. PRICE_CAP_EVENT notices identify a floor or cap condition that can make a clearing result surprising. None changes an existing bid without a published rule version; retain both the notice and the pinned rules version when reviewing the day.
Careful. A gate shown by a published MarketRules version is binding even when a forecast ribbon changes after the bid was created.
9.7 The Market Operator’s clock is a ledger
The Market Code §1.2 table is sixteen callables. They live in
WB.Sawem.Cycles and run from cron (and from
Cadence on /mo/cadence). A missed SO
reserve requirement, an empty metering ingest, a Saturday credit-cover
pass, an official balancing on provisional metering — each is a
row, not a skipped healthy day. The parameter snapshot
is pinned on every run so a rerun months later can say what changed.
Nightly registry reassertion is a cron job, not a Refresh button. The registry board still shows the last check; the clock is what runs it.
12. Worked delivery day
Tuesday 15 July 2026. One Trading Day, from the five submissions that went in the evening before to the invoice three weeks later, with the real numbers at every step.
This is the same day the platform’s test suite asserts, figure by
figure — test/wb/sawem/golden_day_test.exs drives it
through the public API, and
test/wb/sawem/golden_day_console_test.exs walks it as the
Market Operator (Cadence → Metering → Balancing → Billing) and as the
participant (Daily schedule → After Delivery legs → Accounts cover). If
a number here and a number there ever disagree, the tests fail. That is
the point of printing them: a worked example nobody can check is a
story.
The cast. Five Trading Units, one interconnector, one Trading Period examined in detail (18:00), and a second (19:00) for the hour where the market is tight. Two units generate on merit, one is a peaker that never runs, and two are loads — one that must be served and one that will shed if the price is right.
| Trading Unit | What it is | Zone |
|---|---|---|
| TU-COAL1 | 500 MW coal, flexible, carries three reserve categories | Z6 |
| TU-PV1 | 75 MW solar, inflexible, offers at R0 | Z1 |
| TU-OCGT1 | 120 MW open-cycle gas, expensive, carries ten-minute reserve | Z3 |
| TU-DIST1 | 440 MW distributor load, must-serve | Z6 |
| TU-IND1 | 90 MW industrial load that will shed above R1 500 | Z6 |
12.1 D−1, before 10:00 — the five submissions
Each unit submits 168 hourly periods — seven days, not one. The Market Code asks for a week’s declaration at every gate, and a submission of 167 periods is rejected on the horizon rather than accepted short.
All five validate clean. Two shapes in them look like mistakes and are not: TU-PV1 submits four zero-width production blocks, which is what every renewable submits; and TU-COAL1 and TU-OCGT1 each price their must-run block above their first flexible block, which the Code permits.
Miss the 10:00 gate and you are not left with nothing: your previous submission is rolled forward a day, day 7 repeats because there is no day 8 to shift from, and the refusal tells you which profile you are now trading on and when you can next change it.
12.2 D−1, 14:00 — the schedule and the price
| Trading Unit | Scheduled at 18:00 |
|---|---|
| TU-COAL1 | +435.000 MWh |
| TU-PV1 | +75.000 MWh |
| TU-OCGT1 | 0.000 MWh |
| TU-DIST1 | −440.000 MWh |
| TU-IND1 | −90.000 MWh |
| interconnector | +20.000 MWh |
Positive is produced, negative is consumed, and the column sums to zero because the market cleared.
The System Marginal Price is R900.00/MWh. TU-COAL1 is the marginal unit: it is the most expensive flexible unit scheduled to run, and its R900 increment is the one the schedule stopped inside. Nothing is capped, and no unit’s inflexibility is doing the pricing.
The four reserve prices are R50.00, R50.00, R50.00 and R0.00 — regulating up, regulating down, instantaneous, and ten-minute — and all four sit at their floors. That is not a bug and it has a meaning: no unit holding capacity in those categories had a positive cost of lost opportunity, so the price is the governance committee’s floor rather than a scarcity signal. The ten-minute R0.00 is on 25 MW that genuinely qualified.
12.3 D−1, 14:00 — the day-ahead money
Every unit buys or sells its scheduled energy at the same R900.00. The energy account nets to exactly R0.00 — one price, a schedule that balances, a closed loop. Not “to the cent”; exactly.
Then the System Operator’s network model bites. A Z1 export limit of 60 MW means TU-PV1 cannot deliver its full 75 MWh, and TU-COAL1 makes up the 15 MWh:
| Line | Trading Unit | Amount |
|---|---|---|
| Constrained-off compensation (CSC) | TU-PV1 | R0.00 |
| Constrained-on payment (CPP) | TU-COAL1 | +R13 500.00 |
TU-PV1’s R0.00 is the one that surprises people, and it is right: a constrained adjustment is struck at the participant’s own offered price, and TU-PV1 offered R0/MWh. It keeps its R67 500 of energy revenue for 75 MWh it did not generate, and is compensated R0 for being asked not to. TU-COAL1 is paid R900 × 15 for the energy it generated instead.
Reserve capacity: TU-COAL1 is paid R2 250.00 — (15 + 10 + 20) MW × R50 across regulating up, regulating down and instantaneous. TU-OCGT1’s 25 MW of ten-minute reserve qualifies and pays R0.00, because that category’s price is at its floor.
12.4 Delivery day, 14:30 — the intraday market
Iteration 4 of five. TU-PV1’s forecast has fallen: it re-declares 20 MW against the 60 MW it was constrained to, and the market re-clears the hour.
The stack of on-instruction movements averages R1 412.50/MWh — but §10(10) collars the intraday price at the System Marginal Price ± 5 %, so the price actually struck is R945.00/MWh. The collar is what stops one hour’s scarcity being repriced into every intraday trade in it, and the indicative figure is published beside the collared one so you can see the difference the collar made.
| Trading Unit | Iteration 4 |
|---|---|
| TU-COAL1 | +R14 175.00 |
| TU-IND1 | +R43 000.00 |
| TU-PV1 | −R37 800.00 |
TU-PV1 pays because it moved against its instruction: it is buying back 40 MWh it had sold, at the intraday price rather than at its own offer. TU-IND1 is paid for shedding load it had contracted to consume.
12.5 Delivery day, 18:00–19:00 — what the System Operator told you
Four instructions to TU-COAL1: 450 MW at 17:00, 465 at 18:00, a manual move to 480 MW at 18:20, and back to 465 at 19:00. Each carries the ramp rate that applies to it — loading or de-loading, from your own registered data.
Your Instructed Energy for the hour is 475.234 MWh: the area under the ramp trajectory, not the level you were told to reach. The trace sums to 28 514.0625 MW·minutes, and the trace is published with the figure — segment by segment, with the minute each ramp starts and the minute it arrives — because the Code anticipates disputes about this number and a participant who can only be told the answer cannot dispute it.
The 0.234 MWh above 475 is the ramp between 18:18 and 18:20. It is small, it is real, and it is where the money in the next section comes from.
12.6 D+7 — imbalance
The meters say 474.000 MWh. You were contracted for 465 and instructed to 475.234.
Imbalance volumes for the hour: 3.734 MWh bought, 3.000 MWh sold across the market.
The Balancing Price (Buying) is R900.00/MWh — the same as the System Marginal Price, and the platform says so loudly rather than quietly. The Out of Merit Energy allowance in Annexure 2 is 2 000 MW; the whole balancing stack for this hour is 160 MW; so the allowance excludes the entire stack and there is no stack left to price against. The result is a Trading Period in which the balancing penalty does not exist. That is a market-integrity alarm, not a routine outcome, and it travels with the price.
| Trading Unit | Balancing |
|---|---|
| TU-COAL1 | +R8 100.00 |
| TU-PV1 | −R1 350.00 |
TU-COAL1 is paid 9 MWh at R900 for beating its 465 MWh schedule on instruction. It is not paid for the 1.234 MWh between what it delivered and what it was instructed to deliver: no clause in §13 reaches that gap, and the platform reports the unpriced volume rather than inventing a price for it.
12.7 The same hour, one hour later — where the penalty bites
At 19:00 the day is tight: the solar is gone, the distributor’s load has risen to 520 MW, and the allowance is scaled to the hour. Now there is a stack to price against.
The Balancing Price (Buying) is R2 742.86/MWh — a 3.05× multiple of the R900 System Marginal Price. The same MWh short costs three times as much in this hour as in the last one. That is what the balancing mechanism is for, and 18:00 is the hour where it failed to fire.
12.8 The month — the invoice, and somebody else’s default
Statements become invoices; invoices become cash. And one participant does not pay.
A R500 000 Unsecured Bad Debt is allocated across the market in proportion to what each creditor was paid. The cascade recovers exactly R500 000.00 — not R499 999.99, which would leave a cent nobody owns.
One creditor, MP-GAMMA, was owed R60 000 and has a debit note of R100 000. It cannot be netted off against a self-billing invoice that is smaller than it, so it becomes an Excess Participant and sends R40 000 in cash into the Trading Clearing Account within two business days.
That is the rule most worth reading twice: somebody else’s default costs you money in the same month, and it can cost you cash rather than a deduction.
12.9 Following it yourself
The operator and the participant read the same
objects. The kitchen ladder is not on this walk. Screenshots are not the
assertion — #schedule-view,
#balancing-statement, #settlement-statement,
#credit-cover on the org side and
#mo-cadence-ledger, #allocation-status-board,
#balancing-board, #billing-board on the MO
side carry the figures.
| When | Seat | Screen |
|---|---|---|
| Submit the week’s declaration | BRP | /org/brp/bid-desk — Daily #schedule-view
after publish |
| Watch the gate close | BRP | /org/brp/bid-desk |
| Run the day (gate → rollover → clear → publish) | MO | /mo/cadence — #mo-cadence-ledger |
| Allocate meters | MO | /mo/metering —
#allocation-status-board |
| Official balancing | MO | /mo/balancing — #balancing-board |
| Issue the month | MO | /mo/bidding/month — #billing-board |
| Re-declare in the intraday market | BRP | /org/brp/bid-desk/idm |
| Instructed Energy and imbalance legs | BRP | /org/brp/after-delivery/imbalance —
#balancing-statement (475.234 MWh) |
| Settlement chalkboard and energy account | BRP | /org/brp/after-delivery —
#org-energy-account-net R0.00 |
| Period statement / query | BRP | /org/brp/after-delivery/reconciliation —
#settlement-statement |
| Invoice and published cover | BRP | /org/market-accounts — #credit-cover |
| TU-PV1 windfall R13 500 | BRP (PV org) | /org/brp/after-delivery for that TUID |
There is no /so product. A dispatch instruction arrives
through the production SO adapter and is acknowledged; the participant
reads the consequence on After Delivery, not on a second operator
console.
The prices are public.
/pricesand the/api/v1/dam/prices/…,/api/v1/idm/prices/…and/api/v1/balancing/prices/…endpoints need no token at all. A price register only participants can read is not published, and somebody deciding whether to enter this market has to be able to see what it clears at.
Previously in the thread → V4 §7 · allocation hierarchy. Next in the thread → §13 · day-ahead money for the line-by-line arithmetic, §15 · getting paid for the settlement calendar, and §17 · where we had to interpret the Code for the eight places this day’s numbers rest on a reading rather than on the Code’s words.
13. How the day-ahead money works
13.1 The participant’s problem
You have a day-ahead schedule. By 14:00 the day before delivery the Market Operator publishes what you will be paid for it — and the statement has eight or nine lines on it where you expected one.
This chapter is what each line is, in the order they matter. There are only three ideas underneath them:
- Everyone who clears is paid the same hourly price. Not your offer — the price the market cleared at.
- If the System Operator moves you off that schedule, you are compensated at your own offer price. Which, if you offered zero, is zero — and you keep the payment for the energy you were originally scheduled to produce.
- Standing ready to help with frequency is paid separately, whether or not you were ever called.
Everything else on the statement is one of those three, wearing a clause number.
Where this is taught. §4.12 owns the clearing itself and §4.14 owns why there are two schedules. This chapter owns what lands on your statement.
13.2 The three pots
Your statement does not have one total. It has three, and they are three different obligations with three different counterparties. A single number across them would be a number about nothing.
| Pot | What is in it | Who it settles with |
|---|---|---|
| Energy market | Your energy payment for the day-ahead schedule | Other participants. Across the whole market this pot sums to exactly R 0.00 |
| Ancillary service recovery | Constrained-schedule adjustments, reserve capacity, above-cap payments | The System Operator, which recovers the lot as an ancillary service charge |
| Market Operator charges | The MO’s own fixed and variable fees | The Market Operator. Ring-fenced — this money never reaches a shortfall or a bad debt |
The first pot netting to zero is not an accounting convention, it is a proof. Everybody who clears is paid or charged at the same price against a schedule that balances by construction, so every rand paid in is a rand paid out. If it does not net to zero, the market cleared wrongly, and the Market Operator’s own board shows that residual on every published day for exactly that reason.
This pot does not need a named factory. An unpaired meter does not block it. The meter till — Actual Energy and imbalance — is §3.4 and §14.
The second pot does not net to zero, and is not supposed to. When the System Operator moves the system off the cheapest schedule, somebody has to carry the cost of that decision, and it is the System Operator — not the participants who did as they were told.
13.3 Your energy payment
One line, one clause, and the simplest arithmetic on the statement:
energy payment = your scheduled volume × the System Marginal Price
Two things about it catch people out.
It is struck on the unconstrained schedule — the one that ignores the network. If the System Operator later cut you back, that shows up as its own line, not as a smaller energy payment.
It is the same price for everyone. A coal plant that offered R350 for its first block and a gas plant that offered R880 for its last are both paid R900 if that is where the market cleared. Your offer decides whether you clear; it never decides what you are paid.
Consumption works identically with the sign flipped: a distributor scheduled to take 440 MWh at R900 is charged R 396,000, and that R 396,000 is part of what pays the generators. That is the closed loop.
An unpaired Point of Delivery does not stop this line. The meter till is §3.4.
13.4 Being constrained off is compensated at what you offered
This is the single most consequential paragraph in the chapter, and the one worth reading twice.
When the System Operator’s network limits move you off the unconstrained schedule, the difference is settled at your own offered price for the megawatt-hours involved — the integral of your own price curve between the two volumes. Not at the market price. Not at anybody’s cost. At the number you submitted.
If you offered zero, you are compensated zero. And you keep the full energy payment for the energy you were originally scheduled to produce.
Follow along. Open the Bid Desk on the worked delivery day and look at
TU-PV1in the 18:00 period.
The solar farm’s day:
| Unconstrained schedule | 75 MWh |
| Zone export cap | 60 MW — the System Operator cuts it |
| Constrained schedule | 60 MWh — what it actually generates |
| Energy payment | 75 MWh × R900 = R 67,500 (struck on the unconstrained volume) |
| Constrained sales charge | its own offer curve integrated from 60 to 75 = 15 MWh × R 0 = R 0.00 |
| Net | R 67,500 for 60 MWh generated |
Σ check: 67,500 − 0 = 67,500 ✓ — R 13,500 for fifteen
megawatt-hours it never produced.
That is not a defect being tolerated. It is what the Market Code says, and it follows directly from the charge being struck at the unit’s own offered price: a renewable with no fuel cost offers at zero, so buying its energy back costs zero.
Two consequences for how you price, pointing in opposite directions:
- Offering low is not only about clearing. A low offer is also the price at which the system can take your energy away for free. For a renewable that is exactly what you want. For a plant with a real fuel cost, an offer below your cost means being curtailed at a loss you cannot recover.
- Being curtailed by the System Operator is free; re-declaring your own capacity down is not. That is an intraday decision at the intraday price — §5 covers it.
The same clause runs the other way. The coal plant lifted from 435 to 450 MWh to cover the shortfall is paid its own offer for the 15 MWh increment — R 13,500 here, because its curve is at R900 in that block. Both sides of the constraint are settled at their own submitted prices, and the System Operator carries both.
On your statement a R 0.00 constrained-sales charge is rendered with that sentence beside it, not as a bare zero. A silent zero would leave the whole point invisible on the one screen built to show it.
13.5 Why your reserve payment might be zero
Contracting to hold capacity in reserve pays you whether or not the reserve was ever called. Four categories — Regulating Up, Regulating Down, Instantaneous and Ten-Minute — each with its own system price and its own qualifying rule.
A zero on one of those lines has four possible causes, and they call for four different responses. Your statement names which one applies; here is the one-line test for each.
| Cause | The test | What to do |
|---|---|---|
| Nothing contracted | The line is absent, or contracted capacity is 0 MW | Nothing is wrong. You did not contract for this category. |
| The system price is at its floor | Capacity qualified, price is R 0.00 | Nothing is wrong with your declaration. No unit holding this reserve had a positive cost of lost opportunity that hour — see §4.15. |
| A band condition failed | Qualifying capacity is 0 MW while contracted is not | Your scheduled position was outside the band the category requires. A failed band qualifies zero — it does not fall back to the contracted amount. Fix the declaration or the schedule, not the contract. |
| A performance adjustment factor | The amount is a fraction of qualifying × price |
The System Operator assessed your delivery below par. The factor is on the line. |
The distinction that matters most is the second versus the third. Floored means the market did not value this reserve that hour and you did nothing wrong. Out of band means you were paid to stand ready in a way you were not standing ready, and no payment is due. A participant who read the first when the truth was the second would change nothing and keep being paid nothing.
One rule reads backwards from everything around it and is worth stating plainly: if your reserve was actually used, you are paid on the full contracted amount, not on whatever headroom was left after the call. Utilisation is not a penalty. The surrounding text is all about headroom, which makes this the easiest rule in §9 to implement — and to read — the wrong way round.
13.6 The above-cap payment
If the market clears at the Market Price Cap and you offered above it, you are still scheduled and still paid the cap through the energy market. The difference between the cap and what you offered comes back as a separate additional day-ahead energy payment, out of the ancillary-service pot rather than out of other participants.
It applies to generation, on the flexible blocks that were actually scheduled. It never applies to a consumption curve: a load that “offered” above the cap is expressing willingness to pay, not a cost of producing, and paying it the difference would be paying it for consuming.
13.7 Reading the statement
Your settlement view groups the day by Trading Period, then by pot, with every line carrying its clause. Expect on a normal day:
| Line | Pot | Clause |
|---|---|---|
| Energy payment | Energy market | §9.8.1 |
| Constrained purchases payment / constrained sales charge | Ancillary recovery | §9.8.2 |
| Additional day-ahead energy payment | Ancillary recovery | §9.9 |
| Reserve capacity payment × up to four | Ancillary recovery | §9.8.4–9.8.7 |
Two lines explain themselves in prose beside the number — the R 0.00 constrained-sales charge and a zero reserve payment. The rest do not, deliberately: an explanation on every line is an explanation nobody reads.
The settlement is published inside your schedule report, not as a separate document arriving later. A schedule at 14:00 and a settlement at some other time are two documents you would have to reconcile yourself, which is the reconciliation the clause exists to remove.
Careful. These are day-ahead numbers, struck on schedules. What you are finally paid depends on what your meter says, and on any intraday and balancing positions in between. V8 owns the metered settlement that follows.
Where this is taught. V8 §8 owns the ledger and its sum-to-zero proof. §8 owns what to do when your own number and the Market Operator’s disagree.
14. Metering in the market
Screen: Bid Desk › Imbalance
(#allocation-exceptions-view) — your Actual Energy and its
allocation exceptions, with the vintage on the figure. Official Actual
Energy is refused when the vintage is provisional.
Everything in this volume so far has been about what you said you would do. This chapter is about what your meter says you did — and about the one rule that makes it settleable.
14.1 Every meter has two owners
Whatever flows through a metering point is sold by one party and bought by another. The market requires that to be true at every point, in every hour: the energy imported at a point by one Balance Responsible Party has to equal the energy exported by another.
That is not a formality. It is what makes an imbalance invoice possible at all — a megawatt-hour with only one name on it has no counterparty to bill, and no counterparty to pay. It is not the same rule as the day-ahead energy payment. The auction till can already have paid you for the schedule; this chapter is the meter till. Both tills, why a physical PPA names the importer, and what still settles when the meter is unpaired, are taught in §3.4.
So the platform allocates every metered hour as two legs: one at the point’s own Trading Unit, and one, sign reversed, at the counterparty’s. A wheeling chain looks like this:
| Generator’s point | injects 42 MWh → generator +42, trader −42 |
| Off-taker’s point | withdraws 38 MWh → off-taker −38, trader +38 |
| Trader’s net | −4 MWh |
Σ check: 42 − 42 − 38 + 38 = 0 ✓ — and the trader’s −4
MWh is where losses and forecast error land. Not modelled, not adjusted
for: it simply is the trader’s position, because the trader is
the counterparty at both ends and there is nowhere else for the
difference to go.
Careful. If your counterparty has not registered, your settlement stalls too. The rule is about the point, not about you, and one side cannot satisfy it alone. This is the single most common reason a participant’s first month does not settle, and the fix is somebody else’s — which is why we tell you as soon as we see it rather than when the invoice does not arrive.
14.2 Where your Actual Energy comes from
Three steps, and the middle one is where a lot of markets go wrong.
Your Network Operator submits the readings. It provides the metering services and submits the data for the delivery points in its jurisdiction — and for no others. A submission for a point outside its area is refused rather than quietly attributed, because two operators writing to one meter is how a settlement acquires two different truths.
We roll them up to the hour. The market settles hourly. Your meter may report every half hour or every five minutes, and all of that is kept — it is the evidence behind a dispatch instruction or an Instructed Energy dispute — but the settlement grain is the Trading Period and nothing else.
Note. A period missing some of its intervals is flagged incomplete, not scaled up. Two of four half-hours does not make an hour, and an extrapolated figure that settles is indistinguishable from a measurement afterwards.
We allocate them to Trading Units. Your Actual Energy is the net across every metering point allocated to that unit. Two things it deliberately is not:
- Not netted across your units. If you hold one unit long and another short, you get two figures. Netting them is what a Balancing Group is for, and a participant that has not formed one is not entitled to the effect.
- Not adjusted for network losses. Losses are the Network Operator’s own market purchase now, so they appear as its position. An uplift here would count the same energy twice.
14.3 Three vintages of the same number
The figure for a given hour arrives more than once, and which version it is decides what may be done with it.
| Vintage | When | What it feeds |
|---|---|---|
| Provisional | from the day after | preliminary balancing prices, indicative statements — never invoiced |
| Verified | within seven days | official balancing prices, your initial settlement statement |
| Revised | any time after | a settlement rerun, from a resolved query, a dispute or a meter test |
Every figure we show you carries its vintage, and the API puts it in a response header as well as in the body. An official figure cannot be produced from provisional data at all — the one exception is administered settlement, which is a declared state and not something that happens quietly because the data was late.
Note. A revision does not overwrite. The earlier reading stays readable with the reason for the correction beside it, because a rerun is defined as the difference between what settlement used and what arrived later — and an overwrite deletes exactly that difference.
How far a correction reaches depends on its size. Past the Settlement Recalculation Threshold it triggers a rerun and a recalculation of prices and the market schedule. Below it, the corrected data is simply used in the next run. That line is what stops one participant’s small metering error re-pricing the market for everyone else.
14.4 Why we show you exceptions rather than filling the gap
When energy arrives that cannot be allocated, the tempting thing is to estimate around it. We do not, because an estimate settles — and once it has, the fault is invisible.
Instead you get the exception, the volume at risk, and whose action it is:
| What is wrong | Whose action |
|---|---|
| The point resolves to only one party | Registry — a counterparty has to be registered |
| The point is not registered at all | Registry — or the identifier being submitted is wrong |
| The two legs do not sum to zero | Metering — a reading or a pairing is wrong at source |
| Still estimated seven days on | Network Operator — an actual reading is needed |
| The hour is missing intervals | Network Operator — supply the missing data |
Sorted by megawatt-hours at risk rather than by count: one unpaired point carrying 400 MWh matters more than forty carrying a tenth of one each.
Every exception comes with a button to raise a data query with the evidence already attached — the point, the periods, the volumes and the clause. You should not have to re-describe in an email something we are already holding.
14.5 The seven-day clock, and the one that disagrees with it
Metering is verified within seven calendar days of the Trading Day. Your window to query the data runs seven working days. Across a long weekend those two invert, and the literal reading would close your window before the verified figures — and the official prices built on them — even exist.
We do not do that. Official prices are never published on unverified metering, and your query window is held open until at least one business day after they are. Both dates are shown: the one we act on and the one the literal wording gives, because the discrepancy is worth fixing in the Code rather than papering over here.
14.6 The MO desk is where D+7 becomes official
Screen: Market Operator → Metering
(/mo/metering).
Your exceptions inbox is the participant view of one point. The Market Operator’s desk is the market view of the day: will this Trading Day verify in time, which Network Operator has not submitted, and which points are still unpaired. Official balancing prices are never published on unverified metering. The D+7 official run is gated on that vintage — the same refusal the cadence job already enforces — and the metering desk is where the operator sees it.
An empty registry (0 Trading Units, 0 Points of Delivery) is unready, not a green bar. Allocation has nothing to pair and raises no exceptions; that silence is the finding, not a clear network of meters.
No production Network Operator feed means empty ingest is the desk
state. The desk does not generate meters. The simulated 20-minute
overlay remains a labelled demo recommendation
(docs/references/market/spec/no-meter-readings.md).
Where this is taught. V8 owns the contract-level settlement your PPAs run through. §6 owns what happens to the difference between your Actual Energy and what you were scheduled for. V12 §3.4 owns Instructed Energy, which is the other half of that comparison. The MO stack is V11 §12.
Data. full_demo · seed 42 · metering points and their counterparties come from the market registry (§3).
15. Getting paid, and paying
This chapter is the money leaving and entering bank accounts: which document arrives when, when you have to pay it, what happens if somebody else does not, how much cover you have to hold, and the three ways to challenge a number.
Four things here surprise almost everybody the first time. They are flagged as they come up, and all four are in the Market Code rather than in our implementation of it.
15.1 The timetable
Follow one Trading Day — 15 July 2026 — through to cash.
| When | What arrives | Billable? |
|---|---|---|
| 16 July, 17:00 | Indicative Settlement Statement for the 15th | no |
| 16–24 July | the Data Verification Period — seven working days to query the data | — |
| 7 August, 12:00 | Initial Settlement Statement for the whole of July, and your invoice | yes |
| 13 August, 12:00 | your invoice is due — three business days | |
| 14 August, 17:00 | the Market Operator pays self-billing invoices — four business days | |
| 31 August | the timetabled Settlement Rerun for July | |
| 7 September, 17:00 | the last day to raise a Settlement Query on July |
Three notes on that table.
The indicative statement is not a bill. It exists so you can check the data before it becomes billable. That is the cheapest week of the month to find a wrong meter reading, and the seven working days are the only window in which a Data Query is available at all.
Every date comes from the published Settlement Calendar, not from counting days yourself. The Market Operator publishes it four months before the year starts, and it carries the non-business days as well as the deadlines. Notice that the 2026 invoice due date above is the 13th and not the 12th: 9 August is Women’s Day, observed on Monday the 10th, so the three business days run Tuesday, Wednesday, Thursday. If a holiday is gazetted mid-year the calendar is republished and every date moves with it.
You pay in three business days; we pay in four. That asymmetry is deliberate. The Market Operator has to have collected before it can distribute, which is also why a shortfall reaches creditors in the same month rather than the next one — see §15.3.
15.2 You pay a disputed invoice on time
This is the one people do not believe, so here it is with the clause.
Market Code §15.5(1). Amounts fall due notwithstanding any Data Query, Settlement Query, Settlement Dispute, Shortfall, Unsecured Bad Debt, Default, Suspension, Deregistration or Termination.
Pay now, argue later. There is no version of a dispute that pauses an invoice, and paying “everything except the R40 000 we disagree about” is not a partial payment — it is a Shortfall, and the Market Operator calls your credit cover the same day.
Nor may you set off. §15.3.4(2)(d) requires payment in full, without deduction, set-off or counterclaim; §15.10(7)(b) gives the right of set-off to the Market Operator alone, and only against a participant that has actually defaulted.
The reassurance is real, though, and it is the second half of the same rule: if you are right, you are paid back. The correction is settled on a Settlement Rerun and an underpayment by the Market Operator attracts Default Interest — the penal rate — while an overpayment by you attracts ordinary Interest. The market charges its own operator the higher rate. That is the correct way round.
15.3 What happens if somebody else does not pay
Here is the second surprise: another participant’s default costs you money, in the same month.
The chain is short. An unpaid invoice becomes a Shortfall. The Market Operator calls that participant’s credit cover forthwith, naming the Billing Period. If the shortfall is not cured by 12:00 the next working day it becomes Unsecured Bad Debt — and the Code shares that debt across everybody the market owed money to that month, in proportion to what each of them paid in.
The worked month, with real numbers. MP-ZETA fails to
pay R500 000.
| Party | Paid into the market | Share | Was owed | Debit note | Now receives |
|---|---|---|---|---|---|
| MP-ALPHA | R2 000 000 | 50 % | R600 000 | R250 000 | R350 000 |
| MP-BETA | R1 200 000 | 30 % | R300 000 | R150 000 | R150 000 |
| MP-GAMMA | R800 000 | 20 % | R60 000 | R100 000 | R0 |
And now the case that catches people. MP-GAMMA is owed R60 000 and its debit note is R100 000. It gives up the whole payment it was due and still owes R40 000, which it must pay in cash within two business days. The Code calls that a Debit Note Excess, and the party is an Excess Participant.
Why does it happen? Because the Code uses two different bases. The debt is shared on total payments — a gross number — and collected by reducing your self-billing invoice, a net one. A participant that buys a lot and sells a little pays a lot into the market while being owed very little, so its share of somebody else’s default can exceed the payment it was expecting.
If you are structurally a net buyer, budget for this. It is not an error and it is not rare.
The total recovered is exactly R500 000 — never more. There is a reading of §15.3.4(11) under which the market would collect the excess in cash and reduce the other creditors by the same amount again, recovering R540 000 against a R500 000 debt. We do not do that, we say why in the code, and if the market governance committee decides otherwise the switch is already there.
How to read a cascade on Accounts.
#cascade-explainer is the phone-call board: what you
expected, what you received, the shortfall that caused the note, your
share of creditors, and whether you are an Excess Participant. A
movement-row footnote is not a substitute. Sequential recovery is the
story; if the cumulative switch is live the board says so and flags
over-recovery. A month with no cascade shows an honest empty, not a
hidden section.
How to ask for money back from Trading Clearing.
#trading-clearing-withdraw records a request through
SettlementAccount.request_withdrawal/2. That account is
yours, held on trust. Collateral does not come back on
request — #withdraw-refused-collateral names
§15.2.1(5) before you click. Cover you could withdraw at will would be
cover only until the moment it was needed. Release is an outcome, never
a request.
The formal period statement
(#period-statement) is the document you file: opening,
movements, closing, as PDF and CSV. The collapsible movement table stays
the live ledger. An open period says it is open and does not pretend to
close. Self-billing invoices have their own panel
(#self-billing-detail) with the expected date and the paid
date.
If the Market Operator later recovers from the defaulter, everyone who was reduced is made good on the next month’s run, in the proportions they were reduced by.
15.4 Credit cover, recalculated every day
Accounts (/org/market-accounts) is the
till. The cover figure is yesterday’s 17:00 assessment
— the number recalculate_credit_cover/2 published, not a
live recompute. Changing what you have posted and refreshing the page
does not change the number until the daily job runs again. That is the
whole point: the Increase Notice and the dashboard must agree.
Both ways to satisfy a call stay on the page
(#satisfy-post — post more cover,
#satisfy-pay-early — pay an invoice early). An Increase
Notice is first-class: issued at, closes on, satisfied how. A
replenishment window without closes_on cannot be opened —
[S17] is not a number we invent. Cash is the only
enabled instrument; letters of credit stay modelled and
disabled ([S28]). The method note
(#cover-method-note) stays on the number:
[D-14] is a labelled default, not a settled formula. Market
› Info carries the same published strip.
Every business day the Market Operator recalculates what you must have posted, and tells you by 17:00. The number is
Required Credit Cover = Actual Exposure + Undefined Potential Exposure
where the first is invoices issued but unpaid plus statement amounts not yet invoiced, and the second is what you are likely to run up before you could be suspended for defaulting.
Two notices, and they are different. A Warning Notice fires when your headroom — posted minus required — falls to your Warning Limit. You are still covered at that point; that is what makes it a warning. A Credit Cover Increase Notice fires when you are actually short, and you have until 17:00 on the second working day to fix it.
And there are two ways to fix it. Post more cover — or pay an outstanding invoice early. Paying reduces your Actual Exposure by the same amount, so the requirement falls rather than the cover rising. If your problem is cash, that is the difference between answering a call and defaulting on one, and it is on the dashboard next to the notice.
We have to be honest about this number. The Market Code’s formula for credit cover is incomplete. Clause 15.10.3(4)’s published formula is unreadable in the gazetted PDF, covers only Demand Side Units, gives nothing for generator-side exposure, and there is no formula at all for the Undefined Potential Exposure half. So ours implements the shape the clause’s words require, with every coefficient a parameter, and we are documenting the derivation to the market governance committee under clause 15.10.1.
The method is on your dashboard, with its parameters, on the same panel as the figure. You are entitled to interrogate a number computed from a formula the Code does not give, and we would rather you did it there than in a hearing.
One more restriction worth knowing, because it protects you. The Market Operator may call your cover for its own unpaid charges only once any market debt has been covered in full, and the money goes to a different account. It does not recover its fees ahead of the market’s creditors.
15.5 The three ways to challenge a number
| Tier | When you may raise it | What it is for | Our clock |
|---|---|---|---|
| Data Query | during the Data Verification Period, the seven working days after the indicative statement | the data — a meter reading, an instruction, an availability figure | 10 business days |
| Settlement Query | after the Initial Statement, until 17:00 on the fifth working day after the last timetabled rerun | the settlement — how the data was applied, or any difference between the indicative and the initial statement | 1 month |
| Settlement Dispute | only after a Settlement Query | escalation, to the Dispute Resolution Board | the Board’s |
The order is compulsory. You cannot raise a Settlement Dispute without first raising a Settlement Query — the Market Operator gets a chance to answer before a board is convened. If we miss our own deadline the query becomes a dispute automatically, unless you grant us up to ten more business days.
One ground never needs a prior Data Query: if an item on your Indicative Statement and your Initial Statement disagree, that difference is itself a ground for a Settlement Query. It is the route that is always open.
Two things the screen tells you before you submit, because they are the two most common reasons a query becomes a dispute.
When the money actually moves. A Low Materiality correction — below R100 000 on that statement — is not refunded on Friday. The corrected data is used for any period not yet finally settled and the money moves on the next timetabled rerun. A High Materiality one gets an additional rerun for that period. Knowing which you are looking at usually ends the conversation.
Whether prices get recalculated at all. Only a correction above the Settlement Recalculation Threshold causes prices and market schedules to be recomputed. Below it, the corrected data feeds the next run and nothing else moves. That threshold is what stops one participant’s small error re-cutting the whole market — and while the market governance committee has not set it, we do not recalculate the market at all, because doing so on nobody’s authority would move every participant’s position.
15.6 And the correction applies to everybody
The fourth surprise, and the one participants are usually pleased about.
Market Code §15.5(3). Where resolving one participant’s query or dispute requires a rerun, the Market Operator applies the result to all participants.
A dispute is never settled bilaterally. Somebody else’s successful query can move your statement without you having raised anything — in either direction — which is why a rerun statement is a diff: it shows what changed, from what, to what, so you can see a correction you did not ask for.
15.7 How the Market Operator runs a month
On Cadence (/mo/cadence) or
Accounts (/mo/accounts), Run the
month is the same G5 job the scheduler calls: indicative
statements, the data-verification window, initial statements, invoices,
the timetabled rerun, then the weekday credit-cover pass.
BillingBoard on Accounts and Bidding → Month shows that
month — statement / invoice / self-billing / shortfall counts, the
cascade, and a gate-miss rate from the cadence ledger. Party rows show
name / MPID and Invoice / SBI / none.
A query that crosses the Settlement Recalculation Threshold offers a rerun for everyone. Leave the threshold blank and the button refuses — we will not move every participant’s position on nobody’s authority. A rerun that proceeds is a diff, not a new snapshot.
Credit-cover operations (#mo-credit-cover-ops) on
Accounts → Credit/Debit show required vs posted,
Increase Notices (post cover or pay an invoice early),
and replenishment windows. A window without closes_on is
refused. Cash is the only enabled instrument; letters of credit stay
disabled ([S28]). The debit-note cascade is on the same
tab.
Follow along. Seat:
mo@webill.net. Path: Cadence → Run the month → Accounts / Bidding → Month. Then Dispute: open a query from org Recon and confirm Pay now, argue later is on the inbox. You should see the same month on both boards, and resolving the query must not pause the invoice.
Where this is taught. V8 is contract settlement under your PPAs; this is the market’s. They share meters and are different ledgers. §8 joins the two line by line. §16 covers what happens when the systems fail. The document layer — Trading Unit and Balancing Group annexures, and the party Invoice / Self-Billing Invoice — is V15 §14.
16. When the market breaks
Two things can stop the market being settled the ordinary way: the systems that run it can fail, or the grid itself can collapse. The Market Code has a name for what happens next — Administered Settlement (clause 15.11) — and it is worth five minutes of reading before you need it.
16.1 The principle
The Market Operator reconstructs the day as closely as it can, using all available data and minimising estimation, and settles it inside the ordinary timescales. Your right to query and dispute is untouched. Once things are working again the day is rerun properly, and the difference between the reconstruction and the real answer is settled through revised statements and their invoices.
Two safeguards are worth naming.
Nothing is administered without prior written approval. The market governance committee must approve the detailed calculations and methodology before the run, not after it, and our switch will not act without a recorded reference. The methodology is published afterwards.
It is the same engine. Administered settlement is not a separate emergency system; it is the ordinary settlement pipeline with substituted inputs. A path that only ran in a crisis would be a path nobody had ever tested, and the crisis is the worst possible moment to find that out.
16.2 If the systems fail
The Market Operator computes an Administered Schedule — quantities per Trading Unit per period and prices per period, reproducing what the scheduling algorithm would have produced as far as is practicable. Prices default to the Wholesale Tariff unless the governance committee says otherwise. Everything downstream then settles on those figures.
16.3 If the grid collapses
This one has a design in it worth understanding, because it protects you.
On an Electrical System Collapse, both your scheduled energy and your instructed energy are set to your metered quantity at the moment of collapse. Both — not just the schedule.
The reason is arithmetic. Imbalance is the difference between what you were scheduled or instructed to do and what you actually did. If all three numbers are the same, every difference is zero, so no imbalance charge can arise from the collapse itself. A system that reset only the schedule would leave every participant in the market holding a balancing penalty for a grid failure nobody caused.
Reserve capacity qualifying reverts to the scheduled capacity per category on the same principle.
Where this is taught. §15 is ordinary settlement, which this is a mode of rather than an alternative to. V21 owns the operational response.
17. Where we had to interpret the Code
Market Code Rev 2.3 is the rulebook this platform implements. In eighteen places it does not say what to do — a formula whose operands did not survive the published PDF, a clause that contradicts its own equation, a definition with no formula that uses it, a condition that leaves a real case unpriced.
You are entitled to know where your settlement rests on our reading rather than on the Code’s words. This chapter is that list.
Ten of the eighteen have only one defensible answer and are implemented that way with the reasoning recorded. Eight are genuine forks, and those eight are settings rather than code: when the market governance committee decides, the platform changes by configuration, on a day the committee chooses, with no new software and a blast radius we have already measured.
Six of the eight move money. Where that is so, the size of the move is stated, because “the committee could decide either way” without a number is not information you can act on.
17.1 Can a factory that has been curtailed set the price?
Clause 9.7.2(2). Money: large.
The System Marginal Price is defined in generation vocabulary — the most expensive flexible unit scheduled to run. It never says whether a demand-side unit that has been partly shed counts.
In a comfortable hour the question does not arise. In a tight hour it decides the price of the whole market. In our worked scarcity hour the two readings are R2 600.00 and R900.00 — a difference of R1 700 per MWh, on every megawatt-hour traded in that Trading Period.
We read it as yes: a flexible consumer’s declared willingness to pay is a price. It bid, it was curtailed, and the marginal value of energy in that hour genuinely is what it was willing to pay. Reading it the other way makes scarcity invisible in the price, which is the one thing a spot market exists to signal.
Every clearing records the counterfactual — the price the other reading would have produced — so the committee can see the divergence measured across real days rather than argued about in the abstract.
17.2 Is the balancing penalty measured on what you delivered or what you were told to deliver?
Clauses 13.4.2 to 13.4.4. Money: moderate, and it recurs.
The on-instruction payment formulas integrate to Instructed Energy. The variable table for the same clauses lists Actual Energy, which is what your meter recorded.
In our worked hour the difference is R1 110.94 on one unit for one hour — for 1.234 MWh that was never generated.
We pay on what the meter saw. Paying on the instruction pays for energy nobody produced and nobody consumed, and a participant cannot check the arithmetic against anything it can observe.
17.3 The hour where the balancing penalty disappears
Clause 13.7(2) and Annexure 2. Money: large, and it is visible in the worked day.
§6.5 explains the mechanic: a 2 000 MW allowance subtracted from a stack that in a quiet hour is a few hundred megawatts, leaving nothing to price against and a Trading Period in which the balancing penalty does not exist. §12.6 is such an hour and §12.7 is the hour after it, where the same mechanism bites at 3.05× the System Marginal Price.
The decision, which is what belongs here:
We implement the literal 2 000 MW and raise a
market-integrity alarm every time it swallows a stack, with the volumes
attached. A market that published BPB = SMP with no
explanation would be a market nobody could audit. The fraction that
binds is a setting, so the committee can scale the allowance to the hour
without new software.
17.4 Which way is the Balancing Price (Selling) clamped?
Clause 13.8(2) against 13.9.1. Money: moderate.
One clause floors the selling price at the System Marginal Price; the other uses it in a way that only does work if it is capped there. Under the floor reading, over-delivering attracts no penalty at all.
We floor it, and emit a metric every time the floor binds, so the degeneracy is visible rather than silent. The cap reading is one setting away.
17.5 Can an offline peaker set the balancing price?
Clause 13.1(2). Money: moderate.
The Balancing Energy Sold stack is built from units’ increments. Nothing in the clause says the unit has to be able to deliver within the Trading Period.
An open-cycle gas turbine that is not synchronised and takes ninety minutes to start would contribute its whole must-run block — in our fixture 120 MW at R2 800 — to the price of energy it could not have delivered.
We require deliverability: synchronised, or able to synchronise inside the period. The alternative is one setting away and we would want to hear the argument for it.
17.6 Somebody else’s default, collected twice
Clause 15.3.4(11). Money: large, and it lands on the innocent.
When a participant does not pay, the debt is spread across everyone the market owed money to that month. The Code’s wording, read literally, both collects a cash “Debit Note Excess” and reduces the other creditors by the same amount — recovering R540 000 against a R500 000 debt.
We collect it once. The cascade recovers exactly the bad debt and never more, which is asserted as a property rather than checked on one example. The literal reading is available as a setting and reports its own over-recovery as a number, so the committee can see what it would cost.
17.7 What the additional above-cap payment is measured against
Clause 9.9. Money: moderate, and rare.
The formula for the additional day-ahead energy payment renders in
the published PDF as AEPMij = max( − , 0). The operands did
not survive whatever produced the document.
The prose says the payment covers the difference between the unit’s own price and “the System Marginal Price”. Because the System Marginal Price is itself capped, the two candidate readings coincide whenever such a unit is marginal, and diverge only when it clears infra-marginally. In our fixture that divergence is R224 820.
We follow the prose and measure from the System Marginal Price.
17.8 The deviation no clause reaches
Clauses 13.9.1 and 13.9.2. Money: small per event, frequent.
A unit that beat its schedule but missed its instruction — delivered more than it sold, less than it was told — falls between the two conditions. Neither the on-instruction leg nor the against-instruction leg covers it.
In our worked hour that gap is 1.234 MWh.
We leave it unpriced and report the volume, rather than inventing a price the Code does not give. A residual reading that prices it at the higher of the two balancing prices is one setting away.
17.9 The other ten
These have one defensible answer, and we implemented it. They are listed so the record is complete rather than because there is a decision to take.
| Where | What is wrong | What we do |
|---|---|---|
| §9.6.2(3) | A clause zeroes the regulating-down price in exactly the case its own formula is positive | The formula prevails; the clause is a copy-paste from three neighbouring sections |
| §10(10)(ii) | The intraday collar’s lower bound says “less than” where “more than” is meant, which would push a price away from the System Marginal Price | Symmetric collar, ±5 % |
| §2.1(24) | A Balancing Penalty Factor is defined, used by no formula, and given no value in Annexure 2 | Implemented as an inert parameter at 1.0, ready if the committee gives it a value |
| §13.4.1(2) | The Instructed Energy ramp function has no branch for two cases that occur in practice | Both branches added, derived from the same trajectory integral |
| §13.1(2),(3) | Stack construction has no mapping for demand-side units | Mapped by sign, consistently with §13.2 |
| §12.2(2) vs §15.3.4(1)(b) | Seven calendar days in one clause and seven working days in another, for the same window | Calendar days for metering, working days for settlement — each as its own clause says |
| §7.2(1)(c) vs §15.1(5) | Bank details held per Trading Unit, and Trading Clearing Accounts held by the Market Operator | Both, with the Trading Clearing Account as the settling account |
| §2.1(211) vs §14.2(3) | Hourly Trading Periods against five-minute and four-second data obligations | Hourly for settlement, sub-hourly retained for audit |
| Annexure 2 vs §9.7.1 | The Market Price Cap is given as a fixed R5 396.40 and defined as a tariff-derived value | The fixed figure, flagged for review at each tariff determination |
| §15.10.3(4) | The Required Credit Cover formula is unreadable and gives nothing at all for Undefined Potential Exposure | The shape the words require, every coefficient a parameter, and the method shown on the dashboard beside the figure |
17.10 What happens when the committee decides
Nothing is recompiled. Each of the eight forks is a value in the market parameter set, versioned and effective-dated like every other parameter, and a settlement run records which version it ran under. A run whose data is unchanged but whose parameters moved is a different run and cannot claim to reproduce the earlier one — which is what makes a decision auditable after the fact rather than merely announced.
Where to look. The Market Rules panel on the Market Operator console shows the current setting of all eight with its clause. The published
/api/v1/publication/data-exchangedocument carries the same list.
17.11 Certified reserves and emissions — two §7.2 readings (MS14)
Clause 7.2(q)–(t) and 7.2(1)(i)(e).
- Certified capacities are a workflow output, not a form
field. The Code says they are “agreed by the SO”.
Capturing them as participant text would fabricate an SO agreement. An
uncertified unit therefore registers with 0.000
certified capacity — the truthful state — and the SO decides on
/so/registry(orPOST /internal/so/reserve-certifications/:id/decision). - Emission data is a plant fact. It lives on the
wheeling
GeneratorSiteand is snapshotted onto the Point of Delivery at registration. Format stays open ([S27]); the map carries areporting_basis.
dispatchable? has no schema default
([D-20]). A silent true trapped every renewable
IPP. Wind/solar PV prefills false in the onboarding wizard;
everything else asks explicitly. Unsupplied blocks registration.
17.12 May the Market Operator cancel a Balancing Group?
Clause 13.10(1). Designation is the BRP’s act. The clause does not say the Market Operator may cancel a group, and it does not say the Market Operator may not.
A group whose member was deregistered has fallen below two live units (§2.1(21)) and cannot settle. Leaving it designated until the BRP notices is a settlement dispute waiting for a night. We let the Market Operator cancel, with a mandatory reason, and we record the cancellation as the MO’s act. The Market Operator still may not compose membership — designate and amend stay the BRP’s.
Three other readings we locked the same way, because they are the only readings that keep the four stop mechanisms distinct:
- A suspension may be raised before the group is in force. The suspension window is independent of the group’s window; forbidding it adds a rule with no purpose.
- Amending membership re-triggers the §7.1(5) cutoff. An amendment is a standing-data modification: one cutoff, one explanation.
- There is no
:DRAFTwrite. Designation is a single act. A draft group is a group that does not exist. The enum keeps the value so a future save-and-return flow has somewhere to go.
17.13 Who is the second BRP when there is no PPA?
Clauses 12.3(1), 7.2(1)(i)(d), 7.1(6). Money: the whole imbalance line on that meter. Product reading, not a Code fork.
A merchant plant selling only into the day-ahead stack wants an unknown price counterparty. That is allowed: the Market Operator never owns electricity, and the energy pot pays the schedule against other participants (§3.4).
The meter still needs a named importer. In a classic
pool that someone is a residual-grid BRP — the Network Operator, or
Eskom as residual supplier. This platform does not invent that
party. It derives the second name only from a
SIGNED or ACTIVE physical PPA. No contract →
the point stays empty → Actual Energy for that meter is an exception,
not a finished imbalance.
We do not type a residual BRP to clear the row. A plausible-looking name would settle real energy against a party that never agreed to take it — the same reason we refuse to invent a counterparty on the registry board. If the committee later designates a residual-grid BRP as the default importer for unpaired merchant points, that is a configuration change with a published effective date, not a silent fill.
Participant control evidence
Trading controls record the participant’s operational choices separately from the Market Operator’s intake validation. The kill switch blocks participant DAM and IDM writes, each bid records its builder version and available forecast version, and annual self-assessment packs retain control and approval evidence. These records support review; an empty section is not proof that a control was exercised. The export is scoped to the signed-in organisation and returns “not found” when no annual pack has been produced.
18. Market phases
A market phase is a NERSA determination: which doors of SAWEM are open, to whom, and from which size. It is not a software release, not a feature flag, and not one of this programme’s own build stages. It lives in the same effective-dated register as every other Annexure 2 figure (§9.2) — last value carried forward, a pinnable snapshot hash, a publish that is reviewed then confirmed.
The register row is market_phase. Beside it sits a small
matrix that says what the phase permits: DAM
participation (by party class), IDM participation, private-trader SAWEM
access, a wholesale eligibility floor in MW, forward-market
registration, and vesting. Forward-market registration is consumed from
§20: a schedule submitted
in a phase where the matrix has the capability disabled is refused, and
the refusal names the phase clause. Dormant means unconsumed, not
disabled — and this key is no longer dormant.
Phase 1 as seeded is everything open and nothing thresholded.
Changing phase is a register publish on Market
Operator → Rules (/mo/rules), not a
deployment.
Follow along. Seat: Market Operator. Path: Reference → Rules. You should see a Market phase section above the parameter groups: the phase in force, its determination, its effective date, and the capability matrix. Party class appears only on DAM rows. The floor column appears only on the wholesale-eligibility row.
18.1 What the matrix permits
| Capability | What it gates | Party class |
|---|---|---|
| DAM participation | Offering into the day-ahead market | One row per admissible party type |
| IDM participation | Lodging an intraday re-declaration | Market-wide (ANY) |
| Private-trader SAWEM access | A :TRADER being issued the Market Participation
Agreement |
Market-wide |
| Wholesale eligibility floor | Trading Unit MCR versus a MW threshold | Market-wide |
| Forward-market registration | Submitting a physical bilateral schedule before the day-ahead gate (§20) | Market-wide |
| Vesting contracts | Whether a determination-sourced vesting CfD settles | Market-wide (ANY) |
A missing matrix row fails open: no restriction. A
published enabled: false row refuses. That is why an empty
test database does not start turning applications away, and why a Phase
1 seed of “everything open” does not need a special case in the
guards.
18.2 Admission — a private trader in Phase 1, door closed
Worked refusal. NERSA publishes a Phase 1 row that turns private-trader SAWEM access off. A licensed trader files, reaches CONTRACTABLE, and the Market Operator is about to issue the two agreements.
The platform refuses the issue. The sentence names the phase (Phase 1), the capability, the determination reference on that matrix row, and the door that stays open: register as a bilateral wheeling aggregator. That path does not require Market Participant status and is unaffected by this guard. The application state graph itself does not change — this is a precondition on issuing the agreements, not a new edge.
Republish the same capability enabled: true with a later
effective date and the same transition succeeds. The guard reads the
register, not a compiled assumption.
A generator (or any class the phase does not restrict) still issues as before.
18.3 Bid intake — the wholesale floor
Worked figure. The phase’s wholesale eligibility floor is published
at 1 MW. A Trading Unit whose registered MCR is
0.4 MW offers into the DAM. Validation returns
SUB_BELOW_WHOLESALE_FLOOR: the fault names the declared MW
and the floor, and the clause is the NERSA Draft Trading Rules, not a
Wholesale Market Code section — because that is genuinely the rule in
force.
A party class the phase has closed out of DAM (or IDM) is
SUB_PHASE_INELIGIBLE, with the same naming: phase,
determination, bilateral-aggregator alternative.
Both codes flow into the existing
422 submission_rejected envelope. There is no second
client-side check: the Bid Desk Validate button, the
API dry run and the real PUT call the same function.
A submission accepted for a Trading Day is not retroactively invalidated when a later phase takes effect after that Trading Day. Receipt-time is the principle; the phase in force on the Trading Day is the one that judges the offer.
18.4 Where you see the phase
Three surfaces, one register:
- Rules (
/mo/rules) — the phase section and the matrix. Editing the phase is the ordinary publish form (open → review → confirm). The matrix itself is read-only on the panel; a wrong row admits or excludes real trades, so it is never inline-saved. - Landing (
/) —#market-phase-badgein the header. - Demo Dashboard (
/demo) — a phase line on the simulated-market card.
If those three ever disagree, believe the register and republish. A demo that says Phase 2 in the room and Phase 1 on the glass is a publish, not a redeploy — see V21 §8.7.
Vesting contracts (§19) and the Forward Physical Market (§20) read this same matrix. There is no second switch.
19. The vesting instrument
A vesting contract is a regulator-imposed two-way contract for difference on a legacy generation asset. It is not a trade, not a deal in the wizard, and not a price you negotiate with a counterparty. A published determination names a unit, a volume profile, and a vesting price. The platform holds that schedule as data and settles it against the System Marginal Price for the vested volume only.
In year 1 a plant may be mostly vested and its revenue mostly stable. By year 5 the same plant is mostly merchant. That declining curve is the instrument: its purpose is to hand the asset its spot exposure in instalments, not to transact.
Where this lives. The Market Operator reads the book on Participants → Vesting (
/mo/participants/vesting) — V11 §21.13. A vested generator reads its own month on Month → Published results → Explain vesting (/org/brp/after-delivery/month) — V10 §13.5. Neither screen creates, amends, or terminates a contract.
19.1 What settles
For each Trading Period the vested MWh is the scheduled vesting
profile capped by what the unit actually delivered (and never below
zero). Volume above that cap trades merchant at spot, the same as any
other unhedged megawatt-hour. Volume the unit did not produce does not
vest: AE = 0 emits no vesting line at all.
The difference is vested MWh times (vesting price minus SMP).
Positive means the Market Operator pays the generator; negative means
the generator pays. The counterparty — by default the Central Purchasing
Agency registration, configurable per contract, resolved when the row is
written — receives the exact opposite amount. The energy account still
nets to R 0.00. The kinds are :VESTING_GENERATOR and
:VESTING_COUNTERPARTY on the energy account, clause
§2.1(221), §15.1. They are not MO-SPEC §11.2 administered
prices.
Missing SMP follows the same rule Stage 4 already uses for a market-indexed CfD: carry the last published price, flag the interval, never invent one.
19.2 The declining curve
The schedule is MW per time-of-use block (PEAK /
STANDARD / OFF), effective-dated, carrying
forward like every other parameter. A later period that raises
vested MW for a given block is refused: that would hedge the plant more
each year, which is the opposite of vesting. A genuine increase is a new
determination, recorded as its own contract with its own source document
reference.
Activation without a determination reference is refused. The demo
estate’s Mpumalanga Mid-Merit coal unit (BRP-SIM-IPP-12) is
labelled illustrative (NERSA-VEST-ILLUSTRATIVE-2026) at R
650/MWh so a traded month can settle both signs.
Vesting is on only when the phase matrix says so (§18). A contract whose period is live but whose phase has vesting disabled is dormant: readable, settling nothing, labelled with the phase that would activate it. Dormant is not “zero MW”.
19.3 Hedged versus merchant
The participant panel answers one question for the month: how much of what you produced was hedged, and how much went merchant at spot.
- Hedged is the capped vested MWh that actually
settled — the quantity on the
:VESTING_GENERATORlines, not the scheduled profile. - Merchant is delivered energy minus hedged (floored at zero).
- Money is the sum of that party’s vesting settlement lines. The screen does not recompute the difference. A number that disagreed with the statement would be a second, quieter statement.
An unvested seat sees an explanation, not zeros. “Not vested” and “vested for R 0.00” are different claims.
Follow along. Seat: the organisation that owns
BRP-SIM-IPP-12(passwordsupersecret). Path: Month → Published results → Explain vesting. You should see the hedged / merchant split, the vesting difference, and the schedule forward. A seat without relevant records has no vesting card; a saved link to the drawer explains that it is not vested.
20. The Forward Physical Market
The trading horizon on this platform used to start at the day-ahead gate. A party with a physical power purchase agreement could not register that volume with the Market Operator before D−1, so the day-ahead market cleared as if the megawatts were still up for grabs, and the transmission the agreement needed competed with every spot bid.
The Forward Physical Market is the horizon before that. You submit a schedule: how many MW flow from one seller Trading Unit to one buyer party in each Trading Period, over a week, a month, or a bespoke term. The Market Operator and System Operator validate it and register it. From that moment the volume is committed physically — it consumes transmission ahead of spot, and the day-ahead market clears only what is left.
This chapter is the door into that register, the residual-clearing rule that makes a registered schedule firm, the remaining-transfer capability the System Operator reports, and the participant API and screens that make the market operable.
Where this lives. The register is
WB.Sawem.ForwardSchedule. The gate isWB.Sawem.Forward.Gate. The lead time that closes the gate is an ordinary market-rules column (forward_registration_lead_seconds, default one day before the day-ahead gate for the schedule’s first delivery day), published on Reference → Rules (/mo/rules) with every other Annexure 2 figure. Remaining transfer capability isWB.Sawem.So.NetworkModel.remaining_transfer_capability/2. The participant API is/api/v1/registry/forward/…. The Market Operator register is/mo/forward. The organisation action is/org/deals/contracts/:ppa_id/forward; the Bid Desk panel is/org/brp/bid-desk/forward.
20.1 What a schedule is
A schedule is a header plus a profile.
The header names the seller Trading Unit, the buyer
party, the horizon, the first and last delivery dates, an optional
source contract, and a version. Two schedules between the same
counterparties for the same period are legitimate — you may hold two
contracts with one counterparty — so the register sums.
What stops one agreement generating the same schedule twice is
source_contract_id in the identity.
The profile is one row per Trading Period: a delivery date, the period’s UTC start, and a signed MW. The sign is the same one every settlement quantity uses — positive is injection at the seller unit, negative is withdrawal. A schedule and a balancing quantity never have to be sign-translated.
Standard products:
| Horizon | What horizon_end is |
|---|---|
| Weekly | Six days after horizon_start (seven delivery days) |
| Monthly | The last calendar day of that month |
| Bespoke | Written down on the header — a bilateral term that is neither a week nor a month has no derivable end |
The end is stored even for a standard product. Recomputing it at read time in two callers is how two callers eventually disagree.
An ACTIVE physical power purchase agreement can generate its own schedule: the profile’s period-sum equals the contract’s allocated energy for the horizon, split across time-of-use the way the contract already splits it. A contract that is not ACTIVE cannot generate one, and the refusal names the status it is in.
20.2 What registering commits you to
Status is a closed machine: SUBMITTED → VALIDATED →
REGISTERED. Supersession never deletes. A replacement is a new
row at version + 1; the old row moves to
SUPERSEDED and keeps its profile. A Settlement Rerun
that restates a past Trading Day has to say what the register
was on that day, or it cannot reproduce the clearing that ran
against it.
VALIDATED means the schedule is internally well-formed, inside its gate, and inside remaining transfer capability in every Trading Period of its profile. A schedule that would take remaining capability below zero is refused at validate: the refusal names the period, the edge, and the megawatts over. Registered schedules consume capability first-come; a later schedule that no longer fits is refused with the earlier registrations named, not silently pro-rated. Pro-rating a firm bilateral is exactly the thing “firm” is supposed to exclude. Registration itself is the Market Operator’s act, not the participant’s.
A schedule may only be superseded while its first delivery period has not started. After delivery begins the instrument is history. A party that wants to move volume mid-horizon uses the intraday market, which is what the intraday market is for.
20.3 When the gate closes
The forward-registration gate closes before the day-ahead gate for the schedule’s first delivery day. Compute it as the day-ahead gate minus the lead on the market-rules row in force at receipt. Changing the lead in the register moves the gate. No module constant holds it.
The gate that decides a submission is the one in force at receipt. A later extension of the day-ahead gate, or a later lead published after a refusal, cannot resurrect a rejection already returned. That is the same discipline the day-ahead submission gate already uses.
The phase capability matrix (§18) also sits on this door. In a phase where forward-market registration is not enabled, the submission is refused and the refusal names the phase clause.
20.4 What a refusal means
A late submission is refused in the participant’s own language. The payload names:
- what the gate was — the instant it closed, derived from the day-ahead gate and the lead in force at receipt
- when the submission arrived
- how late it was, in seconds
- what happens instead — the volume is not registered, will not consume transmission ahead of spot, and must be traded day-ahead like anything else
A cross-party read of a schedule the caller may not see is a 404, never a 403: a 403 would confirm the resource exists.
A skip from SUBMITTED to REGISTERED is refused: validation cannot be skipped. A non-Market-Operator caller cannot register.
20.5 The day-ahead market clears the residual
A registered schedule is not a bid. It enters the day-ahead clearing model as a constant — a fixed injection at the seller Trading Unit, the same treatment an inflexible unit already gets under C16. The solver never gets a column it could turn down. When a zonal export limit binds, the only megawatts it is allowed to reduce are the spot ones.
That is the whole of the priority rule. Nobody ranks a bilateral above a spot trade; the arithmetic does it. Over-registering a corridor so the constant itself exceeds the limit makes the constrained run infeasible (family C17). The Market Operator does not quietly curtail a firm bilateral.
Because the constant is not a decision variable, the published
day-ahead Solution reports only the
residual spot volume for the unit. Contracted Energy —
the baseline §13 measures every balancing deviation against — is
therefore:
Contracted Energy = residual day-ahead schedule + registered forward base
per Trading Unit and Trading Period. The intraday market still
revises the residual; it adds the same base after every iteration. A day
the intraday market never touched uses the constrained day-ahead
residual plus the same base. Filling se correctly is the
entire settlement consequence; how deviations settle does not
change.
Worked Trading Period
A seller unit is cleared unconstrained at 80 MWh. It has a registered forward schedule of 20 MW for the same hour.
| Figure | MWh | What it is |
|---|---|---|
| Registered forward | 20 | C1 constant; not a variable |
| Residual spot (published schedule) | 60 | what the day-ahead market chose |
Contracted Energy (se) |
80 | 20 + 60, the balancing baseline |
The identity holds per Trading Period, not in aggregate: registered + residual = original cleared. Removing volume from both sides of the pool can move the System Marginal Price; that is residual clearing working, not a bug.
On a constrained hour the same identity is the remaining headroom. A zone that may export 40 MW with 30 MW already registered leaves 10 MW for spot. The schedule is delivered in full; the spot trade takes what is left.
20.6 Remaining transfer capability
remaining transfer capability(edge, Trading Period) = declared or assumed capability − the sum of REGISTERED forward-schedule flow across that edge in that period.
Per Trading Period, never a daily average — an average hides the hour that binds. Stage 13 turns this figure into available transfer capability and quotes it across a border; the definition lives here once so that stage does not invent a second one.
Edges:
| Edge | Capability source |
|---|---|
| Zone export | Declared ZoneCapability.export_capability_mw when set;
otherwise the outbound corridor roll-up |
| Corridor | Corridor capability. Registered zonal export is attributed only when the corridor is the zone’s sole outbound path |
| Interconnector | Declared or assumed export on the SA side; the same unique-path
attribution from sa_zone |
Provenance travels with the number. A remaining figure computed off
an ASSUMED capability is itself ASSUMED, and it is
not publishable as a network limit. The platform
implements exactly one security-constraint kind
(:ZONAL_EXPORT_LIMIT); corridor sums are a necessary bound
rather than a corridor-flow model, and remaining capability inherits
that honesty.
This check is what stops T11M1’s over-registered day — an infeasible constrained run — from ever being built. Infeasibility is the net; this is the gate.
20.7 The participant API
Four endpoints, party-scoped like the day-ahead block. A read for another party’s unit is a 404, never 403.
| Method | Path | Purpose |
|---|---|---|
GET |
/api/v1/registry/forward/gate/{delivery_date} |
Gate state, remaining seconds, server time |
POST |
/api/v1/registry/forward/schedules/{horizon_start}/validate |
Dry run — the same errors, nothing stored |
PUT |
/api/v1/registry/forward/schedules/{horizon_start}/{tuid} |
Submit a schedule for the unit |
GET |
/api/v1/registry/forward/schedules/{horizon_start}/{tuid} |
The accepted schedule |
Every response carries X-Sawem-Server-Time. Decide
whether you still have time against that clock, not yours. The gate
endpoint returns the same shape the day-ahead gate already uses: open or
closed, closes-at, remaining seconds.
Idempotency is unchanged: the 24-hour window keyed
(mpid, method, path, idempotency_key) with the canonical
body digest. A replay is marked
X-Sawem-Idempotent-Replay: true. A reused key with a
different body is 409 idempotency_key_reused. A
PUT accepted one second before the forward gate, and the
identical retry after it, return the same answer — the
gate-boundary property the day-ahead market already honours.
Decimals are strings. Instants carry the +02:00 offset.
The body names the buyer (buyer_mpid or
buyer_party_id), the horizon, and the period list.
20.8 What the Market Operator does between submission and registration
You submit. The Market Operator validates, then registers.
- SUBMITTED — the schedule is on the register at
/mo/forward, visible, not yet consuming transmission. - Validate — the remaining-capability check in §20.6. A pass moves the row to VALIDATED. A refusal names the period, the edge and the megawatts over, and names earlier registrations that already took the room.
- Register — the Market Operator’s act. From this
moment the volume is a C1 constant in the day-ahead run, Contracted
Energy includes it, and remaining transfer capability on the capacity
view (
/mo/forward/capacity) drops by those megawatts.
The capacity view stamps ASSUMED on every remaining figure whose underlying capability is assumed. A figure carrying that stamp may not be published as a network limit.
An organisation holding an ACTIVE physical agreement can generate the
profile on /org/deals/contracts/:ppa_id/forward, read it,
and submit. A trader on the Bid Desk sees the day-ahead position
on top of the registered forward base at
/org/brp/bid-desk/forward — two figures, even when one is
zero. Those screens are taught in V10 §18 and V11 §27.
SAPP FPM-Monthly and FPM-Weekly expand onto this same register — a foreign-currency price and a cross-border path, not a second forward model. Remaining transfer capability here is what regional ATC subtracts from. Taught in V18 §2 and V18 §4.
21. Why your solar earns less than the average price
Three figures answer three questions:
| Figure | Question | Calculation |
|---|---|---|
| Acceptance | How much of my offered volume cleared? | Accepted ÷ offered volume |
| DAM capture | How good were the prices my accepted offers achieved? | Achieved price ÷ generation-weighted market price |
| Capture rate | How valuable were my generation hours? | Generation-weighted price ÷ time-weighted market price |
On Bid Desk, Market context & benchmarks opens a historical comparison drawer. Its detailed technology table shows the last 30 days, floor share, metered-site count and provenance. A technology with too few metered sites uses a profile and says so. Missing price hours are not filled. Rolling windows combine energy and price sums, not daily percentages.
Where this is taught. Open and interpret the drawer in V10 §12.2.5. It describes historical capture, not a forecast for the selected delivery day.
The daily job runs after prior-day metering and imbalance. Corrections append a version and retain the previous observation. Shape matrices require observations in all twelve calendar months; an incomplete matrix is refused.
The solar-glut scenario prices midday at R150/MWh for fourteen days. On the representative solar shape it produces 33.81% cannibalisation, above the seeded 25% warning. Scenario observations have a separate series reference and do not replace published-market benchmarks. S16 bid submission alone does not publish an SMP: a missing price is reported as unmeasured.
