1. Deal types and topologies
Before the screens, the cast. Every deal on this platform is a promise between two sides about energy (and sometimes about money that follows the energy price). Three kinds of company show up:
| Plain name | Platform term | What they do |
|---|---|---|
| A power plant owner | IPP (independent power producer) | Owns a generator site — wind, solar, and so on — and sells its output |
| A factory / consumer | Off-taker (see off-taker site) | Uses electricity at a site and wants a deal that covers some of that use |
| A middle player | Trader (see trader pool) | Buys and sells power (or power hedges) as a book — not the plant, not the factory |
A deal is the commercial handshake that becomes a contract once everyone agrees and signs. Until then you are usually looking at a proposal — an offer that can still be accepted, declined, or answered with a different shape.
Every deal also sits in one cell of a small matrix:
- Who sells to whom — the deal type
- Physical or virtual — the instrument (which product you are using) (V0 §3.2 · V0 §5)
Knowing your cell up front tells you which wizard steps you’ll meet, which terms exist, and how settlement will treat you.
1.0a Physical vs virtual — in plain words
- Physical means real electrons are allocated from a seller’s meter toward a buyer’s meter across the network (a wheeling path). You care about connection points, losses, and network charges.
- Virtual means you are mostly hedging price, not moving a dedicated parcel of electrons plant→factory. Both sides must be Eskom-connected and ready for the virtual registration path (often called VWA-ready). Think “contract for difference against the Eskom bill,” not “this truck of power went to Midrand.”
Neither word is a quality judgment. They are two different products.
| Deal type | Physical (plain English) | Virtual (plain English) |
|---|---|---|
IPP → Off-taker (OFFTAKER_IPP) |
The classic wheeling deal — plant output allocated toward a factory | A direct price hedge against the buyer’s Eskom bill (CfD = contract for difference) |
IPP → Trader (TRADER_IPP) |
The trader buys the plant’s output into its portfolio | A wholesale CfD; the trader carries the price risk |
Trader → Off-taker
(OFFTAKER_TRADER) |
The trader supplies a consumer from its portfolio | A retail CfD, often using the WER (wheeled energy refund) in the price reference |
Trader → Trader (TRADER_TRADER) |
A mid-chain portfolio deal between books | A mid-chain financial hedge between books |
1.0b Topology — the path on the network
Topology is simply where each site plugs into the grid and whether the deal crosses boundaries. It decides losses and network charges (V0 §1, V2 §8.3). On the proposals list you see a seller→buyer chip chain; an “Eskom” hop appears when the deal crosses municipal boundaries. Virtual deals need both parties Eskom-connected.
You do not pick topology as a fashion choice — it falls out of the two sites you are pairing.
1.0c Contract type — the shape of the energy promise
For physical deals, contract type is the answer to: when the wind dies or the sun dips, who promised what?
Think of a day as a timeline of megawatts. Generation (what the plant actually made) is the shaded band. The promise is the bold line — what the contract said the buyer would get, or pay for.
The buyer picks a contract type from the shapes the seller
supports (a wind site cannot credibly offer a flat 24-hour
block). That choice also prunes the terms: an AS_GENERATED
deal has no shortfall terms to argue about; a TOP deal has
no spill argument in the same way.
AS_GENERATED
In plain words: whatever the plant makes, the buyer takes (subject to the path). There is no guaranteed shape. Example: a wind farm on a gusty day — the buyer rides the weather with the plant.
FIRM
In plain words: the seller promises a profile. If the plant under-delivers, the seller covers the shortfall (how is a later term). Example: “you will get this daytime shape every weekday” — even if the panels underperform, the promise still stands commercially.
CAPPED
In plain words: like as-generated, but once production hits an agreed ceiling, extra output is not part of this deal (it may spill or go elsewhere). Example: “take my solar up to 2 MW — anything above that is not yours under this contract.”
BASELOAD
In plain words: a steady slab of power around the clock — same height at 03:00 and 15:00. Example: a buyer who needs a constant 1 MW backbone, not a solar “hump.” Wind and solar sellers rarely offer this unless they can back it somehow.
TOP (take-or-pay)
In plain words: the buyer pays for an agreed minimum volume whether they use it or not — “take it or pay for it anyway.” Example: a cold-store commits to 500 MWh/month; a quiet production week does not shrink the bill below that floor.
SHAPED
In plain words: the allocation follows a time-of-use (TOU) shape — different amounts in peak, standard, and off-peak windows. Example: more MWh in expensive peak hours, less overnight, matching how the buyer’s tariff or load actually works.
| Contract type | The promise, one sentence | Everyday analogy |
|---|---|---|
AS_GENERATED |
Buyer takes whatever the plant produces — no shape guarantee | “Share of the catch” — you get what the nets bring in |
FIRM |
Seller guarantees a profile and covers shortfalls | A booked delivery slot — if the truck is light, the seller still owes the load |
CAPPED |
As-generated up to a volume / MW ceiling | An all-you-can-eat buffet with a plate limit |
BASELOAD |
A flat block every hour of the day | A standing order for the same loaf every morning and evening |
TOP |
Buyer pays for a minimum whether consumed or not | A gym membership — you pay the month even if you skip weeks |
SHAPED |
A TOU-shaped allocation profile | A meal plan with bigger portions at dinner than at midnight |
Note. Contract type is about the energy shape promise on physical deals. Price structures (fixed c/kWh, market-linked, and so on) are separate terms — taught later in this volume and in settlement.
Same-instrument disagreement at proposal stage is still a structured decline and a re-propose (V7 §3.5d) — not a price counter-offer loop. When the other instrument suits you better and it is available for the pair, you can answer in that instrument instead of refusing.
1.1 When each instrument is available to you
The search map and proposal detail do not guess which instrument is “better.” They only answer whether each instrument is usable at all for the pair:
| Instrument | Available when | Button / note |
|---|---|---|
| Physical | There is a resolvable wheeling path between the two connection points (network classification + applicable wheeling charges) | Offered when the path exists |
| Virtual | Both sides are Eskom-connected and VWA-ready (registration and related readiness checks) | Offered when eligibility passes |
Where the platform cannot confirm that an instrument is usable, it will not put a green light on that button. In plain terms: we only switch a Physical or Virtual option on when we have already checked the facts and can stand behind the answer. If we have not finished those checks — or we know we cannot finish them for this kind of pair — the button stays off, and you will see a short “we can’t confirm this” reason.
Two common cases work that way today:
- Any deal that involves a trader on the virtual side. Virtual registration readiness is something we can verify for generators and off-takers that sit on Eskom. Trader books do not give us the same clear “yes, this party is VWA-ready” signal, so we will not pretend the virtual path is confirmed.
- Trader-to-trader on the physical (wheeling) side. A physical deal needs a resolvable network path between two connection points. When both sides are traders, there is no plant-to-factory path for us to resolve in the usual way, so we will not offer Physical as a confirmed option.
Important distinction: “we can’t confirm” is not the same as “this deal is impossible.” It only means this system will not offer an instrument it cannot vouch for. The commercial idea might still exist offline; what you will not get here is a button that claims the path or the registration is ready when we have not proved it.
On an open proposal, a related courtesy can appear when the other instrument is confirmed for the same pair. You might see one plain line — for example that the pair is also VWA-eligible — with a pointer to where you can look next. That line is only a fact about availability. It does not quote Rand, percentages, or a recommendation about which instrument you ought to choose. Price and “which deal is better for you” belong later, on the Instrument step (§3.4c), not here.
One story. Availability is here (§1.1). Side-by-side money and the choice live on compose Instrument (§3.4c). The same comparison line on review Gaps, and the Decide cross-instrument counter, are §3.5b and §3.5e.
Where this is taught. How each contract type and topology cell settles — losses, charges, adjustments per shape — is V8 · Settlement. This volume gets you to a signed contract.
2. Finding a counterparty
Counterparties are not discovered from the IPP Sites or Off-taker Sites directory rows any more. You find them on the Strategy workbenches — after you already know which book you are shopping for (this plant, this factory, or this trader pool).
Sites and pools themselves are still set up under Entities (V2 §3 · V2 §4 · V2 §5). The search for a deal partner happens one level deeper: open that entity → Strategy → the sell or buy workbench that matches your seat.
| Your seat | Where you look | What you are shopping for | Taught in |
|---|---|---|---|
| IPP (generator site) | Strategy → Sales (Workbench) | Off-takers and traders who can absorb unsold generation | V4 §6 · Sales |
| Off-taker (consumer site) | Strategy → Procurement (the Procurement Desk) | Generators and traders who can displace grid purchase | V3 §13.2 · Procurement |
| Trader (pool) | Strategy → Simulations → Sell or Buy tab | Sell: offtakers / traders for surplus · Buy: IPPs / traders for shortfall | V3 §8 · Simulations |
In every case the pattern is the same: rank candidates by shape fit → simulate terms safely → Build Proposal when the deltas look right. Nothing is sent to the other party until you deliberately promote a draft and later send it (§3).
2.1 Three doors into the market
IPP — Strategy → Sales
Open the generator site → Strategy → Sales. The Sales desk ranks off-taker sites and trader pools under Who could absorb the gap, by shape fit against this plant’s unsold profile — the hours that still earn R 0. You pick a card, check the seeded terms, Simulate Sale, read the seller deltas and the verdict against holding for the market, then Build Proposal when you want a private draft.
Where this is taught. Layout, fit scores, simulate versions, and promote: V4 §6. Dashboard panels that point you here when Unsold is high: V4 §12.
Off-taker — Strategy → Procurement
Open the off-taker site → Strategy → Procurement. The Workbench ranks eligible generators (and traders, where applicable) against the site’s remaining grid band — fit first, bill impact after you Simulate purchase. Build Proposal opens the buyer proposal studio with suggestions filled from that simulation.
Where this is taught. Full buy walk-through: V3 §13.2. How the off-taker Overview feeds the same supply-mix picture: V3 §13.
Trader pool — Strategy → Simulations (Buy / Sell)
Open the trader pool → Strategy → Simulations. This is the portfolio what-if desk for one book:
- Sell tab — “Who can buy my surplus?” Candidates are off-takers and traders, ranked against the book’s spill / unsold lobe.
- Buy tab — “Who can fill my gap?” Candidates are IPP generators and traders, ranked against the shortfall lobe.
Pick a candidate, enter terms (the same commercial forms as Sales / Procurement), Simulate Sale or Simulate Purchase, compare baseline vs variant KPIs, then Build Proposal to promote evidence into a draft (V3 §8.6).
Careful. This Simulations tab is not the org-wide Scenario Lab (V3 §16). Here you only ask: what if this pool signed this one contract?
2.2 Who you can see, and who can deal
Visibility rules are the same whichever door you use:
- Only public, active counterparties appear (and generators must be tradeable — accredited owners). Your own thin, private or inactive entities are equally invisible to others.
- Anyone you already have an open engagement with — a proposal in DRAFT/PENDING/ACCEPTED/DECLINED or an existing contract — is filtered out. One live conversation per pair.
- Which instrument buttons or pools you can use still follows §1.1: Physical needs a resolvable wheeling path; Virtual needs both sides Eskom-connected and VWA-ready. Trader-pool cards also disclose treatments, activities and protections so you know the policy you’d be dealing under.
2.3 From candidate to draft proposal
On Sales, Procurement, and Simulations alike, Build Proposal (after a successful simulation you can stand behind) creates a draft proposal with you as initiator. You land in the matching proposal studio — seller studio from Sales / Sell, buyer studio from Procurement / Buy — with the simulation’s evidence one click from every section (§3.4 · §3.4a).
Nothing has been sent yet. The draft is yours to complete; your counterparty cannot see it until you send.
Follow along (IPP). Seat: IPP 2 (
ipp_2@webill.net). Path: IPP Sites → IPP2 Atlantis Wind → Strategy → Sales → Workbench. You should see Who could absorb the gap ranked by shape fit against the unsold profile. Simulate a buyer, then Build Proposal only if the seller deltas tell one story.
Follow along (Off-taker). Seat: Off-taker C. Path: OffTaker Sites → your site → Strategy → Procurement → Workbench. Wait for the spinner; confirm eligible generators on the left; Simulate purchase, then Build Proposal from the version you prefer (V3 §13.2).
Follow along (Trader). Seat:
trader_1@webill.net. Path: Trader Pools → T1 Renewables Pool → Strategy → Simulations. Use Sell for surplus buyers or Buy for gap fillers (V3 §8).
Data. full_demo · seed 42 · stage S03/S04 · sealed 2026-07-15.
3. Proposals — the handshake
A proposal is one organization’s offered terms to another: non-binding, expiring, and deliberately asymmetric — each party fills in only its own side of the sheet. Accepting one creates the draft contract.
3.1 The lifecycle
A proposal has exactly seven statuses. They are
enum-exact on the record (DRAFT,
PENDING, ACCEPTED, DECLINED,
EXPIRED, WITHDRAWN, SUPERSEDED)
and appear the same way on both parties’ Proposals lists — with two
visibility rules called out below.
Happy path
Accepting leaves Proposals and opens Negotiations for both parties (§4). The status on the proposal row stays ACCEPTED; the live work moves to the linked PPA.
Branches from PENDING
DECLINED — receiver rejects (optional reason /
findings). EXPIRED — hourly job flips overdue PENDING
past expires_at (§3.2).
WITHDRAWN — sender pulls the offer.
SUPERSEDED — a newer proposal (re-propose or
other-instrument counter) replaces this one — see §3.5d and §3.5e.
Return paths
Renew and reactivate keep the same proposal row and pick a fresh validity window. Re-propose clones into a new DRAFT and marks the old row SUPERSEDED so the lineage stays linked.
What each status means
| Status | Plain meaning | Who typically causes it | What you see |
|---|---|---|---|
| DRAFT | You are still composing. Not a sent offer. | Initiator (Build Proposal / studio / re-propose) | Initiator only — counterparty cannot see the row |
| PENDING | Offer is live; clock is running. | Initiator Send (or renew / reactivate) | Both parties — Sent vs Received |
| ACCEPTED | Receiver accepted; draft PPA created and linked. | Counterparty Accept | Both parties; row leaves the open Proposals focus for Negotiations |
| DECLINED | Receiver rejected the offer. | Counterparty Decline | Both parties (originator list updates live) |
| EXPIRED | Validity window ended with no accept/decline/withdraw. | System (hourly) or explicit expire | Both parties |
| WITHDRAWN | Initiator cancelled before accept. | Initiator Withdraw (from DRAFT or PENDING) | Initiator always. Counterparty only if it had been sent (see visibility) |
| SUPERSEDED | Replaced by a newer proposal in the same conversation thread. | Re-propose or other-instrument counter | Both parties; lineage banner links prior ↔︎ successor |
The distinction readers get wrong. A
DRAFTis invisible to the other side. Build Proposal opens a compose studio with suggestions filled in as suggestions, not as a sent offer — off-taker Procurement → buyer studio, IPP Sales → seller studio, or trader-pool Simulations → Buy studio / Sell studio. Nothing reaches the counterparty until you deliberately Send (to seller or to buyer, depending on seat). Until then they cannot see the row, the terms, or your negotiating brief.
Visibility rules
| Situation | Initiator sees | Counterparty sees |
|---|---|---|
| Unsent DRAFT | Yes | No |
| DRAFT withdrawn before send | Yes (WITHDRAWN) |
No — they never knew it existed |
| PENDING (sent) | Yes | Yes |
| Sent offer then WITHDRAWN | Yes (WITHDRAWN) |
Yes (WITHDRAWN) — same status both sides |
| DECLINED / EXPIRED / SUPERSEDED / ACCEPTED | Yes | Yes |
Sending stamps the start of the validity window. That stamp is what lets a later WITHDRAWN stay on the counterparty list — so a pull-back after send reads as withdrawn on their side, not as a silent disappearance.
Action gates — who may change status
Each action is refused unless the proposal is in an allowed status and the acting organisation is on the right seat (initiator vs counterparty). The UI hides or disables the button when the gate fails; the server enforces the same rules.
| Action | From status(es) | To status | Who | What it does |
|---|---|---|---|---|
| Create / Build Proposal | — | DRAFT | Initiator | Opens compose (studio or list). Suggestions are not a sent offer. |
| Send | DRAFT | PENDING | Initiator | Makes the offer visible; starts the validity window; readiness checklist must pass. |
| Accept | PENDING | ACCEPTED | Counterparty | Creates/links a negotiating PPA from agreed terms; both sides move toward Negotiations. |
| Decline | PENDING | DECLINED | Counterparty | Rejects the offer; optional reason / structured findings. Originator sees DECLINED too. |
| Withdraw | DRAFT or PENDING | WITHDRAWN | Initiator | Cancels without accept. Unsent drafts stay private; sent offers show WITHDRAWN to both. |
| Reactivate | WITHDRAWN | PENDING | Initiator | Re-sends the same proposal with a fresh expiry window. |
| Renew | PENDING or EXPIRED | PENDING | Initiator | Extends / restarts the clock. Limited (default 3 renewals) — see §3.2. |
| Expire | PENDING (past expires_at) |
EXPIRED | System (hourly) | Auto-flip. Receiver working notes (review drafts) are discarded on expire. |
| Re-propose | DECLINED or EXPIRED | new DRAFT (source → SUPERSEDED) | Either party | Clones terms into a fresh draft; keeps lineage via
superseded_proposal_id. |
| Supersede (counter / replace) | PENDING (and some closed states, per path) | SUPERSEDED | Party running re-propose or other-instrument counter | Marks the prior row replaced; successor is the live offer (§3.5e). |
Not status actions (same record, same status).
Editing terms on a DRAFT or PENDING, accepting suggestions in a studio,
and staging a private review draft while you are the receiver do
not change status — they change terms or private notes
only. Switching Physical ↔︎ Virtual on a DRAFT withdraws
the old draft and creates a new DRAFT (instrument
switch), rather than editing proposal_type in place.
Terminal vs recoverable. ACCEPTED is the commercial hand-off (work continues on the PPA). SUPERSEDED stays as history. DECLINED, EXPIRED, and WITHDRAWN are closed for that row but recoverable via re-propose, renew, or reactivate as gated above.
3.2 How long a proposal stands
The sender chooses how long their offer stands when
they send (and again when they renew or reactivate). The dispatch footer
shows a resolved summary — “Valid until 12 Aug 2026 — 14 days”
— not a bare date picker. The prefilled default is 14
days; the allowed window is 3–90 days. Once
expires_at passes, the hourly background trigger (V1
§6) flips overdue PENDING proposals to EXPIRED. The initiator may
renew an expired (or still-pending) proposal up to
3 times — the modal shows “Renewals: N of 3
used” — and reactivate a withdrawn one, each time
picking a fresh window.
The deadline is promoted into the modal header pill row so the receiver sees how long they have before they dig into the terms. Inside the last 20% of that window you get a near-expiry warning — on a 14-day offer that is roughly the final three days — so you can ask the sender to renew before your working notes are discarded (§3.5a).
Careful. If the other side edits their terms after you have reviewed them, acceptance is blocked until you re-read the updated fields — you can’t be signed up to a price you never saw. The modal names what changed and both values; acknowledge, re-read, then accept.
3.3 The list
Proposals (/org/deals/proposals — the
first Deals tab, in lifecycle order) shows every open
conversation — accepted proposals move on to Negotiations. There are no
stat cards: one line above the table says what the tab is for, and a
New proposal button opens the studio for your seat (the
Desk for a trader, Procurement for an off-taker, Sales for an IPP). The
badge on the tab counts received offers waiting for your
decision — a sent offer waits on the counterparty, so it is not
on your badge. Columns:
| Column | What it shows |
|---|---|
| Proposal | the reference (PROP-…), the Physical
(green) or Virtual (blue) pill, Sent
or Received, and your message |
| Parties | the deal-type role pair (e.g. Offtaker → IPP) with your side highlighted, and the counterparty’s name |
| Status | Draft · Pending · Declined · Expired · Withdrawn · Superseded (a Draft says only you can see it) |
| Expires | date; for Pending a colour-coded countdown (expires in 3 days → amber, minutes → red), plus renewed Nx |
| Open | the one way in — the row and its Open button both open the proposal; accept, decline, withdraw and renew live inside it |
As the initiator you always see your own Drafts and Withdrawns. Your counterparty never sees an unsent Draft, and never sees a Withdrawal of an offer that was never sent — but a sent offer that you withdraw stays on their list as Withdrawn (§3.1 visibility). Declines and expiries show on both sides. The list is live — when the other side accepts, declines, or you withdraw a sent offer, both parties’ lists refresh without a manual reload.
3.4 Compose in the buyer proposal studio
When you Build Proposal from a physical Procurement simulation, you open a full-page proposal studio — not the list modal: a checklist of sections on the left and one section at a time on the right. Evidence swaps the section for the simulation behind the draft, and Explanations opens field notes and suggestions in a drawer. This is the home for physical buyer composition on an off-taker site. A virtual simulation opens the four-stage virtual studio instead (§3.4b).
Buying for a trader pool is the same kind of studio — evidence one click from each section, public asks vs private limits, readiness-gated Send to seller — but the seat, deal type, and a few stages differ. That path is §3.4e · Trader Buy Proposal Studio; do not use this offtaker chapter as the walkthrough when you promoted from Simulations.
Stages (reading order).
| # | Stage | What you decide |
|---|---|---|
| 0 | Instrument | Physical or virtual — and why (§3.4c) |
| 1 | Evidence | Supply mix, fit chart, impact, candidate — same charts as the workbench |
| 2 | Shape | Contract type + TOU split (when SHAPED) |
| 3 | Price protection | Cap, ceiling, break-even ladder |
| 4 | Risk | Curtailment, spill, shortfall (fields prune by contract type) |
| 5 | Green | Scope 2 method |
| 6 | Public asks | Capacity, term, escalation — sent with the proposal |
| 7 | Private limits | Walk-aways on your brief — never sent |
| 8 | Review & send | What the seller receives, readiness checklist, expiry, Send to seller |
Suggestions. Many fields arrive with a suggested
value, a one-line rationale, and Accept / Adjust /
Why?. Accepting records that you took the suggestion
(source: derived); Adjusting records your override while
keeping the original suggestion for the audit trail. Either way it is a
decision you are recorded as making — not a silent autofill.
Asks vs limits. Stage 6’s public asks become part of what the seller sees. Stage 7’s walk-aways stay on your private brief; stage 8’s What the seller receives lists only public terms — search it for a walk-away and you will not find one.
Where decisions land. Stages 2–5 write into the
draft’s physical_terms (autosave on every change). Stage 6
writes requested_joint_terms (public asks). Stage 7 writes
only your negotiating
brief. Stage 0 sets proposal_type (Physical vs
Virtual). Nothing reaches the counterparty until stage 8’s Send
to seller.
Quick questions. If the simulation could not decide
a site preference or a low-confidence term, a sky panel (A few
quick questions) appears above the stages. Those buttons
are decisions — e.g. spill treatment is saved on the
off-taker site once; shortfall / curtailment answers write into
physical_terms (and stamp the brief). They are not
decorative.
The rest of this section walks each stage field by field. Term meanings in settlement language stay in §4.7; here the focus is what you set in the studio and what the draft carries.
Stage 0 — Instrument
Job. Choose Physical PPA or Eskom Virtual PPA before you fill shape and price. Deep comparison rules and materiality live in §3.4c.
| Control / panel | What it means | In the draft |
|---|---|---|
| Own verdict (Physical / Virtual) | What this deal is worth to you each way, on a stated volume basis | Informs your choice; numbers stay on the brief’s instrument-comparison evidence |
| Counterparty estimate | What we think it is worth to them from disclosed terms only | Same evidence fragment — never treated as their private walk-away |
| Differences | Matching risk, delivery risk, time-to-first-flow — not folded into Rand | Listed for you; not separate proposal fields |
| Choose Physical / Virtual | Sets the instrument for this draft | proposal_type — switching creates a
new draft and withdraws the old one |
Example. Both instruments available; physical saves you more Rand/yr on the stated MWh, but virtual is faster to first flow. You stay on Physical because the factory needs wheeled displacement this year — stage 0 records Physical; stages 2–5 then show physical fields only.
If only one instrument is possible for the pair, the stage collapses to one line (same wording as the search modal) and you continue.
Stage 1 — Evidence
Job. Confirm you are pricing the deal you simulated — no editable commercial fields here.
| Panel (left / shared) | What it shows | In the draft |
|---|---|---|
| Supply mix | Your book’s Grid / Wheeled / Virtual stack (24h) — the band sellers were ranked against | Snapshot from the promoting simulation / book; not re-typed into terms |
| Fit chart | How the candidate’s shape overlays your residual grid need | Fit score and charts stay as composition evidence |
| Impact | Simulated deltas (saving, green coverage, over-contract, …) | Same simulation results that justified Build Proposal |
| Candidate card | Generator (or trader) identity, connection, capacity, prefs | Parties already on the proposal (seller_generator /
trader) |
Example. Impact shows +R 1.2m/yr saving and green coverage up 8 pp with little over-contract → you proceed to Shape. If impact looks wrong, go back to Procurement and re-simulate; do not invent terms on a bad sim.
Stage 2 — Shape
Job. Pick the delivery profile. That choice gates which Risk fields appear later.
| Field | What it represents | Example | In the draft |
|---|---|---|---|
| Contract type (Buyer) | Delivery shape the seller must support: as-generated, capped, take-or-pay, firm, baseload, shaped, … | Cold store that can follow solar → prefer AS_GENERATED or CAPPED; 24/7 process needing a block → FIRM / BASELOAD | physical_terms.contract_type — seller later collapses
their price card to this row |
TOU allocation (Buyer; only if
SHAPED) |
Peak / standard / off-peak % of contracted energy — must sum to 100% | 40% peak / 35% standard / 25% off-peak for a day-shift factory | physical_terms.tou_allocation — settlement allocates
shaped energy by these shares |
Visibility. TOU controls appear only for
SHAPED. Other types hide them.
How this shows later. Stage 8’s seller-eye preview lists the contract type. On accept, the negotiating PPA inherits the shape; wrong shape vs plant support surfaces as infeasibility when the seller confirms.
Stage 3 — Price protection
Job. Set how high you will pay — public protection on the offer, not your private walk-away (that is stage 7).
| Field | What it represents | Example | In the draft |
|---|---|---|---|
| Cap price (c/kWh, Buyer) | Maximum energy price you will pay under capped / floor-cap style structures | Grid all-in ~140 c/kWh after wheeling → cap 128 c/kWh (leave headroom) | physical_terms.cap_price_ckwh — sent;
seller sees it |
| Price ceiling (c/kWh, Buyer) | Absolute upper bound on the energy charge in a two-part tariff (energy + capacity charge) | Two-part quote: energy 90 c/kWh + capacity charge; ceiling 110 c/kWh so the blend cannot runaway | physical_terms.price_ceiling_ckwh —
sent |
Suggestions. Cap often arrives from break-even vs
your site’s grid rate less wheeling, with a cushion (V3
§13.2.1). Accept stamps the brief
source: derived; Adjust keeps the
suggestion for audit and writes your number.
Draft vs brief. The numbers on this stage are asks on the proposal. Your walk-away (e.g. “I leave above 135”) belongs on stage 7. If you set the public cap equal to the walk-away, a disclosure warning fires — you are about to show your floor.
Stage 4 — Risk
Job. Who absorbs curtailment, spill / under-consumption, and delivery shortfall. Embeds prune by contract type:
| Contract type | Spill & excess | Shortfall & delivery |
|---|---|---|
AS_GENERATED |
Hidden | Hidden |
CAPPED |
Shown | Hidden |
TOP |
Hidden | Shown |
| Firm / baseload / shaped (etc.) | Shown when applicable | Shown when applicable |
Buyer-owned controls (sky Buyer chip) are the ones you must decide; joint fields may also be editable in compose. Seller-owned subfields stay visible for context but are not your pencil.
Curtailment
(physical_terms.curtailment_terms)
| Field (buyer focus) | What it represents | Example | In the draft |
|---|---|---|---|
| Buyer-caused remedy | When you curtail take-off, how the seller is made whole | Rare shutdowns → DEEMED (you still pay); frequent planned outages → MAKEUP | curtailment_terms.buyer_caused —
sent |
| Grid-operator / seller-caused (context) | Who bears grid or seller curtailment | Often left as suggested joint defaults until negotiation | Written if you edit a joint-editable control; otherwise seller’s sheet |
Spill & excess
(physical_terms.spill_excess_terms — when visible)
| Field (buyer focus) | What it represents | Example | In the draft |
|---|---|---|---|
| Under-consumption treatment | What you owe when you use less wheeled energy than committed | Flexible load → NO_PENALTY; must defend ToP → TOP_APPLIES | spill_excess_terms.under_consumption_treatment —
sent |
| Spill treatment / banking / excess disposal (context) | How surplus energy is handled | Often aligned with your site spill preference (Q&A or wizard) | Site preference may already be on the off-taker; proposal embed carries deal-level spill rules you edit |
Shortfall & delivery
(physical_terms.shortfall_terms — when visible)
| Field (buyer focus) | What it represents | Example | In the draft |
|---|---|---|---|
| Compensation method | How you are made whole if the seller under-delivers | Prefer cash → LIQUIDATED_DAMAGES; need electrons → REPLACEMENT_ENERGY; shrink the deal → CAPACITY_REDUCTION | shortfall_terms.compensation_method —
sent |
| Reporting | How often / on what basis the seller reports performance | Monthly self-report vs metered attestation | shortfall_terms.reporting |
| Excuse buyer curtailment | Whether your curtailment is excused from shortfall maths | Usually yes if buyer-caused has its own remedy | shortfall_terms.excuse_buyer_curtailment |
| Warranty / deadband / penalty caps (context) | Seller performance envelope | Seller fills many of these; you read them in review | Seller-coded subfields |
Example. You chose CAPPED on stage 2 → shortfall block hidden, spill block shown. You set under-consumption to NO_PENALTY and buyer-caused curtailment to DEEMED. Draft carries those two; firmness warranties stay out of scope for this shape.
Stage 5 — Green
Job. How you account for renewable attributes.
| Field | What it represents | Example | In the draft |
|---|---|---|---|
| Scope 2 method (Buyer) | GHG accounting for purchased electricity — market-based (contractual instruments / RECs) vs location-based (grid average) | Corporate RE100 programme → MARKET; no certificates path → LOCATION | physical_terms.rec_terms.scope2_method —
sent |
| Registry / bundling (context) | Which REC registry and whether certificates travel with energy | Seller usually owns registry; you confirm Scope 2 fits your audit | rec_terms.* as edited |
Green coverage on the evidence column is the strategy KPI; this stage is the contractual accounting choice that settlement and reporting will use.
Stage 6 — Public asks
Job. Size and commercial envelope the seller
will see. These are joint asks on
requested_joint_terms, not private limits.
| Field | What it represents | Example | In the draft |
|---|---|---|---|
| Capacity (MW) | Indicative contracted capacity you want | Simulate used 5 MW → ask 5 (or 3 if you are sizing down) | requested_joint_terms.capacity_mw |
| Allocated energy (MWh/yr) | Annual energy shape target (baseload / shaped deals) | 12 000 MWh/yr for the Midrand DC | allocated_energy_mwh_yr |
| Term (years) | How long you want the PPA to run | 10 years to match board approval | term_years |
| Start date | When delivery / settlement should begin | First day of next FY | start_date |
| Escalation mechanism | How price grows (CPI, fixed %, none, …) | CPI with a board-approved band | escalation_mechanism |
| Escalation rate (%) | Numeric rate when the mechanism needs one | 1.5 for CPI-minus style deals | escalation_rate_pct |
| Settlement frequency | How often a settlement period closes | Monthly vs daily | settlement_frequency |
| Take-or-pay minimum (MWh/yr) | The least energy a year you would pay for whether or not you take it | Only if you intend take-or-pay discipline | top_min_volume_mwh_yr |
| Capped volume limit (MWh/yr) | Annual ceiling for capped shapes | Align with a capped contract type | capped_volume_limit_mwh_yr |
Example. Ask 5 MW · 10 years · CPI · start 2027-01-01. Stage 8 preview shows capacity and term; the seller responds against those public numbers. Your walk-away capacity (e.g. leave below 3 MW) stays on stage 7.
Stage 7 — Private limits
Job. Record what you will not cross. Never sent. Banner on the stage says so; stage 8’s seller-eye preview omits every row here.
| Control | What it represents | Example | In the draft |
|---|---|---|---|
| Walk-away | Hard line — you walk if the deal crosses it | Cap walk-away 135 c/kWh; capacity walk-away 3 MW | Brief position walk_away for that field key |
| Min / max acceptable | Soft band around your target for your own coaching | Target cap 128; min 120; max 132 | Brief min_acceptable / max_acceptable |
| Target (read-out) | Preferred outcome from advice / Accept | 128 c/kWh | Brief target / accepted suggestion |
Typical keys: cap_price_ckwh,
price_ceiling_ckwh, contracted_capacity_mw.
Setting a public stage-3 cap equal to the walk-away
triggers the disclosure warning (COUNTER / OFFTAKER §5).
Stage 8 — Review & send
Job. See every term the seller will receive, clear readiness, choose how long the offer stands, then Send to seller.
| Panel / control | What it represents | In the draft / on send |
|---|---|---|
| What the seller receives | Every term you set, in the checklist’s order — Delivery profile, Price protection, Risk, Green, then Volume, term and settlement (the shared asks) — each group with Edit back to its section | Built from the same fields the sections edit, so it cannot drift from stages 2–6; walk-aways absent by design |
| Readiness — missing / incoherent | Hard blockers (required buyer fields for this contract type, TOU sum, …) | Send stays disabled until clear |
| Readiness — ack required | Warnings you may own (knowingly thin patterns, etc.) — see §3.4.1 | Checkbox unlocks Send |
| Expiry | How long the PENDING offer stands (default 14 days; 3–90) | expires_at on send; shown as “Valid until … — N
days” |
| Send to seller | Dispatch | Status DRAFT → PENDING; seller can open review |
How the list reads. Only the terms you set appear — the buyer-set and jointly negotiated ones. Terms the seller sets (their availability guarantee, spill disposal, seller-caused curtailment) are theirs to fill when they respond, so they are not listed as yours. A term you have not set reads Not set; a section you left wholly blank, such as untouched termination terms, reads as one Not set line; and an optional device you have not switched on (Upside sharing device, Volume strike device) shows only that it is off.
Example. What the seller receives shows As generated · cap 128 c/kWh · 5 MW · 10 years · CPI. Readiness green → expiry 14 days → Send. Your 135 c/kWh walk-away never appears.
Follow along (fields). Seat: Off-taker C. Path: Procurement → simulate → Build Proposal. Walk stages 2–8: set contract type, accept or adjust cap, answer any quick questions, enter public asks, set one walk-away on Limits, confirm it is absent from What the seller receives on stage 8, then leave the draft unsent (or send in a sandbox).
3.4a Compose in the seller proposal studio
When you Build Proposal from a physical Sales simulation, you open the Sales proposal studio: a checklist of ten sections on the left and one section at a time on the right, organised around the price card. Evidence swaps the section for the simulation behind the draft, and Explanations opens field notes and suggestions in a drawer. This is the home for physical seller composition on a generator site. A virtual Sales simulation opens the four-stage seller virtual studio instead (§3.4d) — same stage spine as the buyer virtual compose (§3.4b), but organised around the strike ladder, not a per-contract-type price card. On the physical path the buyer has not chosen a shape yet, so you quote one price per supported contract type. Every priced row is visible to the buyer; your floors stay on the private brief.
Selling from a trader pool is the same kind of studio — price card, warranty / spill / green, public asks vs private floors, readiness-gated Send to buyer — but the seat, deal type, and a few stages differ. That path is §3.4f · Trader Sell Proposal Studio; do not use this IPP chapter as the walkthrough when you promoted from Simulations.
The header. The studio’s one title is Sales proposal, with the parties under it (IPP 1 (Seller) → SIM Canal Walk Load · from IPP1 Sandton Solar) and the draft reference once, on the line below. That line also says how drafts behave: edits save as you make them, nothing reaches the counterparty until you send, and you can resume from Commercial → Open proposals. Keep draft & exit takes you back to Commercial with the draft kept; it refuses while an edit has a save error. Discard draft sits beside it and asks before it deletes the draft.
Stages (reading order).
| # | Stage | What you decide |
|---|---|---|
| 0 | Instrument | Physical or virtual — and why (§3.4c) |
| 1 | Evidence | Unsold profile, fit, impact, buyer candidate (incl. their declared prefs) — and whether it still describes this draft |
| 2 | Price card | Tariff structure (type + TOU multipliers when linked), then one price per shape; floors private |
| 3 | Warranty | Availability, deadband, degradation, penalty caps (worst-case Rand vs margin); a blank warranty is confirmed at send |
| 4 | Spill | Plant-level spill & curtailment — spot-market disposal only with a BRP |
| 5 | Green | Forecast, nomination, renewable certificates and carbon |
| 6 | Shared terms | Capacity, volumes, term, escalation — sent with the proposal and checked against the deal |
| 7 | Private limits | Floors and caps on your brief — never sent |
| 8 | Q&A | Site preferences the proposal still needs, only if the site record lacks them |
| 9 | Review & send | What the buyer receives, readiness, expiry (quote window), Send to buyer |
Suggestions. Warranty and related fields arrive with
a suggested value, rationale, and Accept / Adjust /
Why? — same affordance as the buyer studio. Accepting stamps
the brief (source: derived) and writes the value into the
draft; Adjusting records your override while keeping the original
suggestion for audit. Suggested values read as the field’s own options
(Two-part, Banked, Spot market), and
Why? explains in words, not formula codes.
Explanations beside the section. On a screen 1280 px or wider the page makes room for the drawer, so you keep editing while it is open; the checklist becomes an icon rail with the same section statuses (a dot marks a section with something to resolve), and on 1536 px or wider the full checklist stays. Opening it moves keyboard focus into the drawer, and closing it (the X, or Escape) puts focus back on Explanations. Below 1280 px the drawer opens over a backdrop instead.
What the buyer sees of your card. All priced rows. Not your floors. Stage 9’s What the buyer receives never includes walk-aways.
Where decisions land. Stage 2 writes
physical_terms.tariff_type (and TOU multipliers when the
tariff is TOU-linked) plus the public seller_price_card
(prices only — floors stay on the brief). Stages 3–5 write the remaining
seller-owned slices of physical_terms (autosave). Stage 6
writes requested_joint_terms. Stage 7 writes only your negotiating brief. Stage 0
sets proposal_type. Nothing reaches the buyer until stage
9’s Send to buyer.
Changes save as you go — and Undo
Every field saves the moment you change it; there is no Save button. After each change a notice holds at the bottom of the section while it scrolls, naming what changed — Saved. Tariff type set to Fixed. — with Undo. Undo puts back that one change: a term, a card price, a shared term, a private limit (back to blank if it was blank), or a suggestion you accepted or adjusted (its value and the brief’s accepted mark). The notice then reads Undone: … until your next change. Answers to site questions (stage 8) are saved to the site and are not undone here.
Second pass. After you send, when the buyer picks a
contract_type on the PENDING proposal, the studio re-opens
collapsed to that row: its price is written to
energy_price_ckwh, and you confirm the now-unambiguous
shape-gated fields. If they chose a shape the plant does not support,
the studio surfaces the infeasibility and lets you decline with a
reason.
Price-card mechanics (LCOE floor, premiums, firmness) stay taught in V4 §6; the proposal flow and each field live here. Term meanings in settlement language stay in §4.7.
Stage 0 — Instrument
Job. Choose Physical PPA or Eskom Virtual PPA before you fill the price card. Same comparison surface as the buyer studio — deep rules in §3.4c.
| Control / panel | What it means | In the draft |
|---|---|---|
| Own verdict (Physical / Virtual) | What this sale is worth to you each way, on a stated volume basis | Instrument-comparison evidence on your brief |
| Counterparty estimate | What we think it is worth to the buyer from disclosed terms only | Same evidence — not their private walk-away |
| Differences | Matching risk, delivery risk, time-to-first-flow | Listed; not separate proposal fields |
| Choose Physical / Virtual | Sets the instrument for this draft | proposal_type — switching creates a
new draft and withdraws the old one |
Example. Physical earns more margin on the stated MWh, but the buyer’s site cannot take wheeled energy this year. You choose Virtual — stage 0 records it; the rest of the studio becomes the four-stage seller virtual compose (§3.4d).
Stage 1 — Evidence
Job. Confirm you are quoting the deal you simulated — no editable commercial fields here.
| Panel | What it shows | In the draft |
|---|---|---|
| Unsold profile (24h) | Your remaining sellable shape after existing book commitments | Composition evidence from the promoting simulation |
| Fit chart | How the buyer’s residual need overlays your unsold band | Fit score / charts stay as evidence |
| Impact | Simulated deltas (margin, unsold %, revenue concentration, …) | Same results that justified Build Proposal |
| Buyer candidate | Off-taker identity plus declared prefs — tariff preference, spill treatment, curtail acceptance, REC flag, term, requested MWh, shortfall remedy | Parties already on the proposal; prefs inform your quote, not silent autofill |
Example. Impact shows solid margin and a small unsold increase; the buyer card shows a Fixed tariff preference and Banking spill — you carry that into the price card and spill stage rather than inventing preferences.
Both charts use one colour per meaning: your unsold generation is sky blue in the unsold profile and in the fit chart, contracted energy is green, and the buyer’s load is slate. Realised is in c/kWh, like the card.
When the evidence describes another deal
The evidence comes from the simulation you built the draft from. Once the draft’s capacity, its as-generated price or its term moves away from that run, an amber panel says so, with both deals side by side: It comes from the 28 September 2026 simulation of 50 MW · 60 c/kWh · 10 years. This proposal asks 12.5 MW · 67–75.1 c/kWh · 10 years. Revenue, unsold energy and the warranty margin then describe the simulated deal, not yours.
Re-run for these terms simulates the deal again with the draft’s own capacity, as-generated price and term, for the same buyer and period, and points the draft’s evidence at the new run. The panel clears when it finishes. Your brief — suggestions, accepted values and private limits — is not rebuilt. The new run is linked to the draft like the first one, so the Sales desk shows both as drafted, and discarding the draft frees both.
Stage 2 — Price card
Job. First set Tariff structure
(how the energy charge is built), then publish one energy price
per supported contract type. This is the commercial heart of a
seller-originated draft: the buyer has not picked a shape yet, so a
single energy_price_ckwh would be premature.
Tariff structure (panel above the rows)
The studio shows a Tariff structure block above the price card. Tariff type is required for Review readiness — Accept the brief suggestion or pick your own. When the type is TOU-linked, TOU multipliers appear in the same block. The buyer’s stated preference sits under the heading (The buyer asked for a fixed tariff.).
| Control | What it represents | Example | In the draft |
|---|---|---|---|
| Tariff type | Pricing structure for the energy charge (fixed, escalated, two-part, floor and cap, TOU-linked, …) — with Accept / Adjust / Why? | Suggested Fixed; Accept stamps the brief | physical_terms.tariff_type — sent |
| TOU multipliers (when the tariff is TOU-linked) | Peak / standard / off-peak multipliers on the base price | Peak 1.4×, standard 1.0×, off-peak 0.7× | physical_terms.tou_multipliers —
sent |
| Offer {the buyer’s ask} (when the suggestion differs from it) | Sets the tariff type to what the buyer asked for, in one click | Offer Fixed | physical_terms.tariff_type — undoable |
When the suggestion differs from the buyer’s ask. The advisor suggests the structure that suits the plant; a solar plant under a 35 % capacity factor, for example, gets Two-part (a monthly capacity charge plus a lower energy price). When the buyer asked for something else, an amber note says so and why — The suggestion (Two-part) differs from the buyer’s ask (Fixed). At a 27% capacity factor the plant’s fixed costs are spread over relatively few MWh … offering a two-part tariff means negotiating against their stated preference. — with Offer Fixed beside it. In Explanations the same suggestion shows Low confidence and Alternatives: Fixed (the buyer’s ask). Either choice is yours; the note clears once the draft carries the buyer’s ask.
Price rows
| Control | What it represents | Example | In the draft |
|---|---|---|---|
| Row — contract type | A shape your plant supports (As generated, Capped, Take-or-pay, Firm, …) | Solar plant: As generated / Capped / Take-or-pay | Row identity on seller_price_card |
| Row — price (c/kWh) | Public offer for that shape — sent to the buyer | AS_GENERATED 88 c; CAPPED 94 c (premium for the cap) | seller_price_card[].energy_price_ckwh |
| Row — floor (read-out) | Your private cost floor for that shape (LCOE + margin) | Floor 76 c — shown to you only | Brief price_card.<TYPE> walk-away / floor —
not on the public card |
| LCOE line | Plant cost context under the rows | ~70 c/kWh LCOE band | Evidence / validation — not a proposal term |
| Per-row spill fields (when the shape needs them) | Shape-gated spill treatment / excess disposal for that row | CAPPED row: spill FORFEITED, disposal BUYBACK | Staged with the card; confirmed on second pass into
physical_terms |
| Per-row shortfall fields (when the shape needs them) | Shape-gated availability / penalty for that row | TOP row: availability 92%, annual penalty cap 15% | Same — shape-gated until the buyer chooses |
Visibility by shape (same gates as physical risk terms).
| Contract type | Spill on the row | Shortfall on the row |
|---|---|---|
AS_GENERATED |
Hidden | Hidden |
CAPPED |
Shown | Hidden |
TOP |
Hidden | Shown |
| Firm / baseload / shaped | When applicable | When applicable |
Rules. A price below that row’s floor is rejected. The amber banner reminds you: Visible to the buyer — every priced row is sent; floors stay private. Prices show as numbers without storage zeros (67, not 67.0000), and each row’s Price basis in Explanations says how it was built — the floor under it, its premium over the cheapest row, and the shortfall chance the premiums are scaled from.
Example. You choose Fixed under
Tariff structure, then price As generated at 88 c (above a 76 c floor)
and Capped at 94 c. The buyer later picks Capped → second pass writes
94 into energy_price_ckwh and unlocks the
capped row’s spill fields for confirmation.
Stage 3 — Warranty
Job. Set the seller performance envelope — how much availability you guarantee and what you pay if you miss. Many rows arrive with Accept / Adjust / Why? from the brief.
| Field | What it represents | Example | In the draft |
|---|---|---|---|
| Guaranteed availability (%) | Minimum plant availability you warrant | 92% for a well-maintained solar plant | physical_terms.shortfall_terms.guaranteed_availability_pct
— sent |
| Deadband (%) | Tolerance below the guarantee before penalties apply | 5% deadband → penalties start below 87% if guarantee is 92% | shortfall_terms.deadband_pct |
| Annual degradation (%) | Expected year-on-year yield loss | 0.5%/yr for crystalline PV | shortfall_terms.annual_degradation_pct |
| Excuse scheduled maintenance | Whether planned outages are excused from shortfall | Usually yes if you also set a maintenance allowance | shortfall_terms.excuse_scheduled_maintenance |
| Excuse extreme weather | Whether extreme resource events are excused | Often yes for wind/solar resource risk | shortfall_terms.excuse_extreme_weather |
| Maintenance allowance (days) | Planned outage days excluded from shortfall | 15 days/yr | shortfall_terms.maintenance_allowance_days |
| Annual penalty cap (%) | Ceiling on shortfall penalties in a year, as a share of contract value | 12.5% — studio shows worst-case Rand vs modelled margin | shortfall_terms.annual_penalty_cap_pct —
sent |
| Lifetime penalty cap (%) | Ceiling across the whole term | 50% lifetime | shortfall_terms.lifetime_penalty_cap_pct |
| Cure period (months) | Grace to remedy persistent shortfall before harder remedies | 6 months | shortfall_terms.cure_period_months |
Worst-case exposure. A line above the fields prices your annual cap against the modelled margin: At 1.5%/yr your worst case is R 2,971,283 a year against a modelled margin of R 3,573,548. The contract value behind it is this proposal’s own — its allocated energy, term and as-generated price (67 c/kWh × 29,565 MWh × 10 years = R 198,085,500; 1.5 % of that is R 2,971,283). The line turns amber when half or more of the margin is at risk, as here (83 %), and a rose alert replaces it when the worst case passes the margin — you can still save, but you are quoting a guarantee you may not economically honour. While the cap is blank the line asks you to set one. When the evidence describes another deal (§3.4a), the line names that run and offers Re-run for these terms.
A blank warranty is confirmed, not defaulted. With no guaranteed availability, an amber note says the buyer has no remedy if the plant under-delivers. You can still send, but Review & send lists No availability warranty as a warning to acknowledge, and the send itself refuses without that acknowledgement. A guarantee with no annual penalty cap is the same: Shortfall penalties are uncapped.
The availability guarantee device. Below the shortfall fields, the optional Availability guarantee device shows only Include this device until you switch it on; off, the shortfall terms above are your warranty. On, it adds its own availability level, measurement and liquidated damages (a pre-agreed payment per point of availability below the guarantee): basis, rate and cap.
Example. Accept availability 92% and adjust annual penalty cap to 10% after the warning. Draft carries both; stage 9 shows them to the buyer.
Stage 4 — Spill
Job. What happens to energy the plant produces that the buyer does not take, and how seller-caused curtailment is remedied. Plant-level (not per-shape) once you are past the price card.
| Field (seller focus) | What it represents | Example | In the draft |
|---|---|---|---|
| Spill treatment | How unpaid / unused generation is valued | Forfeited (zero), Discounted credit, or Banked | physical_terms.spill_excess_terms.spill_treatment —
sent |
| Excess disposal method | Where surplus energy goes | Retained, Curtailed, Counted toward take-or-pay; Spot market only if the book has a BRP registration | spill_excess_terms.excess_disposal_method |
| Eskom buy-back status (context) | Whether buy-back is actually available at the POC | Shown from the site / network record | Informs which disposal options are honest |
| Seller-caused curtailment | How the buyer is made whole when you curtail | Credit, Replacement, or Capacity reduction | curtailment_terms.seller_caused —
sent |
| Deemed energy method | How curtailed volumes are quantified when deemed | Resource power curve default; Independent engineer on large deals | curtailment_terms.deemed_energy_method |
BRP gate. Without a BRP on the strategy book, Spot market is removed from the disposal select and rejected server-side (Spot-market disposal needs a BRP registration on this book).
Example. No BRP → you choose buy-back disposal and Credit for seller-caused curtailment. Draft carries those; the buyer never sees a spot option you cannot deliver.
Stage 5 — Green
Job. Forecasting posture and renewable / carbon attributes you will support.
| Field | What it represents | Example | In the draft |
|---|---|---|---|
| Forecast status | Where the three-year wheeled-energy forecast stands | Submitted, Pending or Not required | physical_terms.forecast_status —
sent |
| Nomination type | How delivery is nominated (single vs multi-buyer) | Single for one off-taker | physical_terms.nomination_type —
sent |
| REC registry (seller) | Where certificates are issued / tracked | ZA-RECS or I-REC | physical_terms.rec_terms.registry |
| Scope 2 method (buyer-owned on the sheet) | How the buyer accounts for green attributes | Often left for the buyer; visible for context | rec_terms.scope2_method — buyer pencil |
| Carbon methodology (seller) | How carbon claims are evidenced | Grid average, Build margin or Combined | physical_terms.carbon_terms.methodology |
Example. You set forecast Submitted, nomination Single, and registry ZA-RECS. The buyer’s Scope 2 choice (Market vs Location) remains their field — you do not silently overwrite it.
Stage 6 — Shared terms
Job. Size and commercial envelope the buyer
will see. Joint asks on requested_joint_terms, not
private floors. The checklist calls this section Shared
terms.
| Field | What it represents | Example | In the draft |
|---|---|---|---|
| Capacity (MW) | Indicative contracted capacity you are offering | 5 MW matching the saleable sweep | requested_joint_terms.capacity_mw |
| Allocated energy (MWh/yr) | Annual energy target for shaped / baseload deals | 12 000 MWh/yr | allocated_energy_mwh_yr |
| Term (years) | How long you want the PPA to run | 15 years to match plant life / finance | term_years |
| Start date | When delivery / settlement should begin | COD + 3 months | start_date |
| Escalation mechanism | How price grows | CPI | escalation_mechanism |
| Escalation rate (%) | Numeric rate when the mechanism needs one | 1.5 for CPI-minus style | escalation_rate_pct |
| Settlement frequency | How often a settlement period closes | Monthly | settlement_frequency |
| Take-or-pay minimum (MWh/yr) | The least energy a year the buyer pays for, taken or not | At or below the allocated energy | top_min_volume_mwh_yr |
| Capped volume limit (MWh/yr) | Annual ceiling for capped shapes | A little above the allocated energy | capped_volume_limit_mwh_yr |
Volumes are checked against the deal. The suggestions size the take-or-pay minimum and the capped limit on this deal’s share of the plant — a 12.5 MW slice of a 50 MW plant on a quarter of its yield — so take-or-pay never exceeds the energy the deal allocates or the deal’s own poor-year (P90) yield, and the cap sits about 10 % above the allocation. Whatever you type, the section checks it under the field:
| Check | Under the field | At send |
|---|---|---|
| Take-or-pay minimum above the allocated energy | Rose: … is above the 29,565 MWh/yr this deal allocates. The buyer would pay for energy the contract never delivers. | Blocks — also listed under Required in this section |
| Capped limit below the take-or-pay minimum | Rose: the buyer could not take all it must pay for | Blocks |
| Capped limit more than 1.5 times the allocated energy | Amber: A cap that high never binds | Warning only |
| Take-or-pay above the buyer’s stated annual need, or the allocation more than 1.2 times it | Amber: names the buyer’s ask | Warning only |
| Allocated energy per month above the plant’s safe contractable capacity for next month | Amber: names both figures | Warning only |
Example. Ask 12.5 MW · 29,565 MWh/yr · 10 years · CPI, with a take-or-pay minimum of 27,791 MWh/yr and a cap of 32,522 MWh/yr. Stage 9 shows every figure; your floor prices stay on stage 7.
Stage 7 — Private limits
Job. Record floors and walk-aways the buyer must never see. Banner on the stage says so; stage 9’s buyer-eye preview omits every row here.
| Control | What it represents | Example | In the draft |
|---|---|---|---|
| Floor / walk-away (c/kWh) | Hard line under a price-card shape or global floor | AS_GENERATED floor 76 c/kWh; leave below that | Brief price_card.<TYPE> /
floor_price_ckwh walk-away |
| Penalty-cap walk-away | Soft/hard band on annual penalty cap | Will not accept above 20% | Brief penalty_cap_pct |
| Capacity / term walk-aways | Size and tenor you will not cross | Leave below 3 MW or under 10 years | Brief position walk-aways |
| Min / max acceptable | Soft band around your target for coaching | Target 88 c; min 80; max 95 | Brief min_acceptable / max_acceptable |
Setting a public price-card price equal to the private floor triggers the disclosure warning (you are about to show your floor). Each row names the limit in words (Price floor · As generated, Annual penalty cap) with its target beside it (Target 10 years).
Stage 8 — Q&A
Job. Answer the site preferences this proposal needs when the generator site’s record lacks them (sites set up before the current wizard) — not a routine stage for complete sites. Each answer is saved to the site, so it is asked once.
| When it appears | What you answer | Where it lands |
|---|---|---|
| Site missing shipped prefs | Generator-side preferences the advisor could not read | Usually the generator site (asked once) and/or thin brief positions |
| Site complete | Stage is empty / skipped | No write |
These buttons are real saves when shown — not decorative. Complete sites from the current wizard never see this panel.
Stage 9 — Review & send
Job. Clear readiness, see exactly what the buyer receives, set how long the quote stands, then Send to buyer.
| Panel / control | What it represents | In the draft / on send |
|---|---|---|
| Before you can send — blockers | Missing and incoherent terms (tariff type, a take-or-pay above the allocation, a price below LCOE, …) | Send stays disabled until clear. Each blocker names its section (Price card →, Shared terms →); clicking it opens that section and puts the cursor in the field |
| Warnings | Amber notes that do not block (a cap that never binds, asks above the buyer’s need) | Informational |
| Warnings to acknowledge | Risks you may own: a firm-decline verdict, a penalty cap above margin, No availability warranty | The checkbox unlocks Send; the send refuses without it |
| What the buyer receives | Every public term, in five groups — Prices, Volume/term/settlement, Warranty, Spill and curtailment, Green and forecasting — each with Edit | Built from the same fields the sections edit; blanks read Not set, and a section left wholly blank reads as one line; volume problems show in rose or amber; floors and walk-aways absent |
| Expiry | How long the PENDING quote stands (quote window; default 14 days; 3–90). The note under it says when the prices were first suggested (… on 28 September 2026) | expires_at on send |
| Send to buyer | Dispatch. The line under it says why it is disabled (Resolve the 2 blockers above to send., Acknowledge the warnings above to send.) and screen readers hear the same | Status DRAFT → PENDING; buyer can open review |
Example. The buyer receives three priced rows, availability 92%, a 10% penalty cap, buy-back spill, and 12.5 MW · 29,565 MWh/yr · 10 years · CPI. Readiness is clear → expiry 14 days → Send. Your 76 c floors never appear.
After send — second pass. When the buyer selects
e.g. CAPPED, reopen the studio: the CAPPED row price
lands on energy_price_ckwh, spill fields for CAPPED become
unambiguous, and you confirm or decline if the shape is unsupported.
Follow along (fields). Seat: IPP / Sales. Path: simulate a sale → Build Proposal. Walk stages 2–9: price two shapes above floor, accept warranty suggestions (or adjust the penalty cap), set spill without spot-market disposal if you have no BRP, check the take-or-pay minimum against the allocated energy on Shared terms, set one private floor on Limits, confirm it is absent from What the buyer receives, then leave the draft unsent (or send in a sandbox). Undo any change you did not mean from the notice at the bottom of the section.
3.4b Compose a virtual proposal (studio)
When you Build Proposal from a virtual Procurement simulation, you open the four-stage buyer virtual studio — not the physical eight. The seller virtual path (Sales) uses the same stage numbers and evidence column but different Strike / Obligations controls; that walkthrough is §3.4d. Shared spine and matched-shapes reading live here; seller-only detail (ladder, LCOE, insurance Q&A) lives in §3.4d.
There is no contract-type picker, no TOU allocation %, no spill/wheeling charge sheet: energy is never delivered, so those physical controls stay off the screen.
The header party line names both sides — e.g. OffTaker A (Buyer) → IPP 2 · Tshwane Solar Park (Seller) — so you always know who you are quoting against.
Stages (reading order).
| # | Stage | What you decide |
|---|---|---|
| 0 | Instrument | Physical or virtual — and why (§3.4c) |
| 1 | Evidence | Matched shapes, matched fraction, TOU composition, counterparty eligibility |
| 2 | Strike | Settlement volume basis; buyer cap & tariff or seller strike ladder |
| 3 | Obligations | Buyer: RECs / Scope 2 + conditions precedent. Seller: performance, insurance + CP |
| 4 | Dispatch | Public joint asks, private limits, counterparty preview, expiry, Send |
Suggestions. Strike and obligation fields that the
brief can decide arrive with a suggested value, a one-line rationale,
and Accept / Adjust / Why? — same pattern as physical.
Accepting records source: derived on the brief; Adjusting
keeps the original suggestion for audit. Buyer suggestions write into
virtual_terms paths (e.g. cap →
strike_price.cap_price_ckwh), never into physical
cap_price_ckwh.
Asks vs limits. Stage 4’s public joint asks become part of what the counterparty sees. Private walk-aways stay on your negotiating brief; the dispatch preview shows only the public sheet.
Where decisions land. Stages 2–3 write
virtual_terms (and the seller’s public
virtual_strike_ladder on stage 2). Stage 4 writes
requested_joint_terms (asks) and brief positions (limits).
Stage 0 sets proposal_type. Nothing reaches the
counterparty until stage 4’s Send.
Autosave still writes as you move. Term meanings in settlement language stay in §4.7 and §9; here the focus is what you set in the studio and what the draft carries.
Stage 0 — Instrument
Job. Confirm Eskom Virtual PPA (or switch back to Physical) before you fill strike and obligations. Deep comparison rules live in §3.4c.
| Control / panel | What it means | In the draft |
|---|---|---|
| Availability badges | Both available / Physical only / Virtual only, plus per-instrument available / unavailable / unconfirmed | Informs choice; if Virtual is available, Physical is treated as available too (the reverse does not hold) |
| Own verdict (Physical / Virtual) | What this deal is worth to you each way, on a stated volume basis | Brief instrument-comparison evidence |
| Counterparty estimate | What we think it is worth to them from disclosed terms only | Same evidence — never their private walk-away |
| Differences | Matching risk, delivery risk, time-to-first-flow | Listed for you; not separate proposal fields |
| Choose / switch instrument | Sets Physical vs Virtual for this draft | proposal_type — switching creates a
new draft and withdraws the old one; price cap is
never carried |
Example. Off-taker and IPP are both Eskom-connected and VWA-ready → badges show Both available. Virtual matched fraction is high and first flow is faster → you stay on Virtual; stages 1–4 then show virtual fields only.
Stage 1 — Evidence
Job. Confirm the hedge you simulated — matched shapes and eligibility — before you set money. No editable commercial fields here.
| Panel (left) | What it shows | In the draft |
|---|---|---|
| Matched shapes (24h) | Generation · consumption · matched overlap for a typical day | Snapshot from the promoting simulation / brief evidence |
| Matched fraction | Share of generation that overlaps your load in time | Brief matched_fraction (composition evidence) |
| TOU composition | Credit rates (c/kWh) by peak / standard / off-peak | Brief TOU / credit evidence |
| Counterparty eligibility | Whether both parties clear Eskom Virtual / VWA gates | Blockers listed when either side fails |
How to read Matched shapes (24h)
This is the virtual deal’s risk picture before you set strike. Energy is never delivered; what matters is when the plant produces relative to when the buyer consumes. The panel is evidence only — you do not edit shapes here. (Buyer seat: your load. Seller seat: their load against your generation.)
Axes and wash. The chart is a typical
24-hour day (SAST hours 0h …
23h on the x-axis). Relative intensity sits on the y-axis
(a normalised profile for comparison, not a contract MWh total). An
amber daylight wash marks roughly
06:30–17:30; slate marks night — use
that to see whether solar humps sit under daytime load or waste into
evening peaks.
Source label (top-right of the fraction strip): Metered history when enough real samples back the shapes; otherwise Synthetic profile (modelled from site technology / book assumptions). The fraction number is the same definition either way; metered is usually the stronger commercial claim.
The big number — matched fraction. Above the chart:
matched fraction = Σ_hours min(generation, consumption) ÷ Σ_hours generation
(glossary). Only that
overlapping energy earns an Eskom WER credit on a
virtual PPA (§9).
Unmatched generation earns no credit — and may still
attract CfD strike depending on the settlement volume basis
you choose on Strike.
The three series (legend under the plot — same names in the studio):
| Series | What it is | How to read it |
|---|---|---|
| Generation | The seller plant’s output shape across the day (from the generator site / promoting sim) | Where the plant is “on” — e.g. a solar site rises mid-morning, peaks midday, falls by dusk; night is near zero |
| Consumption | The buyer site’s load shape across the same hours | Where the offtaker draws power — often morning / evening peaks with a daytime plateau |
| Matched | Hour-by-hour overlap: min(Generation, Consumption) at each hour | The energy that can count for WER credit that hour. It can never exceed the lower of the two curves |
How to read the chart (step by step).
- Pick an hour (tooltip on hover, or eye-ball a band). Compare Generation vs Consumption at that hour.
- Matched at that hour is the smaller of the two — the overlap.
- Where Generation sits above Consumption, the excess is unmatched generation (plant made kWh you were not using then).
- Where Consumption sits above Generation, the buyer still buys the shortfall from Eskom as usual — that hour simply contributes less matched hedge.
- Sum those hourly matched slices, divide by total generation → the
matched fraction badge. Do not compare
daily totals with a single
min(Σgen, Σcons)— that overstates match when gen and load trade dominance inside the day (the same trap settlement avoids).
Solar plant vs daytime-heavy factory (~72% match)
Read it: Midday, Generation peaks above Consumption — the strip between the two is unmatched solar (no WER credit). Matched is only up to the load line. Early evening, Consumption rises while Generation falls — little or no match; you still pay Eskom retail for that load. Night: both low; almost nothing to match. The studio’s ~72% badge is the day summed that way, not “72% of hours look green.”
What good / bad looks like.
| Picture | What it usually means | What to do next |
|---|---|---|
| High overlap under the solar / wind hump | Most generation can earn WER credit | Proceed; Strike cap / ladder sized on matched volume |
| Tall generation midday, flat or low daytime load | Large unmatched band | Prefer MATCHED settlement basis, or rethink the pair / capacity |
| Strong evening consumption, weak evening generation | Night load never hedges | Do not treat retail “bill saving” as the virtual case |
| Fraction strip very low | Weak hedge economics | Fix sites / shapes in simulation — do not invent a strike on bad match |
Example. Matched fraction 72%, eligibility green (both Eskom + registration ready) → proceed to Strike. Chart shows solar under daytime factory load with a visible unmatched midday tip and thin evening match — that is the matching-risk story you carry into settlement-volume basis. If eligibility is red (e.g. offtaker not Eskom-connected), fix sites or switch instrument — do not invent a strike on a blocked pair.
The compact Matched shapes panel also reappears on Strike and Dispatch so you keep the overlap in view while setting money and sending.
Stage 2 — Strike
Job. Who carries matching risk, and what strike / protection numbers sit on the public offer. This is the largest economic stage on a virtual deal.
Settlement volume basis — no silent default. You must choose:
| Basis | Who carries unmatched volume | Plain English |
|---|---|---|
| GENERATED | Buyer | CfD settles on all plant output; you pay strike on unmatched kWh but only get Eskom WER credit on matched |
| MATCHED | Seller | CfD settles only on overlapping kWh; seller produced energy with no CfD on the unmatched remainder |
| GENERATED_WITH_FLOOR | Shared | Generated volume settles down to an agreed floor |
The stage shows a short explanation beside the control; §9 walks the cash flows.
Buyer controls (stage 2)
| Field | What it represents | Example | In the draft |
|---|---|---|---|
| Settlement volume basis | Matching-risk choice above | Daytime factory under a solar plant → prefer MATCHED so you do not pay strike on night spill | virtual_terms.settlement_volume_basis —
sent |
| Cap price (c/kWh) | Maximum strike you will pay — buyer protection on the CfD | Net energy target ≈ strike − Eskom credit; cap 95 c/kWh leaves headroom vs credit ~40 c/kWh | virtual_terms.strike_price.cap_price_ckwh —
sent; Dispatch readiness requires this |
| Buyer Eskom tariff category | Which Eskom tariff your site sits on (feeds credit / WER context) | Megaflex / Miniflex / … as on your Eskom account | virtual_terms.buyer_eskom_tariff_category —
sent |
Suggestions. Cap and settlement basis often arrive from the virtual brief (credit rate, matched fraction, break-even vs grid). Accept / Adjust / Why? stamp the brief the same way as physical. Setting the public cap equal to your private walk-away fires a disclosure warning — you are about to show your reservation price.
Draft vs brief. Cap on this stage is the ask on the proposal. Your walk-away (“I leave above 105”) belongs on stage 4 private limits.
Seller controls (stage 2)
| Field | What it represents | Example | In the draft |
|---|---|---|---|
| Settlement volume basis | Matching-risk choice (joint commercial) | Prefer GENERATED if you will not absorb unmatched | virtual_terms.settlement_volume_basis —
sent |
| Strike ladder — FLAT | Public all-in rate (c/kWh) for a flat structure | Quote 88 c/kWh FLAT | virtual_strike_ladder FLAT row — sent;
floors stay on brief price_card.* |
| Strike ladder — TOU | Public peak / standard / off-peak rates | Peak 110 · standard 90 · off-peak 70 | virtual_strike_ladder TOU row —
sent |
Strike ladder (seller). Quoted rates are public; private floors never appear on the ladder or in the buyer-eye preview. The expiry window on stage 4 is also how long the quote stands (ladder computed today).
Example (buyer). You choose MATCHED, accept suggested cap 95 c/kWh, set tariff category to your Megaflex class. Draft carries those three; seller later answers with a ladder you review on Dispatch.
Stage 3 — Obligations
Job. Soft obligations and gates before the VWA can go live — role splits what you edit.
Buyer controls (stage 3)
| Field | What it represents | Example | In the draft |
|---|---|---|---|
| Scope 2 method | GHG accounting for the hedge — market-based (RECs / contractual) vs location-based | RE100 programme → MARKET | virtual_terms.rec_terms.scope2_method —
sent |
| Conditions precedent (checklist) | Flags that must clear before the virtual PPA / VWA activates | Tick what you can assert now; leave the rest for signing | virtual_terms.conditions_precedent.* (grid connection,
VWA registration, NERSA licence, smart metering, insurance certificates,
environmental authorisation) |
Seller controls (stage 3)
| Field | What it represents | Example | In the draft |
|---|---|---|---|
| Availability warranty (%) | Minimum plant availability you guarantee | 97% | virtual_terms.performance_terms.availability_warranty_pct
— sent |
| Yield / degradation / remedy (performance embed) | Guaranteed annual yield, PoE benchmark, underperformance remedy, LD rate, min offtake | P50 yield · LD 25 c/kWh shortfall | virtual_terms.performance_terms.* |
| Insurance | Policies you maintain (all-risk, BI, public liability, …) + minimum cover (R m) | All-risk + BI + PL; R 50m aggregate | virtual_terms.insurance_terms.* |
| Conditions precedent | Same six gates as buyer — seller often owns plant-side ticks | VWA + NERSA + metering ready | virtual_terms.conditions_precedent.* |
Suggestions. Availability warranty and Scope 2 often arrive from the brief with Accept / Adjust / Why?.
Example (seller). Accept 97% availability, confirm insurance defaults, tick VWA registration and smart metering on CP. Buyer sees performance and insurance on review; your private LD floor (if any) stays off the public sheet.
Stage 4 — Dispatch
Job. Size the public envelope, set private walk-aways, clear readiness, choose expiry, then Send.
Public joint asks
| Field | What it represents | Example | In the draft |
|---|---|---|---|
| Capacity (MW) | Indicative contracted capacity | Simulate used 5 MW → ask 5 | requested_joint_terms.capacity_mw |
| Term (years) | How long the hedge runs | 10 | term_years |
| Start date | When settlement should begin | First day of next FY | start_date |
| VWP vendor | Virtual wheeling platform vendor (when required) | As registered with Eskom | vwp_vendor |
| Settlement frequency | How often a settlement period closes | MONTHLY | settlement_frequency |
| Escalation mechanism / rate (%) | How the strike grows | CPI · or fixed 1.5% | escalation_mechanism /
escalation_rate_pct |
Private limits (never sent)
| Role | Typical keys | Example |
|---|---|---|
| Buyer | cap_price_ckwh,
contracted_capacity_mw |
Cap walk-away 105 c/kWh; capacity walk-away 3 MW |
| Seller | floor_price_ckwh, contracted_capacity_mw,
term_years, plus price_card.* floors |
Floor walk-away 80 c/kWh on FLAT |
Walk-aways, min/max acceptable, and targets live on the brief only. The counterparty preview must not contain them.
Preview, readiness, send
| Panel / control | What it represents | In the draft / on send |
|---|---|---|
| Counterparty-eye preview | Settlement basis, public strike/cap or ladder, joint asks, obligations the other side will see | Walk-aways absent by design |
| Readiness — missing / incoherent | Hard blockers — for buyers this includes Cap price
(c/kWh) on virtual_terms.strike_price |
Send stays disabled until clear |
| Readiness — ack required | Ownable warnings (see §3.4.1) | Checkbox unlocks Send |
| Band inverted | Buyer cannot pay what the plant costs (brief flag) | Stage offers Withdraw draft instead of Send |
| Expiry | How long the PENDING offer / quote stands (default 14 days; 3–90) | expires_at on send; seller ladder quote aged from
today |
| Send | Dispatch to counterparty | Status DRAFT → PENDING |
Example (buyer). Preview shows MATCHED · cap 95 c/kWh · 5 MW · 10y · CPI. Readiness was blocking on missing cap until you accepted the stage-2 suggestion → expiry 14 days → Send to seller. Seller sees that sheet only; your 105 c/kWh walk-away never appears.
Example (seller). Preview shows GENERATED · FLAT 88 c/kWh ladder · 5 MW · 10y. Floors absent. Send to buyer; expiry is also the quote window.
Follow along (buyer virtual). Seat: Off-taker A (Organization). Path: Procurement → run / open a virtual simulation → Build Proposal. Confirm the party line names your site and the IPP. Walk stages 0–4: keep Virtual on Instrument, check matched fraction on Evidence, set settlement basis and Accept (or Adjust) cap on Strike, tick Scope 2 / any CP on Obligations, set one private walk-away on Dispatch, confirm it is absent from the seller-eye preview, then leave unsent (or send in a sandbox). Seller virtual walkthrough → §3.4d.
3.4c Choosing between a physical and a virtual deal
Stage 0 — Instrument sits ahead of Evidence in every compose studio. It is where you see both instruments side by side before you fill terms.
What the studio shows. What this deal is worth to you each way, on a stated volume of energy (the volume basis is in the line — not a tooltip). What we think it is worth to them, labelled plainly as an estimate from what they told you (disclosed terms only). It never picks for you. Below the materiality threshold review stays silent; compose still states both positions.
What cannot be folded into Rand. Matching risk, delivery risk, and how long each instrument takes to start first flow are listed as differences, not buried inside the money figure. If only one instrument is available for the pair, the stage collapses to one line that says which and why not — the same wording as the search modal.
When it opens first. The studio still opens on Evidence (or the seller’s price-card stage) unless both instruments are available and the difference is material for you. Switching instrument on a draft creates a new draft of the other type and withdraws the old one; shared asks carry as suggestions, and the price cap is never carried (its meaning changes). Countering later tells the other side what your analysis found — the disclosure warning lives here because this is where you see both sides.
3.4.1 Before you can send
Sending is gated at the action, not only in the UI. The system checks the sending party’s slice before a draft can become PENDING. Physical stage 8 / 9 (and virtual stage 4) list failures and keep Send disabled until they clear; some warnings require an acknowledgement checkbox first.
What must be filled in. Your side of the sheet: every field that applies under the chosen contract type, plus a private negotiating brief with a walk-away on price and on capacity (buyer). Sellers need at least one priced row on the price card, tariff / forecast / nomination fields, and coherent floors.
What the system will stop you doing (hard limits). These are physical impossibilities — they block, and you cannot acknowledge past them:
- term longer than remaining plant life, start before COD, or capacity above what the seller can still sell
- a seller price-card row below the plant’s LCOE (cost floor)
SPOT_MARKETexcess disposal without a BRP registration- a contract type the seller’s plant does not support
Warnings you can accept responsibility for. These look similar to hard limits but are not: the send is allowed only if you acknowledge them.
- Knowingly thin (seller): the ask is above LCOE but below the buyer’s ceiling — a strategic low price, not a below-cost quote. Below LCOE still blocks; this path does not.
- Firm-block decline: the plant’s firmness check would decline the shape — you may still send after acknowledgement.
- Penalty cap above modelled margin: worst-case penalties exceed the deal’s modelled margin — warn only.
Eskom / VWA readiness gaps on the buyer site stay advisory (shown for compose, not a send block). Virtual proposals use a separate readiness checklist (joint asks, settlement volume basis, strike / ladder, insurance, eligibility) — not this physical one. A low matched fraction on a virtual deal is a warning you can acknowledge, not a hard block.
The sender also chooses how long the offer stands (§3.2) via the expiry control on physical stage 8 / 9 or virtual stage 4 (“Valid until … — N days”).
3.4.2 The detail modal — review and counterparty
Once a proposal is on the list (or you open a received PENDING), the detail modal is the review surface. Its header pill tells you which hat you wear: You are the Buyer / Seller. The body walks: parties → deal structure → indicative terms → billing responsibility → estimated PPA cost → the contract terms form → message, expiry, timeline.
The form is governed by party assignment: every field carries a chip — Seller (emerald), Buyer (sky), Joint (slate), Auto (amber, derived) — and you can edit only your own side. What you see is always the merged sheet; what you can write is your slice.
For physical proposals, contract type prunes spill / shortfall / TOU fields the same way as the studio. For virtual proposals the indicative price is labelled Strike Price, and the billing panel becomes the CfD settlement triangle — strike settlement, the buyer’s full Eskom bill, and the WER credit back.
3.4.3 Suggestions in the modal (a draft with no simulation)
A draft raised straight from market search — no simulation behind it — used to open with your entire half of the term sheet blank. The indicative terms and the estimated PPA cost were the only numbers on the page.
Your fields now arrive suggested. Each one you own carries the same Accept / Adjust / Why? row as the studios, tagged Based on both parties’ records, and a banner above the form counts what is still outstanding and offers Apply all.
Nothing is written until you act. Accepting writes that one value into the proposal terms; Apply all writes every outstanding one; adjusting records your number instead. Until you send, none of it reaches the counterparty. And you only ever see your side: the seller’s suggestions are invisible to the buyer and vice versa.
Selling — what the seller’s rows come from. These are the IPP §3 rules the seller studio uses, run against your plant’s own record, the buyer’s stated preferences, and this proposal’s indicative terms:
| Field | Grounded in |
|---|---|
| Tariff Type | the shape the buyer picked, the TOU edge over a flat rate, your capacity factor, how much of the plant stays unsold after this deal, and the buyer site’s tariff preference, index type and term |
| Energy Price | your published price-card row for that shape, else the proposal’s indicative price |
| Capacity Charge | a two-part split of that quote — the fixed leg and the reduced energy rate together earn what the flat quote earns at P50 |
| Floor Price | the worst leg your own quote implies under the suggested multipliers; where those are flat, a ratchet floor at the opening quote |
| TOU multipliers | the best-scoring set for your technology’s generation shape — re-ranked against the buyer’s TOU split once they declare one |
| Curtailment | the unsold band, whether you have storage to source replacement energy, and the deal’s annual value |
| Spill & excess | the unsold band and your site’s Eskom buy-back status |
| Shortfall | the plant’s availability envelope (maintenance allowance, or the
evening firm block for FIRM / BASELOAD),
technology degradation and the opening penalty caps |
Buying — what the buyer’s rows come from. The mirror image, from the OFFTAKER §3 rules the buyer studio uses:
| Field | Grounded in |
|---|---|
| Contract Type | every shape the seller supports, scored on your load and preferences — with the runners-up and their trade-offs listed as alternatives |
| Security Deposit | your site record; a fact about your Eskom account, not a position |
| TOU split | the seller’s own generation shape — the ask they can meet without
buying replacement energy (SHAPED only) |
| Cap Price | your blended grid rate less the wheeling you now carry, then the standard 10% cushion — the price above which this deal stops beating the grid |
| Price Ceiling | that same break-even, netted down by the capacity charge the seller has quoted (two-part deals only) |
| Curtailment | your site’s curtailment acceptance and seasonal shutdowns |
| Under-consumption | your site’s spill preference |
| Shortfall | your remedy preference, whether the seller is an IPP or a trader, and the deal’s size for the reporting cadence |
| Scope 2 method | your site’s REC flag |
The contract type sits in its own block above the form because it decides which other terms even exist. Apply all never writes it — it is the one field the counterparty is waiting on, so you choose it deliberately.
Trading. A trader pool is not a plant and not a load, so it gets what it can actually stand behind and nothing else:
- selling — the shape-derived rows drop away (a pool
has no generation profile to shape a price against, and no single plant
whose availability it could warrant) and the Trader Seller
Terms appear in their place: source guarantee, minimum
portfolio capacity, replacement energy source and the licence warranty,
all read off your actual supply book.
SPOT_MARKETdisposal is offered only when your book carries a BRP registration. - buying — you get the contract type, the reporting cadence and your Trader Buyer Terms structure (back-to-back pricing and margin type, read off your own settlement configuration). The cap, curtailment, spill and Scope 2 rows stay blank: those read an off-taker site’s grid tariff and stated preferences, and a pool has neither.
Fields that stay blank on purpose. A
capacity charge only belongs to a TWO_PART
/ BLENDED structure and a floor price only
to a floating one; under FIXED neither is suggested, and
the tariff row says so. Anything the chosen contract type prunes from
the form is dropped from the suggestions too, so the banner never counts
a row you cannot see.
What none of it knows. A search-created draft carries no cost model on either side, so:
- the seller’s floor price is a disclosed negotiating position the buyer will see — never your private walk-away;
- the seller’s penalty caps are the opening 8%/yr ask, not clamped against your margin the way the studio clamps them;
- the buyer’s cap is read off the published tariff table, not a swept break-even, and the trader’s margin number is never suggested at all — nothing here prices what you can on-sell at.
If you want those numbers costed, build the deal in the buyer or seller studio from a simulation instead: the simulation supplies the LCOE, the sweep and the modelled margin, and the suggestions come off your private brief.
3.4d Compose in the seller virtual proposal studio
When you Build Proposal from a virtual Sales simulation, you open the four-stage Seller Virtual Proposal Studio — not the physical nine-stage price-card studio (§3.4a). You share the stage spine with the buyer virtual compose (§3.4b), but the commercial heart is the strike ladder (FLAT + TOU public rates) instead of a buyer cap, and Obligations are performance + insurance, not Scope 2.
There is still no contract-type picker, no per-shape price card, no
spill / wheeling / shortfall sheet, and no second pass
after send: the ladder is the quote. Floors stay on your
private brief (price_card.FLAT /
price_card.TOU); the buyer-eye preview never shows
them.
The header party line names both sides — e.g. OffTaker A (Buyer) → IPP 2 · Tshwane Solar Park (Seller).
How this differs from physical seller (§3.4a) and buyer virtual (§3.4b)
| Topic | Physical seller (§3.4a) | Seller virtual (this section) | Buyer virtual (§3.4b) |
|---|---|---|---|
| Stage count | 0–9 (price card, warranty, spill, green, …) | 0–4 only | 0–4 only |
| Money stage | Price card — one rate per contract type | Strike ladder — FLAT + TOU rows | Cap + Eskom tariff category |
| Shape / CT | Buyer picks CT later → second pass | No CT; ladder stands alone | No CT |
| Matching risk | Delivery / spill language | Settlement volume basis (GENERATED / MATCHED / …) | Same control (joint) |
| Soft obligations | Warranty · spill · green | Performance · insurance · CP | Scope 2 · CP |
| Private floors | Brief floors under price-card rows | Brief price_card.* + floor_price_ckwh on
Dispatch |
Cap / capacity walk-aways |
| Hard blocks at send | Unpriced rows, invalid spill, … | Missing ladder rates, below LCOE (ack never clears), floor > rate | Missing cap, joint asks, … |
| Q&A | Dedicated stage 8 when site prefs missing | Inline when insurance cover missing on the plant | Usually none |
| After send | Second pass when buyer picks CT | No second pass — quote is the ladder | Buyer awaits seller ladder / counter |
Suggestions. Availability warranty (and related
brief fields) arrive with Accept / Adjust / Why? — same
affordance as physical. Accepting stamps the brief and writes into
virtual_terms; Adjusting keeps the original suggestion for
audit. Ladder rates are public edits on the draft;
ladder floors are private-limit writes on the
brief.
Where decisions land. Stage 2 writes
virtual_terms.settlement_volume_basis and the public
virtual_strike_ladder (rates only). Stage 3 writes
virtual_terms.performance_terms,
insurance_terms, and conditions_precedent.
Stage 4 writes requested_joint_terms and brief limits.
Stage 0 sets proposal_type. Nothing reaches the buyer until
stage 4 Send.
Stage 0 — Instrument
Job. Confirm Eskom Virtual PPA (or switch back to Physical) before you quote the ladder. Same comparison surface as every compose studio — deep rules in §3.4c.
| Control / panel | What it means | In the draft |
|---|---|---|
| Availability badges | Both available / Physical only / Virtual only | Informs choice; Virtual available ⇒ Physical treated available too (not the reverse) |
| Own verdict (Physical / Virtual) | What this sale is worth to you each way, on a stated volume basis | Brief instrument-comparison evidence |
| Counterparty estimate | What we think it is worth to the buyer from disclosed terms only | Same evidence — not their private walk-away |
| Differences | Matching risk, delivery risk, time-to-first-flow | Listed; not separate proposal fields |
| Choose / switch | Sets Physical vs Virtual for this draft | proposal_type — switching creates a
new draft and withdraws the old one; cap /
strike numbers are never carried across instruments |
Example. Physical margin looks better on stated MWh, but the offtaker is VWA-ready and matched fraction is high → stay on Virtual; stages 1–4 show ladder and performance only. Switching from a physical draft re-derives virtual advisor positions (availability, settlement prompt) from the linked simulation — it does not copy your physical energy prices into the ladder.
Stage 1 — Evidence
Job. Confirm the hedge you simulated — matched shapes and eligibility — before you quote. No editable commercial fields here.
Same left-column panels as the buyer virtual studio (§3.4b Stage 1), including how to read Matched shapes (24h).
| Panel | Seller reading | In the draft |
|---|---|---|
| Matched shapes (24h) | Generation is your plant; Consumption is the buyer’s load; Matched is the overlap that can earn their WER credit | Snapshot from the promoting simulation / brief |
| Matched fraction | Share of your generation that overlaps their load — sizes how much of a GENERATED quote is “credit-backed” for them | Brief matched_fraction |
| TOU composition | Credit rates by peak / standard / off-peak — why a TOU ladder can leave both sides better off than flat | Brief TOU / credit evidence |
| Counterparty eligibility | Both parties must clear Eskom Virtual / VWA gates | Blockers when either side fails |
Example. Matched fraction 71%, eligibility green → proceed to Strike. A tall midday unmatched band argues for MATCHED settlement (you absorb unmatched) or a smaller capacity ask — not for inventing a FLAT rate below LCOE to “win” the deal.
Stage 2 — Strike
Job. Set who carries matching risk, then publish the strike ladder. This replaces the physical price card: two public structures (FLAT and TOU), not one row per contract type.
Settlement volume basis — no silent default (same three options as buyer — §3.4b):
| Basis | Who carries unmatched | Seller plain English |
|---|---|---|
| GENERATED | Buyer | CfD on all your output — buyer pays strike even when they get no WER credit on unmatched kWh |
| MATCHED | You (seller) | CfD only on overlapping kWh — unmatched generation has no CfD |
| GENERATED_WITH_FLOOR | Shared | Generated settles down to an agreed floor |
Strike ladder (seller-only)
| Control | What it represents | Example | In the draft |
|---|---|---|---|
| FLAT — flat rate (c/kWh) | Public all-in strike | 88 c/kWh | virtual_strike_ladder FLAT row —
sent |
| FLAT — private floor (c/kWh) | Your walk-away under that row | Floor 80 (LCOE + margin) | Brief price_card.FLAT — never
sent |
| TOU — peak / standard / off-peak | Public TOU strikes | 110 · 90 · 70 | virtual_strike_ladder TOU row —
sent |
| TOU — private floor (when shown) | Walk-away under the TOU structure | On brief price_card.TOU |
never sent |
How to read the ladder vs the physical price card.
- Physical: one price per AS_GENERATED / FIRM / … — buyer picks a shape later.
- Virtual: FLAT and TOU are alternative strike structures for the same hedge — both can be quoted; floors never appear in the buyer-eye preview.
- Expiry on Dispatch is also the quote window (ladder aged from today).
- Setting a public rate equal to your private floor fires a disclosure warning — you are about to show your reservation price.
Suggestions. Settlement basis often arrives as a prompt (no silent pick). Ladder rates may be prefilled from the virtual advisor (LCOE + margin, credit-aware TOU); you still edit them as public numbers.
Example. Choose GENERATED, quote FLAT 88 c/kWh with private floor 80, and a TOU row lined up with Megaflex credit bands. Draft carries both public rows; floors stay on the brief. Buyer later sees rates only.
Stage 3 — Obligations
Job. Plant-side soft obligations and gates before the VWA can go live — not the buyer’s Scope 2 panel.
| Field | What it represents | Example | In the draft |
|---|---|---|---|
| Availability warranty (%) | Minimum plant availability you guarantee | 97% | virtual_terms.performance_terms.availability_warranty_pct
— sent |
| Yield / degradation / remedy | Guaranteed annual yield, PoE, underperformance remedy, LD rate, min offtake | P50 yield · LD 25 c/kWh | virtual_terms.performance_terms.* |
| Insurance | Policies + minimum cover (R m) | All-risk + BI + PL; R 50m | virtual_terms.insurance_terms.* |
| Conditions precedent | Same six gates as buyer — you often own plant / NERSA / metering ticks | VWA + NERSA + metering ready | virtual_terms.conditions_precedent.* |
Suggestions. Availability warranty commonly arrives
with Accept / Adjust / Why? from the brief (capacity
factor / p_short envelope). Over-committing availability
relative to what the plant can support is a hard readiness
block — acknowledgement does not clear it.
Insurance Q&A (inline). If the generator site has no cover on file, the studio asks the same insurance questions the physical Q&A stage would — answers persist to the site (asked once) and unlock the insurance embed. Complete sites never see the panel.
Example. Accept 97% availability, confirm insurance defaults (or answer Q&A once), tick VWA registration and smart metering. Buyer sees performance and insurance on review; your private LD / floor numbers stay off that sheet.
Stage 4 — Dispatch
Job. Size the public envelope, set private walk-aways, clear readiness, choose expiry, then Send to buyer.
Public joint asks
Same joint fields as buyer virtual (§3.4b Stage 4): capacity, term, start date, VWP vendor, settlement frequency, escalation. No contract-type, TOU allocation, spill, or wheeling charges.
Private limits (never sent)
| Typical keys | Example |
|---|---|
floor_price_ckwh, contracted_capacity_mw,
term_years |
Floor walk-away 80 c/kWh; capacity 3 MW |
price_card.FLAT / price_card.TOU
floors |
Same floors editable on Strike ladder rows |
Preview, readiness, send
| Panel / control | What it represents | In the draft / on send |
|---|---|---|
| Buyer-eye preview | Settlement basis, public ladder rates, joint asks, performance / insurance / CP the buyer will see | Floors and walk-aways absent |
| Readiness — missing | Ladder incomplete (FLAT needs flat rate; TOU needs all three), settlement basis, joint asks, CP, insurance when required | Send disabled until clear |
| Readiness — incoherent | Below LCOE (hard — ack never clears), floor above quoted rate, availability above support | Fix the number or withdraw |
| Readiness — ack required | e.g. low matched fraction | Checkbox unlocks Send |
| Band inverted | Buyer cannot pay what the plant costs (brief flag) | Stage offers Withdraw draft instead of Send |
| Expiry | How long the PENDING quote stands (default 14 days; 3–90) | expires_at; also ages the ladder quote |
| Send | Dispatch to buyer | Status DRAFT → PENDING |
Example. Preview shows GENERATED · FLAT 88 · TOU 110/90/70 · 5 MW · 10y · CPI — floors absent. Readiness was blocking on a blank TOU off-peak until you filled it → expiry 14 days → Send to buyer. Buyer never sees your 80 c floor.
Follow along (seller virtual). Seat: IPP 2 (
ipp_2@webill.net). Path: Sales → run / open a virtual simulation → Build Proposal. Confirm the party line names the offtaker and your plant. Walk stages 0–4: keep Virtual on Instrument, read matched fraction on Evidence (§3.4b chart guide), choose settlement basis and quote FLAT (and optionally TOU) above private floors on Strike, Accept availability on Obligations (answer insurance Q&A if shown), set one private floor on Dispatch, confirm it is absent from the buyer-eye preview, then leave unsent (or send in a sandbox).
3.4e Compose in the trader buy proposal studio
When you Build Proposal from a Buy →
IPP simulation on a trader
pool Simulations workbench, you land in the full-page Trader
Buy Proposal Studio — not the org proposals list and not the
offtaker buyer
proposal studio. The deal type is TRADER_IPP: your pool
is the buyer; the generator site is the seller. The draft stays
private until you Send to seller.
Same spine as the offtaker buyer studio (§3.4)
If you already know §3.4, most of the UX is familiar on purpose:
- A checklist of sections, Evidence and Explanations one click from each; autosave
- Shape → Price → Risk → Green → public Asks → private Limits → Review
- Shared buyer fields: contract type (+ TOU when
SHAPED), cap / ceiling, curtailment / spill / shortfall (pruned by contract type), Scope 2 method, joint asks, walk-aways on the brief - Accept / Adjust / Why? suggestions; disclosure warning when a public cap equals your private walk-away
- Stage 8 readiness, expiry (3–90 days, default 14), Send to seller → DRAFT → PENDING
Reuse §3.4 for what those shared fields mean. This section names only what changes for the trader seat.
How this differs from the buyer studio (§3.4)
| Topic | Off-taker buyer (§3.4) | Trader buy (this section) |
|---|---|---|
| Entry | Off-taker Procurement → Build Proposal | Trader Simulations → Buy → IPP → Build Proposal (V3 §8.6) |
| Deal type | Off-taker as buyer (OFFTAKER_IPP, …) |
TRADER_IPP only — pool buys; IPP
sells |
| Virtual / Instrument | Stage 0 Instrument can open Physical vs Virtual (§3.4c); virtual uses §3.4b | No Instrument stage. Physical compose only in this release |
| Stage map | 0 Instrument · 1 Evidence · 2 Shape · 3 Price · 4 Risk · 5 Green · 6 Asks · 7 Limits · 8 Review | 0 Evidence · 1 Shape · 2 Price · 3 Risk · 4 Trader terms · 5 Green · 6 Asks · 7 Limits · 8 Review |
| Evidence | Current supply mix (24h) — Grid / wheeled / virtual stack | Net position / supply gap (24h) — book cover vs residual gap |
| Contract types | Seller-supported shapes (plus any prior-findings restrict) | Generator ∩ pool
supported_contract_types |
| Trader terms | None | Dedicated stage 4 — trader_buyer_terms
(below) |
| Site Q&A / deposit | Sky A few quick questions; readiness may need
security_deposit_status |
None — a pool is not a consumption site |
| Decline findings | Prior findings checklist can reappear on compose | None on this seat |
| Readiness extras | Buyer-core + site advisories | Buyer-core plus trader_margin_type and
back_to_back_pricing (hard gates). Margin numbers
are not send-blockers |
| Review preview | What the seller receives — every term you set, by section | The same list with one more group, Trader terms (margin type, margin, back-to-back pricing) |
| Discard returns to | Procurement | Simulations |
| Send label | Send to seller | Send to seller (same) |
Stages (reading order)
| # | Stage | What you decide |
|---|---|---|
| 0 | Evidence | Net position / supply gap, fit chart, impact, IPP candidate |
| 1 | Shape | Contract type (generator ∩ pool) + TOU when SHAPED |
| 2 | Price | Cap, ceiling, break-even ladder — same meanings as §3.4 Stage 3 |
| 3 | Risk | Buyer curtailment / under-consumption / shortfall — same prune rules as §3.4 Stage 4 |
| 4 | Trader terms | Margin structure and back-to-back (below) |
| 5 | Green | Scope 2 method (rec_terms) — always on this stage, not
pruned by contract type |
| 6 | Public asks | Capacity, term, escalation — sent with the proposal |
| 7 | Private limits | Walk-aways on your brief — never sent |
| 8 | Review & send | What the seller receives, readiness, expiry, Send to seller |
Stage 4 — Trader terms
Job. Say how the pool earns and whether pricing is back-to-back with the plant. These fields are why a trader buyer is not an offtaker clone — they have no home on the offtaker studio.
| Field | What it represents | In the draft |
|---|---|---|
| Trader margin type | How the pool’s margin is expressed (e.g. fixed c/kWh vs percentage) | physical_terms.trader_buyer_terms.trader_margin_type —
sent; hard readiness gate |
| Trader margin (c/kWh) | Fixed-margin amount when the type is c/kWh | trader_margin_ckwh — sent when used;
not required to unlock Send |
| Trader margin (%) | Percentage margin when the type is percentage | trader_margin_pct — sent when used;
not required to unlock Send |
| Back-to-back pricing | Whether commercial terms track the generator deal | back_to_back_pricing — sent;
hard readiness gate |
Suggestions. Structure (type / back-to-back) may arrive from the pool’s settlement config with Accept / Adjust / Why?. Margin numbers are never auto-written — you type them.
On this stage the evidence column swaps to impact + IPP candidate so you can set margin against the deal you simulated, not against an empty chart.
Suggestions, asks, and where decisions land
Suggestions. Shape, price, risk, green, and
trader-terms fields arrive with Accept / Adjust / Why?
from the private negotiating brief built at promote time. Accepting
records source: derived; Adjusting records your
override.
Asks vs limits. Stage 6’s public asks become part of what the IPP sees. Stage 7’s walk-aways stay on your brief; stage 8’s What the seller receives lists every term you set — Delivery profile, Price protection, Risk, Trader terms, Green, and Volume, term and settlement — and nothing from the brief: search it for a walk-away and you will not find one. It reads the same way as the off-taker studio’s (§3.4 Stage 8).
Where decisions land. Stages 1–5 write
physical_terms (autosave). Stage 6 writes
requested_joint_terms. Stage 7 writes only your negotiating
brief. Nothing reaches the IPP until stage 8’s Send to
seller.
Bridge. Simulations promote → this studio: V3 §8.6. Selling from the same pool uses the trader sell studio. Trader-to-trader stays refused with the V2-open copy on Simulations — no studio until VWA registration for traders is modelled (decisions V2).
Follow along. Seat: a trader pool with a completed Buy → IPP simulation. Path: Simulations → Buy → select an IPP → Simulate → Build Proposal. Confirm the party line names your org as buyer and the IPP as seller. Confirm there is no Instrument tab. Walk stages 0–8: set contract type, accept a cap suggestion, fill Trader terms (margin type + back-to-back), confirm the private banner on Limits, then on Review check walk-aways are absent and What the seller receives lists your margin type and back-to-back choice under Trader terms before Send to seller.
3.4f Compose in the trader sell proposal studio
When you Build Proposal from a Sell →
OffTaker simulation on a trader pool Simulations workbench,
you land in the full-page Trader Sell Proposal Studio —
not the org proposals list and not the IPP seller proposal
studio. The deal type is OFFTAKER_TRADER: your pool is
the seller; the offtaker site is the buyer. The draft stays
private until you Send to buyer.
Same spine as the seller studio (§3.4a)
If you already know §3.4a, most of the UX is familiar on purpose:
- A checklist of sections, Evidence and Explanations one click from each; autosave
- Tariff structure + public price card (floors private on the brief)
- Warranty → Spill → Green → public Asks → private Limits → Review
- Shared seller fields: shortfall / availability envelope, spill & curtailment (spot-market disposal only with a BRP), forecast / nomination / REC, joint asks, private floors
- Accept / Adjust / Why? suggestions; disclosure warning when a public price equals a private walk-away
- Every priced row below its floor is a hard block (withdraw rather than walk twenty fields)
- After send, when the buyer picks a
contract_type, the studio re-opens collapsed to that row (second pass) — same as IPP - Review readiness, expiry (3–90 days, default 14), Send to buyer → DRAFT → PENDING
Reuse §3.4a for what those shared fields mean (price-card mechanics also in V4 §6). This section names only what changes for the trader seat.
How this differs from the seller studio (§3.4a)
| Topic | IPP seller (§3.4a) | Trader sell (this section) |
|---|---|---|
| Entry | Generator Sales → Build Proposal | Trader Simulations → Sell → OffTaker → Build Proposal (V3 §8.6) |
| Deal type | Generator-site sale (OFFTAKER_IPP, …) |
OFFTAKER_TRADER only — pool sells;
offtaker buys |
| Virtual / Instrument | Stage 0 Instrument can open Physical vs Virtual (§3.4c); virtual uses §3.4d | No Instrument stage. Physical compose only in this release |
| Stage map | 0 Instrument · 1 Evidence · 2 Price · 3 Warranty · 4 Spill · 5 Green · 6 Asks · 7 Limits · 8 Q&A · 9 Review | 0 Evidence · 1 Price · 2 Warranty · 3 Spill · 4 Trader terms · 5 Green · 6 Asks · 7 Limits · 8 Review |
| Evidence | Unsold profile (24h) — contracted vs unsold | Net position / surplus (24h) — surplus by SAST hour |
| Price card shapes | Plant supported_contract_types |
Pool-supported types, or a single-quote
AS_GENERATED card when the pool has none listed |
| Trader terms | None | Dedicated stage 4 —
trader_seller_terms (below) |
| Site Q&A | Stage 8 backfills plant prefs that predate the wizard | Absent — a pool is not a plant |
| Compose opens on | Often price card; may open Instrument if material | Always price card (stage 1) after Evidence |
| Readiness extras | Seller-core (+ plant advisories) | Seller-core plus five trader seller gates (below) |
| Review preview | What the buyer receives — every public term, by section | The same list with one more group, Portfolio guarantees (the five trader terms, technologies included) |
| Send flash | “Proposal sent to the buyer.” | Names the offtaker organisation |
| Discard / withdraw returns to | Sales | Simulations |
| Send label | Send to buyer | Send to buyer (same) |
Stages (reading order)
| # | Stage | What you decide |
|---|---|---|
| 0 | Evidence | Net position / surplus, fit chart, impact, offtaker candidate (prefs) |
| 1 | Price card | Tariff structure, then one price per pool-supported shape (or single-quote); floors private — same meanings as §3.4a Stage 2 |
| 2 | Warranty | Shortfall seller slice — availability, deadband, penalty caps |
| 3 | Spill | Spill & curtailment — seller slice; spot-market disposal only with a BRP on the book |
| 4 | Trader terms | Portfolio guarantees (below) |
| 5 | Green | Forecast, nomination, REC / carbon |
| 6 | Public asks | Capacity, term, escalation — sent with the proposal |
| 7 | Private limits | Floors and caps on your brief — never sent |
| 8 | Review & send | What the buyer receives, readiness, expiry, Send to buyer |
Stage 4 — Trader terms
Job. State the portfolio guarantees behind the quote. These fields are why a trader seller is not an IPP clone — they have no home on the plant studio.
| Field | What it represents | In the draft |
|---|---|---|
| Source guarantee | How supply is backed (e.g. portfolio vs named plant) | physical_terms.trader_seller_terms.source_guarantee —
sent; hard readiness gate |
| Guaranteed technology types | Technologies the portfolio warrants | guaranteed_technology_types — sent;
hard readiness gate |
| Min portfolio capacity (MW) | Floor capacity the seller stands behind | min_portfolio_capacity_mw — sent;
hard readiness gate |
| Replacement energy source | Where replacement energy comes from if the portfolio under-delivers | replacement_energy_source — sent;
hard readiness gate |
| Licence validity warranty | Whether you warrant NERSA / trading-licence validity | licence_validity_warranty — sent;
hard readiness gate (true /
false) |
Suggestions. These fields may arrive with
Accept / Adjust / Why? from the trader seller advisor.
Accepting records source: derived; Adjusting records your
override.
Suggestions, asks, second pass, and where decisions land
Suggestions. Price, warranty, spill, green, and
trader-terms fields arrive with Accept / Adjust / Why?
from the private negotiating brief built at promote time. Public
price-card rows never carry floors — those stay on
price_card.* walk-aways on the brief.
Asks vs limits. Stage 6’s public asks become part of what the offtaker sees. Stage 7’s walk-aways stay on your brief; stage 8’s What the buyer receives lists every public term — Prices (each card row and the tariff type), Warranty, Spill and curtailment, Portfolio guarantees, Green and forecasting, and Volume, term and settlement — and nothing from the brief: search it for a walk-away and you will not find one. A public value that equals your private walk-away raises a disclosure warning.
Second pass. After you send, when the offtaker picks
a contract_type on the PENDING proposal, the studio
re-opens collapsed to that row — price written to
energy_price_ckwh, shape-gated fields confirmed — same
discipline as §3.4a.
Where decisions land. Stages 1–5 write
physical_terms and the public
seller_price_card (autosave). Stage 6 writes
requested_joint_terms. Stage 7 writes only your negotiating
brief. Nothing reaches the offtaker until stage 8’s Send to
buyer.
Bridge. Simulations promote → this studio: V3 §8.6. Buying for the same pool uses the trader buy studio. Trader-to-trader stays refused with the V2-open copy on Simulations — no studio until VWA registration for traders is modelled (decisions V2).
Follow along. Seat: a trader pool with saleable inventory and a completed Sell → OffTaker simulation. Path: Simulations → Sell → select an offtaker → Simulate → Build Proposal. Confirm the party line names your org as seller and the offtaker as buyer. Confirm there is no Instrument or Q&A tab. Walk stages 0–8: accept price/tariff suggestions, fill Trader terms (all five gates), confirm the private banner on Limits, then on Review check walk-aways are absent from What the buyer receives and your guarantees appear under Portfolio guarantees before Send to buyer.
3.5 Your private negotiating brief
Alongside the public proposal, the platform holds a negotiating brief for your side — what you want on each term, and what you will not accept. That record is yours alone: the other party never sees it, and it is never sent with the proposal. What they see are only your stated asks on the proposal itself (indicative capacity and term, party-coded contract fields, a seller price card when you are selling).
Two things readers often mix up:
- A target is what you would prefer; a walk-away (or private floor) is the line you will not cross. Both live on your brief (studio stage 7). They guide your own decisions; neither is disclosed — stage 8’s seller-eye preview never includes them.
- Some contract terms that look like floors or caps — a published price floor, a price cap on the offer — are sent when they are part of the commercial offer. Those are asks on the proposal, not private reservation prices on the brief.
The studio writes into the brief as you Accept / Adjust suggestions and set private limits. Walk-aways stay private; asks are what the other side can respond to.
3.5a Reviewing a proposal you received
When a proposal lands in your inbox as Pending, open the review studio (Procurement or Sales → the proposal → Review). One page, both directions: you reading a seller offer and you reading a buyer offer are the same stages with the roles swapped. Physical proposals use six stages; virtual proposals use five (asks and private limits share a stage).
Those working notes are a review draft —
private. You can try prices, cadences, and shortfall
settings without the sender seeing every half-formed number. Nothing you
stage is written to the shared proposal until you
Accept (which merges your side into the contract in one
step) or you deliberately choose to share my terms now
— an optional escape hatch when you want to show your hand early to
speed agreement. Autosave never touches the shared
virtual_terms / physical_terms while you are
still deciding.
If the proposal expires while you are still working on it, those notes are discarded. You will see a warning first, inside the last 20% of the sender’s validity window (§3.2) — especially on the Decide stage. Ask the sender to renew if you need more time; a renewal starts you fresh against the new window’s numbers. Declining is different — your notes are kept so a later re-propose can pick them up.
Reading order in the studio (physical):
| Stage | What you do |
|---|---|
| 1 · Their offer | Read their terms in full (not greyed-out inputs), their asks immediately, how long the offer stands |
| 2 · Gaps | Gap analysis vs your brief; when the other instrument is available and the difference is material, a one-line Physical/Virtual comparison (with volume basis) sits above the field table — silence when it is not |
| 3 · Your terms | Panel-beat your side; suggestions show provenance (their quote · a typical deal · carried from the other instrument) — carried values stay suggestions until you Accept |
| 4 · Your asks | Your joint asks vs theirs |
| 5 · Your limits | Private walk-aways — not sent |
| 6 · Decide | Accept, reject after panel-beating, or counter in the other instrument when available and material; time remaining + near-expiry warning |
Virtual review uses the same spine with two differences on stage 1, and asks + limits folded into one stage before Decide:
| Stage | What you do |
|---|---|
| 1 · Their offer | Disclosed terms read-only, their joint asks, the strike ladder when the seller originated, matched-area evidence, expiry — and both parties’ conditions-precedent checklist labelled as schedule risk (not a negotiable price term) |
| 2 · Gaps | Gap analysis via the CfD money model (§9); every displayed Rand saving shows its volume basis; same instrument comparison line as physical when the alternative is available and material |
| 3 · Your terms | Your receiving slice (e.g. cap, tariff category, REC Scope 2); provenance distinguishes their quoted strike, a typical deal, and carried from the other instrument |
| 4 · Your asks & limits | Joint asks vs theirs, plus private walk-aways |
| 5 · Decide | Accept, reject, or counter in the other instrument when available and material; digest guard as below |
On a virtual offer you can already see their strike, so stage 2 can
show your actual net cost on your load shape —
arithmetic, not a guess. Watch the seller’s min_offtake_pct
in performance terms: that is a buyer volume
obligation, easy to miss inside a joint embed.
3.5b Is this offer good enough?
Once you have a negotiating brief, the platform can run a gap analysis against what they actually offered. Per term it marks the offer:
- acceptable — at or better than your target, or inside the range you set;
- worth pushing back on — outside target but still inside your walk-away; or
- a dealbreaker — beyond your walk-away.
Where the gap is a price (c/kWh), you also get an annual Rand figure so “12c above target” becomes something like “R840k a year” — not an abstract delta. Non-price terms stay qualitative.
Instrument comparison (when it matters). Above the field table — never inside it — you may see one line such as “as a CfD this deal is R1.4m/yr better for you, on matched volume — see Instrument.” It appears only when the other instrument is available for the pair and the difference is material for you. Otherwise the line is simply absent (not a “no difference” banner). The volume basis is in the sentence. Compose still shows both verdicts even when the gap is small — there you asked the question; here you did not.
Two overrides matter:
- A dealbreaker is a warning. You can still accept with your eyes open — you acknowledge the field first.
- An impossible ask is not a warning. Wrong contract type for the plant, capacity above what is saleable, a term longer than remaining plant life, or a seller price below LCOE — those block accept. Acknowledgement does not clear them; the originator needs a feasible alternative (for example solar plants support AS_GENERATED / CAPPED / TOP, not BASELOAD).
3.5c The four exits
You do not have to walk the whole studio to say no.
- Reject outright — from stage 1, before any panel-beating. Wrong technology, wrong province, not interested. No private draft is required.
- Accept after panel-beating — Decide (physical stage 6 / virtual stage 5), once your receiving slice is ready, there are no unacknowledged dealbreakers or infeasibilities, and the digest still matches. Accept merges your staged terms and creates the PPA in one transaction.
- Reject after panel-beating — same decline as (1), optionally with structured findings (below).
- Counter in the other instrument — also on Decide; gate and disclosure are taught once in §3.5e.
Digest guard. If the other side changes their terms while you are reviewing, accept is blocked and the changed fields are named (old → new). Re-read them, acknowledge, then accept again — you cannot be signed up to a price you never saw.
The list modal still serves accepted / declined read-back, lineage links, and the originator’s sent phase; the review studio is the home for deciding. Counter with… lives only on Decide — one home for the action.
3.5d Declining well, and trying again
A decline need not be a dead end with a free-text apology. It can carry decline findings — which terms did not work and what would have — drawn from your negotiating target, never your private walk-away. You choose, field by field, what to share: dealbreakers are shared by default, merely negotiable points are held by default. If the plant simply cannot deliver what was asked (wrong shape for the technology, capacity above saleable, and so on), that finding is always shared — otherwise the next attempt fails the same way.
Re-propose
clones the declined (or expired) proposal into a fresh draft with both
parties’ captured slices intact. Nothing is retyped. The prior proposal
becomes SUPERSEDED and stays linked. Re-propose
inherits the renewal budget (renewed_count
/ max 3) — it does not reset it — so you cannot defeat the renewal cap
by cloning forever (§3.2).
Opening the compose studio on the new draft shows the prior findings as
a checklist of what to change — their value, what they would have
accepted, your current value, and your own brief target. An infeasible
shape finding also removes the impossible option from the contract-type
control so you cannot send the same impossible request twice.
Same-instrument negotiation still has no price counter-offer loop at proposal stage: each round is propose → review → accept-or-decline. Findings are how disagreement travels between rounds. Answering in the other instrument is different — see §3.5e.
3.5e Answering in the other instrument
A cross-instrument counter lets you answer a Pending proposal in the other instrument without refusing and starting from a blank sheet. Availability is §1.1; whether the difference is large enough to act on is the materiality threshold (same silence rule as Gaps — §3.5b). When both hold, Decide in the review studio offers Counter with an Eskom Virtual PPA or Counter with a Physical PPA. The list modal keeps lineage read-back only — it does not host the counter.
You say why the other instrument suits you — that
reason is disclosed before the counter is created. You
then compose a fresh draft of the other type (invisible until you send).
When you send it, the original becomes superseded and stays linked; both
remain readable. The counter carries shared facts where they mean the
same thing (capacity, term, start date, and similar); the price
cap (cap_price_ckwh) is never
carried — its meaning changes between instruments. The counter gets its
own expiry window but inherits the renewal budget (same
rule as re-propose).
Two limits, plainly:
- After two cross-instrument hops in the same chain, the platform stops you.
- Returning to an instrument already left behind in that chain is refused.
On the list, a superseded row links forward to the counter; opening the counter shows which prior proposal it replaces.
3.6 The footer, phase by phase
Your options depend on the phase — your role × the proposal’s state:
| Phase | You are | Buttons |
|---|---|---|
| compose (Draft, initiator) | still writing | In the studio: expiry + Send to seller; on the list modal: Withdraw |
| sent (Pending, initiator) | waiting | Withdraw (and your fields stay editable) |
| review (Pending, counterparty) | deciding | In the review studio: Reject (stage 1 or Decide) · Accept & create contract (Decide) · Counter with… the other instrument on Decide when available and material; list modal: Accept / Decline + lineage read-back (no Counter) |
| readonly (anything else) | looking | expiry control + Renew / Reactivate where applicable |
Accept is the big one: in a single transaction the
proposal becomes ACCEPTED, a PPA is created in
NEGOTIATING with its agreement reference
(PPPA-YYYYMM-… or VPPA-…), every captured term
is replayed onto it (including your merged staged slice), and — for
physical deals — the meter references are derived from the linked sites.
Both parties’ current negotiating briefs are
stamped with the new PPA id (superseded brief versions stay untouched;
missing briefs are skipped). Those limits follow you into the negotiation wizard as
owner-only chips — they are never shared with the counterparty. The
flash names the new contract, and the deal appears on
Negotiations for both parties.
Follow along. Seat: Off-taker A (
offtaker_a@webill.net) — the proposal state gallery. Path: Proposals. You should see one Pending sent to IPP 2 and one Pending received from IPP 2 (both with countdowns), your two Drafts, and one each of Declined, Expired, Withdrawn and Superseded — every state of §3.1 live on one screen.
Data. full_demo · seed 42 · stage S04 (lifecycle) · sealed 2026-07-15.
Device positions in a proposal
The price and risk stages can carry upside, volume-strike, availability and termination positions. Suggestions come from the private negotiation brief; an absent position supplies no invented recommendation. Accepted device positions survive brief regeneration and the proposal-to-contract handoff. Joint price-device terms still require counterpart agreement in negotiation.
4. The negotiation wizards
Accepting a proposal (from the review studio or the list modal) creates a contract in NEGOTIATING — a live PPA whose terms both parties now complete together. What arrives in the wizard already carries both parties’ captured terms: the originator’s disclosed slice plus the receiver’s merged staged side from review. The wizards are where the remaining joint and role-owned fields get finished.
4.1 The Negotiations screen
Negotiations (/org/deals/negotiations —
the Deals tab) is the home for every deal that has left
the proposal handshake (§3.1) and is
still being worked — from accept through AGREED (plus
DECLINED rows kept for history). Once a contract
becomes SIGNED or ACTIVE, it leaves
this list and appears only on Contracts. Physical
(PPPA-…) and virtual (VPPA-…) share the same
six negotiation statuses (enum-exact on
negotiation_status).
There are no stat cards — one line above the table says what the tab is for. The badge on the tab counts what needs you: term sheets still Negotiating (both sides work them) and Agreed sheets you have not signed yet. Columns: Agreement (reference, instrument pill, from proposal {ref}, topology), Parties, Where it stands (status, unseen counterparty changes, who has signed, Sign by {date}), Your next step (one primary button — Negotiate, Sign, Request / Accept revival — with secondary actions as plain links). What you can click is gated by status (table at the end of this section).
Search by site, party or agreement reference, and narrow by Status and Type. Your filters stay in the URL and survive reload. Clear filters restores the full register; the empty view offers the same recovery. On a phone, each agreement is a card and the wizard’s Go to section selector replaces the long step rail. The Negotiation guide link opens this chapter.
The screen is live per contract: if your counterparty saves a step while you’re looking at that deal, your fields refresh with a flash; if you’re elsewhere, the red change badge ticks up until you next open it.
Happy path
Created already in NEGOTIATING when a proposal is ACCEPTED — there is no separate contract draft. Signing ceremony and activation detail live in §5.
Exits and re-open
Re-open voids any signature already given, clears the agreement timestamp (sign window restarts on the next AGREED), and sends every joint term back to PENDING proposed by the reopener — the counterparty must re-approve. TERMINATED is the modelled end-state for an executed agreement (expiry, breach, mutual consent, force majeure).
What each status means
| Status | Plain meaning | How you get there | Wizard |
|---|---|---|---|
| NEGOTIATING | Both sides finishing terms; joint fields go through propose → approve. | Accept creates the PPA here; or Re-open from AGREED | Editable (role-owned + joint loop) |
| AGREED | Commercial sheet frozen; sign window open (10 days from lock). | Wizard Freeze terms when required terms are complete and no joint field is still awaiting approval | Signing / re-open — not free re-trading of limits |
| SUSPENDED | Sign window lapsed without both signatures. | Nightly job after day 10 | Request revival → counterparty Accept revival → back to AGREED with a fresh window |
| SIGNED | Buyer and seller signed the same content hash; deal waits for start. | Second matching signature (§5.2) | Not on Negotiations — Contracts register only (§6) |
| ACTIVE | start_date has arrived; wheeled / virtual settlement
can run. |
Daily activation job on SIGNED contracts whose start date is today or earlier | Not on Negotiations — Contracts register only (§6) |
| DECLINED | Either party walked away before signing. Optional reason on the badge. | Decline from NEGOTIATING | Read-only View |
| TERMINATED | An executed agreement has ended. | End-of-life path after SIGNED / ACTIVE | Not listed on Negotiations |
Proposal vs negotiation. Proposal statuses (§3.1) end at ACCEPTED. Negotiation statuses start at NEGOTIATING on that same accept. Declining a proposal never creates a PPA; declining a negotiation leaves a DECLINED contract row in Negotiations.
Action gates — who may change status
| Action | From status(es) | To status | Who | What it does |
|---|---|---|---|---|
| Accept proposal | Proposal PENDING | PPA NEGOTIATING | Proposal counterparty | Creates the physical or virtual contract; copies captured terms; stamps briefs onto the PPA. |
| Save wizard steps / approve joint terms | NEGOTIATING | (same) | Buyer or seller (natural role) | Edits terms; joint fields move PENDING ↔︎ APPROVED (§4.2). Does
not change negotiation_status. |
| Freeze terms (finalise) | NEGOTIATING | AGREED | Either party | Requires complete required terms + zero pending joint approvals.
Stamps agreed_at; opens the 10-day sign window. |
| Sign | AGREED | SIGNED (on 2nd match) | Buyer then seller (either order) | First signature waits; second advances only if both content hashes match (§5). |
| Re-open | AGREED | NEGOTIATING | Either party | Unlocks terms; voids signatures; re-pends joint fields; clears
agreed_at. |
| Decline negotiation | NEGOTIATING | DECLINED | Either party | Stops the deal; row stays visible, read-only. Not available once SIGNED or ACTIVE. |
| Activate | SIGNED (start_date ≤ today) |
ACTIVE | System (daily job) | Capacity / trader-portfolio / SCE checks may block activation until acknowledged or fixed. |
Not allowed. You cannot re-open from SIGNED or ACTIVE. You cannot Freeze terms while joint terms are still pending or required fields are missing (server mirrors the wizard gate). You cannot sign mismatched hashes — the ceremony forces a re-sign after terms change.
What the list shows you
| Status | You see on the row | You can |
|---|---|---|
| Negotiating (amber) | Red badge = counterparty’s unseen changes | Negotiate — open the wizard |
| Agreed (green) | Buyer signed / Seller signed · “Sign by {date}” | Sign if you have not signed · View agreement · Reopen terms… |
| Suspended (orange) | Sign window lapsed · revival requester if any | View · Request revival / Accept revival / Cancel request |
| Signed | — | Not listed — open under Contracts |
| Active | — | Not listed — open under Contracts |
| Declined | Reason on the badge | View |
4.2 How negotiation editing works
Every field in both wizards carries an ownership badge — BUYER (indigo), SELLER (amber), JOINT (emerald), DERIVED (slate) — and you always act as your natural role; there is no switching hats. Single-party fields are simply yours or theirs. Derived fields (meter references, grid facts, wheeling charges) are read-only for everyone.
Joint fields run a per-field approval loop (joint terms approval):
- You enter a value and Save the step → the field goes PENDING, proposed by you. It stays editable for you; your counterparty sees “Counterparty proposed — your approval needed.”
- They Approve → the field locks (APPROVED & locked), or Reject → the field opens for their counter-value, which re-pends toward you.
- Repeat until every joint term is approved.
The whole wizard is read-only once the contract is AGREED, SUSPENDED, DECLINED, SIGNED or ACTIVE. View agreement lets you read every saved section without reopening it or clearing signatures.
4.2a Save your draft before leaving
The status above the fields tells you All changes saved or Unsaved changes. Next and Back keep your draft while this window is open. Save each edited step; saving one step does not save changes on another step.
flowchart LR
A[Edit terms] --> B[Save each edited step]
B --> C[Review saved terms]
C --> D[Confirm freeze]
- Edit the fields you own and save each changed step.
- If you close with a draft, choose Keep editing to return or Discard and close to lose only unsaved changes. Previously saved terms remain in the agreement.
- Choose Freeze terms when all required terms and joint approvals are complete. Review the saved sections, then Confirm freeze. Return to editing cancels the review. If saved terms change before confirmation, review the latest version again.
4.3 Your targets in the wizard
The private negotiating
brief you built while proposing does not stop at accept. On accept
it is stamped onto the new PPA (physical_ppa_id or
virtual_ppa_id), and in the wizard only
you see target / walk-away chips beside joint
fields that still have a position on your brief. Your counterparty never
sees your chips (or yours theirs).
Reject on a joint field pre-fills the counter-value from your brief target — you can clear or overwrite it and type a manual value before you Save.
Approve past your own walk-away does not go through silently: the wizard names the field, the value you are about to lock, and your stated limit, and asks you to confirm. You may still approve — it is recorded as a conscious decision — or keep the field pending. Approving within your walk-away does not nag.
Physical — sellers. Approving shortfall joint terms while the contract’s annual penalty cap sits above the modelled margin from your brief evidence gets an extra interrupt. Buyers never see that warning.
Virtual — buyers. Approving a settlement volume basis of Generated when your brief’s matched fraction is low gets an interrupt: you will pay strike on volume you cannot use. Sellers never see that warning.
If the brief’s inputs have moved on (for example the book was re-forecast after the brief was written), the chips stay visible but are badged advice is stale — do not treat them as current; regenerate the brief when you can.
4.4 The physical wizard — core steps, optional Top-up and Termination
Ten core sections compose the physical PPA once a proposal is
accepted, followed by Termination (step 12).
Top-up (step 11) opens only when the buyer is an
offtaker (OFFTAKER_IPP / OFFTAKER_TRADER). A
trader buyer already carries top-up economics on its pool membership, so
that deal type skips step 11 and still reaches Termination. Party and
site links are already fixed from the proposal; the wizard finishes the
negotiable terms. Ownership badges match §4.2:
Buyer, Seller, Joint
(propose → approve), Derived (read-only for everyone).
§4.7
summarises what each family does at settlement; this section is
the field-by-field walk of the screen.
Stepper titles (exact UI labels): Parties & Sites · Connection & Network · Capacity & Allocation · Tariff & Pricing · Curtailment · Spill & Excess · Shortfall & Delivery · Metering & Settlement · RECs & Carbon · Wheeling Charges · Top-up (offtaker-buyer only) · Termination.
Which steps open. The list never renumbers. Contract type greys out steps that do not apply:
| Contract type | Spill & Excess (step 6) | Shortfall & Delivery (step 7) |
|---|---|---|
AS_GENERATED |
Skipped | Skipped |
CAPPED |
Open | Skipped |
TOP |
Skipped | Open |
FIRM / BASELOAD / SHAPED |
Open | Open |
Capacity & Allocation (step 3) is also skipped when the contract
type is AS_GENERATED (no capacity / volume / TOU fields to
agree). Forecast status and the SCE panel live on that step, so they
appear once the type needs volume terms. Contract type greys out steps
6/7 as the table above; deal type is the one thing that adds a
step — Top-up (step 11) only for an offtaker buyer. Every deal also
reaches Termination (step 12). Deal type also changes which tariff
structures are starred, which meter references exist, and which trader
terms completeness still demands (trader margins were captured in the
proposal phase).
Step 1 — Parties & Sites
Purpose. Orient both seats, then lock the delivery shape and the calendar of the deal. The buyer drives contract type; start date and term are joint.
Read-only header (derived from the accepted proposal — not editable here):
| Field | Ownership | What it means | Why it matters |
|---|---|---|---|
| Deal Type | Derived | Which commercial topology this is (e.g. IPP→Off-taker, Trader→Off-taker). | Sets which tariff structures the next pricing step will star as recommended. |
| Agreement | Derived | The permanent PPPA-… agreement reference. |
How you and ops will find this contract later. |
| Proposal · Originator / Counterparty | Derived | Who sent the proposal and who accepted it. | Clarifies proposal seats vs buyer/seller commercial roles. |
| Buyer / Seller cards | Derived | Organisation name and linked site or pool. | Confirms you are negotiating the right sites before you edit terms. |
Editable / joint fields:
| Field | Ownership | What it means | Why it matters | Example |
|---|---|---|---|---|
| Contract Type | Buyer | The delivery promise shape. Options are limited to shapes the seller supports. | Everything later prunes from this: which capacity fields open, whether spill/shortfall steps appear, how settlement matches energy. | Day-shift factory following solar → AS_GENERATED or
CAPPED; 24/7 process → FIRM /
BASELOAD; TOU-shaped delivery → SHAPED. |
| Start Date | Joint | First calendar day the deal can deliver / settle. | Anchors the sign window, activation, and escalation years. Both sides must approve. | 2026-09-01 after grid connection and deposit are
ready. |
| Term (Years) | Joint | How many years the commercial sheet runs from start. | Bound for volume planning and when you must renegotiate or renew. | 3 years for a first wheeled deal; longer once both
sides trust the plant. |
Contract-type options (plain meaning):
| Type | Layman’s meaning |
|---|---|
| AS_GENERATED | Buyer takes whatever the plant produces. Volume risk sits with the buyer. |
| FIRM | Seller guarantees a fixed delivery schedule. Shortfall remedies apply. |
| CAPPED | As-generated up to an annual MWh ceiling; above that follows spill/excess terms. |
| BASELOAD | Flat 24/7 delivery obligation (often via storage or portfolio balancing). |
| TOP | Take-or-pay: buyer commits to a minimum annual offtake or pays for the gap. |
| SHAPED | Delivery shaped across peak / standard / off-peak by an agreed percentage split. |
Step 2 — Connection & Network
Purpose. Surface the grid facts already on each site, and capture the buyer’s security-deposit status. Almost everything here is derived so you can see blockers early; only deposit (and sometimes CUOSA / grid status) is editable.
Generator grid connection (seller site):
| Field | Ownership | What it means | Why it matters | Example |
|---|---|---|---|---|
| CUOSA Reference | Derived or Seller | The seller’s Connection and Use-of-System Agreement reference with Eskom. | Without a CUOSA the plant cannot export onto the grid for wheeling.
If the generator site already has a reference, it is derived
(read-only). If it is missing and a seller generator is
linked, the seller can enter it here — the value is saved on
the GeneratorSite, not on the PPA. Trader-only sellers
(no generator site) stay derived (—). |
Seller fills CUOSA-ESKOM-2026-001 when the site record was never updated; thereafter it stays derived. |
| MEC (MW) | Derived | Maximum Export Capacity — hard MW ceiling the plant may inject. | Contracted capacity on step 3 must not exceed MEC. | Plant MEC 10 MW → do not agree 12 MW contracted. |
| Connection Voltage | Derived | Voltage at the generator’s connection (MV / HV / EHV), from the transformer ratio. | Confirms the network tier the deal rides. | MV connection for a mid-size solar plant. |
| Grid Status | Derived or Seller | Where the plant sits on the connection journey: Application submitted → Budget quote received → Connected → Operational. | Shows readiness to deliver. If the generator site already
has a status, it is derived (read-only). If it is
missing and a seller generator is linked, the seller can set it
here — the value is saved on the
GeneratorSite, not on the PPA. Trader-only sellers (no
generator site) stay derived (—). |
Seller fills OPERATIONAL when the site record was never updated; thereafter it stays derived. |
Buyer connection:
| Field | Ownership | What it means | Why it matters | Example |
|---|---|---|---|---|
| ESA Reference | Derived | The buyer’s Electricity Supply Agreement reference. | The ESA usually needs amendment so wheeled credits land on the right account. | Blank ESA → chase the site record before go-live. |
| Connection Voltage | Derived | Voltage at the buyer’s point of supply. | Physical wheeling expects MV (> 1 kV) or higher. | Municipal MV customer. |
| Municipality | Derived | Local authority supplying the buyer, when applicable. | Municipal buyers need an approved wheeling framework with that municipality. | City of Cape Town. |
| Security Deposit Status | Buyer | Whether Eskom’s wheeling security deposit is still pending, paid, or waived. | Energy cannot flow until it is Paid or Waived. | Buyer marks PAID after transferring the deposit. |
Step 3 — Capacity & Allocation
Purpose. Agree how much power / energy the deal
covers and for how long the volume picture holds. Mostly
joint commercial numbers; the seller owns forecast
readiness; the buyer owns TOU shape when the type is
SHAPED. Skipped for AS_GENERATED.
| Field | Ownership | Enabled when | What it means | Why it matters | Example |
|---|---|---|---|---|---|
| Contracted Capacity (MW) | Joint | FIRM, BASELOAD, SHAPED |
MW of plant capacity allocated to this buyer under the deal. | Caps how much of the plant this contract can claim; must stay ≤ MEC. | Agree 5 MW of a 10 MW plant. |
| Allocated Energy (MWh/yr) | Joint | BASELOAD, SHAPED |
Annual energy (MWh) committed for wheeling settlement. | Sets the yearly energy target those shapes settle against. | 12 000 MWh/yr for a data-centre block. |
| TOP Min Volume (MWh/yr) | Joint | FIRM, TOP |
Minimum annual offtake the buyer commits to under take-or-pay logic. | If the buyer uses less, they still pay for this floor. | Buyer accepts 8 000 MWh/yr minimum. |
| Capped Volume Limit (MWh/yr) | Joint | CAPPED only |
Maximum annual MWh the seller will deliver into this deal. | Above the cap, spill/excess terms decide what happens to the surplus. | Cap at 15 000 MWh/yr. |
| Forecast Status | Seller | Always on this step | Whether the three-year wheeled-energy forecast for Eskom planning is still pending, submitted, or not required. | Seller is responsible for forecast readiness before go-live. | Seller marks SUBMITTED after filing with Eskom. |
| TOU Allocation — Peak % / Standard % / Off-Peak % | Buyer | SHAPED only |
How contracted energy is split across Eskom TOU periods. Must total 100%. | Tells settlement when shaped energy is meant to land. | 40% peak / 35% standard / 25% off-peak for a day-shift factory. |
SCE acknowledgement (seller). When contracted volume sits above the plant’s safe contractable energy, the seller sees the SCE panel and must acknowledge the oversell before the deal can proceed honestly — the V3 capacity guard, not a buyer field.
Step 4 — Tariff & Pricing
Purpose. Seller puts the price offer on the table; buyer sets protection ceilings where the structure allows; both approve how price grows over time. Which numeric fields unlock depends on Tariff Type.
| Field | Ownership | Enabled when | What it means | Why it matters | Example |
|---|---|---|---|---|---|
| Tariff Type | Seller | Always | The pricing structure for energy under this PPA. Recommended options for your deal type are starred (★) with a green highlight. | Chooses which of the fields below matter and how settlement will price each interval. | IPP→Off-taker often stars FIXED /
ESCALATED / INDEXED; trader buyers often see
MARKET_LINKED / FLOOR_CAP. |
| Energy Price (c/kWh) | Seller | Always | Base energy rate in cents per kilowatt-hour. | Primary price component for every structure. | 95 c/kWh opening offer. |
| Capacity Charge (R/MW/month) | Seller | TWO_PART |
Fixed monthly Rand charge per MW of contracted capacity. | Pays the seller’s fixed costs even when dispatch is low. | R 45 000 /MW/month. |
| Floor Price (c/kWh) | Seller | FLOOR_CAP |
Lowest price the seller will accept when price floats. | Protects seller revenue in a banded tariff. | Floor 80 c/kWh. |
| Cap Price (c/kWh) | Buyer | CAPPED, FLOOR_CAP |
Highest energy price the buyer will pay. | Buyer’s runaway-cost shield. | Cap 128 c/kWh vs ~140 c grid all-in. |
| Price Ceiling (c/kWh) | Buyer | TWO_PART |
Absolute upper bound on the energy component of a two-part tariff (even after escalation). | Stops the energy leg from drifting above what the buyer can afford. | Ceiling 110 c/kWh. |
| Escalation Mechanism | Joint | Not for flat FIXED |
How the energy price adjusts each year: fixed (no change), CPI, CPI-minus, fixed %, or external index. | Both sides must agree how bills grow. | CPI tracking inflation; or FIXED_PCT at a
negotiated rate. |
| Escalation Rate (%) | Joint | Mechanism = FIXED_PCT |
Annual percentage uplift when you chose a fixed-% mechanism. | The number that actually compounds the price. | 3.5% per year. |
| TOU Multipliers — Peak / Standard / Off-Peak | Seller | TOU_LINKED |
Multipliers applied to the base energy price by TOU period (peak usually highest). | Shapes when the seller earns more within the day. | Peak 1.4, standard 1.0, off-peak 0.7. |
Tariff-type cheat-sheet:
| Type | Plain meaning |
|---|---|
| FIXED | Single flat c/kWh for the full term — no escalation fields. |
| ESCALATED | Starts at energy price, then rises each year per the mechanism. |
| INDEXED | Tracks an external index (e.g. Megaflex / NERSA benchmark). |
| TOU_LINKED | Base × TOU multipliers. |
| TWO_PART | Energy c/kWh + capacity R/MW/month; buyer may set a price ceiling. |
| CAPPED | Formula/index price with a buyer cap. |
| FLOOR_CAP | Floats between seller floor and buyer cap. |
| MARKET_LINKED | Tied to a wholesale market reference. |
| TAKE_OR_PAY | Flat rate with a minimum volume commitment. |
| PAY_AS_GENERATED | Pay only for metered delivery — no minimum volume. |
Step 5 — Curtailment
Purpose. Decide who pays when energy is ready but not delivered — because the grid operator said stop, because the buyer could not take it, or because the seller caused the stop. Joint fields need both parties’ approval; buyer- and seller-caused remedies are role-owned.
| Field | Ownership | What it means | Why it matters | Example |
|---|---|---|---|---|
| Grid Operator Curtailment | Joint | Who bears lost energy when the system operator curtails: Shared, Seller risk, Buyer risk, or Deemed always. | Core shared risk clause for network/system events. | SHARED with annual caps; or DEEMED_ALWAYS if the buyer will pay as if delivered. |
| Buyer-Caused Curtailment | Buyer | Remedy when the buyer cannot take energy: Deemed (buyer still pays), Makeup (accept later energy), Rebate, or None. | Seller needs certainty when the buyer’s site is offline. | Rare shutdowns → DEEMED; frequent planned outages → MAKEUP. |
| Seller-Caused Curtailment | Seller | Remedy when the seller causes the stop: None, Replacement energy, Capacity reduction, or Credit. | Buyer protection when the plant under-performs for seller reasons. | REPLACEMENT at seller cost; or CREDIT for undelivered MWh. |
| Network Constraint Risk | Joint (read-only default) | Who bears curtailment from network constraints specifically. | Shown for transparency; currently a fixed platform default (not editable in the wizard). | Displayed value — both sides see the same default. |
| Annual Hours Cap | Joint | Max hours/year of grid-operator curtailment allowed under SHARED before the exceedance remedy kicks in. | Enabled only when grid allocation is SHARED. | Cap at 100 hours/year. |
| Annual Volume Cap (%) | Joint | Max % of annual contracted energy that may be curtailed under SHARED before exceedance. | Same SHARED gate as hours. | 5% of annual contracted energy. |
| Cap Exceedance Remedy | Joint | What happens if SHARED caps are breached: Deemed, Reprice, Terminate, or Negotiate. | SHARED path only. | DEEMED delivery above the cap. |
| Deemed Energy Method | Seller (read-only default) | How “would-have-been-generated” energy is calculated when curtailment is deemed delivered. | Shown read-only today (platform default). | Resource power curve / historical average / contracted profile / independent. |
| Makeup Window (months) | Joint | Months within which makeup energy must be delivered. | Opens under SHARED, or when buyer chose MAKEUP, or seller chose REPLACEMENT. | 3 months to deliver makeup. |
| Planned Notice (days) | Joint (read-only default) | Minimum advance notice for planned curtailment / maintenance. | Fixed default in the current wizard. | e.g. 14 days (display). |
| Emergency Confirm (hours) | Joint (read-only default) | Hours within which an emergency curtailment must be confirmed to the other party. | Fixed default. | e.g. 24 hours (display). |
| Force Majeure Treatment | Joint (read-only default) | How FM events are treated: Excused, Insurance, or Shared. | Fixed default. | Obligations suspended / insurance / shared loss. |
| FM Termination (days) | Joint (read-only default) | After this many continuous FM days, either party may terminate. | Fixed default. | e.g. 180 days (display). |
| FM Status Updates (days) | Joint (read-only default) | How often the affected party must update the other during FM. | Fixed default. | e.g. every 7 days (display). |
Grid-operator choices in plain words: SHARED — both absorb a portion; SELLER_RISK — seller bears the cost; BUYER_RISK — buyer pays for curtailed energy; DEEMED_ALWAYS — treat as delivered and bill at contract rate.
Step 6 — Spill & Excess
Purpose. What happens when the plant (or the deal)
produces more than the buyer takes, and what the buyer owes
when they take less. Open only for CAPPED /
BASELOAD / FIRM / SHAPED. Seller
owns disposal of surplus generation; buyer owns under-consumption;
banking is joint.
| Field | Ownership | What it means | Why it matters | Example |
|---|---|---|---|---|
| Spill Treatment | Seller | What happens to unmatched surplus generation: Forfeited, Banked, Eskom buyback, Third party, or Discounted credit. | Seller’s main lever for surplus electrons. | Bank surplus into later months; or sell via Eskom buyback. |
| Spill Credit (%) | Joint | Percentage credit applied when spill is settled as a discounted credit. | Shared commercial value of spilled energy. | 70% of contract rate as spill credit. |
| Excess Allowed | Joint | Whether generation above the deal envelope is allowed: Yes, No, or Buyer option. | Gates whether excess disposal rules matter. | YES with a disposal method agreed below. |
| Excess Disposal Method | Seller | How allowed excess is handled: Retained, Spot market, Buyer discount, Curtailed, or counted toward ToP. | Seller decides the disposal path once excess is allowed. | BUYER_DISCOUNT for surplus the buyer can still use. |
| Excess Discount (%) | Joint | Discount % when excess is sold to the buyer at a reduced rate. | Shared price for that surplus tranche. | 20% off contract rate. |
| Eskom Buyback Status | Seller | Whether an Eskom buyback path is None, Active, or Pending. | Seller’s route for surplus into the utility. | ACTIVE once the buyback agreement is live. |
| Banking Enabled | Joint | Whether surplus can be carried forward as a banking credit. | Turns the banking ledger on or off for this PPA. | Yes for seasonal load. |
| Banking Period | Joint | How often the banking bucket resets or rolls: Monthly, Quarterly, Annual, Rolling-12. | Cadence of bank credits. | QUARTERLY. |
| Banking Cap (%) | Joint | Maximum banked energy as a % of contracted volume. | Stops unlimited carry-forward. | Cap banking at 10%. |
| Banking Expiry | Joint | What happens to unused bank: Use-or-lose, Roll-decay, or Never. | Shared rule for stale credits. | USE_OR_LOSE at period end. |
| Inter-TOU Banking | Joint | Whether banked energy can move across TOU periods: Not allowed, Within season, Across seasons. | Important when peak and off-peak have different value. | WITHIN_SEASON only. |
| Under-Consumption | Buyer | What the buyer owes when they use less than nominated / committed energy: No penalty, ToP applies, Demand charge, or Makeup obligation. | Buyer’s downside when load drops. | Flexible load → NO_PENALTY; defend ToP → TOP_APPLIES. |
Step 7 — Shortfall & Delivery
Purpose. Performance warranty when the seller
promised firm or shaped delivery. Open only for FIRM /
TOP / BASELOAD / SHAPED. Seller
supplies plant commitments and caps; buyer sets compensation and
reporting; several framework fields are joint.
| Field | Ownership | What it means | Why it matters | Example |
|---|---|---|---|---|
| Shortfall Type | Joint | What “missed” means: Capacity, Volume, or Delivery. | Defines the yardstick settlement uses. | VOLUME shortfall vs annual MWh. |
| Measurement Interval | Joint | How often shortfall is measured: Monthly TOU, Monthly aggregate, Quarterly, Annual. | Cadence of performance checks. | MONTHLY_TOU. |
| Guaranteed Availability (%) | Seller | Availability % the seller warrants. | Core seller performance promise. | 97%. |
| Deadband (%) | Seller | Small miss that does not trigger a remedy. | Avoids penalties for noise. | 2% deadband. |
| Annual Degradation (%) | Seller | Allowed year-on-year performance fade (e.g. panels). | Honest long-term warranty slope. | 0.5%/year. |
| Yield Benchmark | Joint | Probability benchmark the guarantee is measured against: P50 / P75 / P90. | Shared “how conservative” the yield target is. | P50 for a balanced ask; P90 is stricter on the seller. |
| Compensation Method | Buyer | How the buyer is made whole: Capacity reduction, Liquidated damages, Replacement energy, or Penalty premium. | Buyer’s preferred remedy form. | Cash → LIQUIDATED_DAMAGES; need electrons → REPLACEMENT_ENERGY. |
| Penalty Rate (%) | Joint | Rate applied when a penalty path is used. | Shared sting of under-delivery. | 10% of shortfall value. |
| Annual Penalty Cap (%) | Seller | Max penalties in a year as % of contract value. | Seller’s yearly liability ceiling — approving joint shortfall terms above your brief’s modelled margin triggers an extra interrupt (§4.3). | Cap at 20% of annual contract value. |
| Lifetime Penalty Cap (%) | Seller | Max penalties over the whole term. | Seller’s lifetime liability ceiling. | Cap at 50% of lifetime contract value. |
| Surplus Banking | Joint | Whether surplus periods can offset later shortfalls: None, Quarterly, Annual. | Softens shortfall with earlier surplus. | ANNUAL netting. |
| Cure Period (months) | Seller | Months the seller has to cure a shortfall before harder remedies. | Seller breathing room. | 2 months. |
| Reporting | Buyer | How performance is reported: Monthly self-report, Monthly / Quarterly / Annual independent engineer. | Buyer’s audit comfort. | MONTHLY_IE for a large firm block. |
Excused events (yes/no toggles — when true, that cause does not count as a shortfall):
| Field | Ownership | What it means |
|---|---|---|
| Force Majeure | Joint | FM events excused from shortfall maths. |
| Grid Curtailment | Joint | System-operator curtailment excused. |
| Buyer Curtailment | Buyer | Buyer’s own curtailment excused (usually yes if buyer-caused has its own remedy). |
| Scheduled Maint | Seller | Planned maintenance windows excused. |
| Network Constraints | Joint | Network constraint events excused. |
| Extreme Weather | Seller | Extreme weather excused from the warranty. |
Step 8 — Metering & Settlement
Purpose. Confirm which meters settlement will read, how often you reconcile money and energy, and how the seller nominates delivery. Meter references are derived from linked sites; cadence is joint; nomination is seller-owned.
| Field | Ownership | What it means | Why it matters | Example |
|---|---|---|---|---|
| Generation Meter Ref | Derived | Eskom-registered meter device number at the generator point of connection. | Measures energy injected for wheeling settlement. Blank when there is no linked IPP generator (e.g. some trader sellers). | Device number from the generator site meter. |
| Consumption Meter Ref | Derived | Eskom-registered meter at the buyer’s point of supply. | Measures consumption and reconciles wheeling credits. Blank when there is no linked off-taker site. | Device number from the off-taker site meter. |
| Settlement Frequency | Joint | How often wheeled energy is reconciled and invoiced: Daily, Weekly, Bi-monthly, Monthly, Quarterly. Once the Generator Site has an AGREED contract, this cadence is locked for every later deal sourcing from that plant (physical or virtual) so shared-meter allocation can conserve energy — V8 §1.1. | Faster settlement reduces cash-flow surprise; both sides must approve. | MONTHLY for most wheeled PPAs (or the site lock, if one already exists). |
| Nomination Type | Seller | Whether the generator nominates a single buyer or multiple buyers for wheeled energy. | Multiple nominations split generation across several offtakers. | SINGLE for a dedicated offtaker deal. |
Step 9 — RECs & Carbon
Purpose. Whether environmental attributes travel with the energy, on which registry, how the buyer accounts for Scope 2, and which carbon methodology the seller uses. Enable flags and bundling are joint; registry and carbon method are seller; Scope 2 is buyer.
| Field | Ownership | What it means | Why it matters | Example |
|---|---|---|---|---|
| RECs Enabled | Joint | Whether Renewable Energy Certificates are issued for energy under this PPA. | Needed for market-based Scope 2 claims. | On for a corporate RE100 buyer. |
| Carbon Credits Enabled | Joint | Whether carbon emission reductions are quantified and credited to the buyer. | Separate from RECs — turn on only if the deal includes carbon. | On when the buyer wants carbon lines on the statement. |
| REC Registry | Seller | Where certificates are issued: ZaRECs (SANEDI), I-REC, or Blockchain. | Seller supplies the registry path. | ZARECS for domestic reporting; I_REC for global Scope 2. |
| Scope 2 Method | Buyer | Market-based (contractual instruments / RECs) vs Location-based (grid average). | Buyer’s GHG accounting choice — market-based needs RECs. | Corporate programme → MARKET; no certificate path → LOCATION. |
| REC Bundling | Joint | Bundled (RECs travel with the energy) vs Unbundled (RECs sold or retained separately). | Who ends up holding the green claim. | BUNDLED for a standard corporate PPA. |
| REC price (R/certificate) | Joint | Optional contract price per REC. Distinct from the estimated-grade reference price on the Certificate Desk. | Required when bundling is UNBUNDLED and you set a price — completeness will not let you Freeze terms with a zero. | R 35 per certificate. |
| Non-double-counting warranty | Seller | Seller warrants these certificates are not counted elsewhere. | The checkable report lives in V19 §08. | On for a corporate claim. |
| Carbon Methodology | Seller | How tCO₂ is calculated: Grid average, Build margin, or Combined margin. | Seller’s carbon accounting method when carbon is enabled. | GRID_AVG for a simple annual factor. |
| Credit ownership | Joint | Who owns tradable credits if a registered offset project exists. Default BUYER. | Only bites when V19 §14 applies. | BUYER unless the IPP is keeping credits. |
| Offset price (R/tCO₂e) | Joint | Optional contract price per tonne. Never confused with the
estimated-grade CertificatePrice. |
Required when carbon is enabled and a price is set. | R 180 / tCO₂e. |
Step 10 — Wheeling Charges
Purpose. Show which network loss factors and use-of-system charges apply to this deal’s path. Everything is derived — nothing is editable here. Applicability was decided from the proposal’s network path and imported into the PPA on accept; rates come from tariff data and may still be blank until priced.
Loss factors (only items marked applicable are shown):
| Field | Ownership | What it means |
|---|---|---|
| DLF | Derived | Distribution Loss Factor — energy wheeled on Eskom distribution. |
| TLF | Derived | Transmission Loss Factor — energy wheeled on transmission. |
| MLF | Derived | Municipal Loss Factor — energy wheeled on a municipal network. |
Use-of-system charges (same rule — applicable only):
| Field | Ownership | What it means |
|---|---|---|
| TUOS | Derived | Transmission Use of System. |
| eTUOS | Derived | Embedded Transmission Use of System (transmission charges passed through to the distributor). |
| DUOS | Derived | Distribution Use of System. |
| MDUOS | Derived | Municipal Distribution Use of System. |
If none apply, the step says so plainly — typical for a trader-to-trader deal or sites with no physical wheeling path (“No wheeling charges apply”).
Step 11 — Top-up
Purpose. Name the contract behind shortfall energy:
who supplies it, at what price, under what monthly cap. The step is
Buyer owned and read-only once the deal leaves
NEGOTIATING. It does not appear for a trader-buyer deal —
that seat edits the same fields on the pool membership form next to
Shortfall top-up.
A monthly cap without a source is refused, and a trader-pool source without a named pool is refused. Both surfaces share those messages.
| Field | Ownership | What it means | Why it matters |
|---|---|---|---|
| Source | Buyer | ESKOM_RETAIL · TRADER_POOL ·
MARKET_ORDER, or blank. |
Blank keeps today’s valuation-only shortfall
(eskom_topup_ckwh). A named source is the contract the
sourcing hook acts on. |
| Price basis | Buyer | FIXED · INDEXED · POOL_RATE.
Required unless source is MARKET_ORDER. |
A market order’s price is whatever IdmDecision computes
at the moment of sourcing, never a term-level sticker. |
| Fixed rate (c/kWh) | Buyer | Optional override. Blank defers to resolve_topup
(membership → book default). |
The Eskom-retail booking and a carried market-order shortfall use this rate. |
| Draw-from pool | Buyer | Required when source is TRADER_POOL — a supply pool on
the same book. |
The allocator draws that pool’s leftover hourly supply, tagged
[:top_up_draw]. |
| Monthly cap (kWh) | Buyer | Nil is uncapped. | Once the month-to-date sourced volume hits the cap, further shortfall that month reverts to valuation-only. |
| Notice (days) | Buyer | Nil is immediate. | Desk judgement, not a regulated figure. |
| Tolerance (kWh) | Buyer | Per-hour shortfall at or below which sourcing does nothing. Nil sources from the first kWh. | Stops the hook firing on rounding noise. |
What each source does once the deal is active (settlement detail in V8 §7.2.1):
| Source | What happens on a real (ACTUAL /
NOMINATED) shortfall |
|---|---|
| Eskom retail | The :SHORTFALL line is still priced as today.
Settlement posts a :replacement_energy pair labelled
Replacement energy — Eskom retail, carrying the term. |
| Trader pool draw | The named pool’s leftover supply is matched through the ordinary
merit order. Energy that moves is an :ALLOCATION tagged
[:top_up_draw]; whatever the pool cannot cover stays
:SHORTFALL. |
| Market order | The shortfall is a priced candidate through the same
IdmDecision every other intraday deviation uses. A
:redeclare is folded into the existing IDM action list
(tagged with the term). A :carry is booked as Eskom-retail
replacement energy. Forecast and simulation runs never source. |
The membership form on Strategy → Pools carries the same fields next
to Shortfall top-up, so a demand member that is not on
a physical PPA can still name a term. eskom_topup_ckwh
itself is unchanged — a member with no TopUpTerm prices
shortfall exactly as it did before this step existed.
4.5 The virtual wizard — ten different steps
Ten steps compose the virtual PPA (CfD / Virtual Wheeling) once a proposal is accepted. Sites and deal type are already fixed; the wizard finishes the negotiable money, readiness, and legal terms. Ownership badges match §4.2: Buyer, Seller, Joint (propose → approve), Derived (read-only). Chapter §4.7 and §9 explain why the CfD and matching matter; this section is the field-by-field walk of the screen.
Stepper titles (exact UI labels): Parties & Sites · Eskom Registration · Capacity & Term · Tariff & Pricing · Generator Obligations · Metering & Settlement · RECs & Carbon · Legal Terms · Wheeling Charges · Review & Submit.
Unlike the physical wizard, every step stays open — there is no contract-type pruning. Deal type still changes who must fill the buyer’s Eskom tariff category (an off-taker buyer has one; a pure trader buyer may not).
Step 1 — Parties & Sites
Purpose. Orient both seats before you edit money terms. Everything on this step is derived from the accepted proposal — nothing is editable here.
| Field | Ownership | What it means | Why it matters |
|---|---|---|---|
| Buyer card | Derived | Buyer organisation name and linked site or trader pool. | Confirms you are negotiating the right consumer side. |
| Seller card | Derived | Seller organisation name and linked generator or trader pool. | Confirms the plant / book behind the CfD. |
| Deal Type | Derived | Commercial topology (e.g. Off-taker↔︎IPP, Off-taker↔︎Trader). | Sets which later completeness rules apply. |
| Agreement | Derived | Permanent VPPA-… agreement reference. |
How you and ops find this contract later. |
The blue info strip reminds both sides: this is a contract for difference settled through Eskom’s Virtual Wheeling Platform — each party stays independently connected to the grid; electrons are not re-routed to the buyer.
Step 2 — Eskom Registration
Purpose. Capture the six conditions precedent (CPs) — paperwork and registrations that must be true before the virtual deal can activate. Ticking a box here means “we assert this is in place (or will be before go-live).” CPs are recorded at negotiation; they are discharged before activation, not before Freeze terms / AGREED (§4.6).
Each field is Yes / No (true / false).
Prefill often comes from facts already on the site or proposal;
re-asking for something already on file is a defect, not diligence (§9.7).
| Field | Ownership | What it means | Why it matters | Example |
|---|---|---|---|---|
| Grid Connection Agreement | Seller | Seller has a valid grid connection / use-of-system path for the plant. | Without connection, there is nothing to register for virtual wheeling. | Seller marks Yes once the CUOSA / connection agreement is signed. |
| VWA Registration | Joint | Both sides’ Virtual Wheeling Agreement registration with Eskom is done (or accepted as a shared gate). | The most common critical-path item — start dates that precede VWA clearance are a frequent avoidable error. | Both approve Yes when Eskom confirms VWA registration. |
| NERSA Licence | Seller | Required generation / trading licence is in place where the law needs one. | Blocks go-live if the seller is not legally cleared to sell. | IPP marks Yes with an active NERSA generation licence. |
| Smart Metering | Seller | Interval / smart meters needed for VWP settlement are installed and readable. | Virtual settlement needs trustworthy half-hour (or better) data. | Seller marks Yes after AMI / smart meters are commissioned. |
| Insurance Certificates | Seller | Required insurance certificates exist for the plant / deal. | Lender and buyer comfort before activation. | Seller marks Yes when brokers issue the pack. |
| Environmental Auth | Seller | Environmental authorisation for the plant is in place. | Compliance gate for many generation sites. | Seller marks Yes with a current EA on file. |
Step 3 — Capacity & Term
Purpose. Agree how large the hedge is and how long it runs. All three fields are joint — either side proposes; the other must approve.
| Field | Ownership | What it means | Why it matters | Example |
|---|---|---|---|---|
| Contracted Capacity (MW) | Joint | MW of plant (or book) capacity allocated to this virtual deal. | Sizes the energy the CfD can cover; should fit the buyer’s load and matching story. | Agree 5 MW of a 10 MW solar plant for a daytime factory. |
| Start Date | Joint | First calendar day the CfD / VWA can settle. | Anchors activation and escalation years. Prefer a date after critical CPs (especially VWA). | 2026-10-01 once VWA registration is expected
clear. |
| Term (Years) | Joint | How many years the commercial sheet runs from start. | Bound for planning and when you must renew or renegotiate. | 10 years for a corporate hedge; shorter for a first pilot. |
Step 4 — Tariff & Pricing
Purpose. Set the strike — the price the CfD settles against — plus how it grows, floor/cap protection, the buyer’s retail tariff category (feeds the Gen-Wheeling / WER credit), and settlement volume basis (matched vs generated). Seller owns the strike structure and rates; buyer owns the cap and tariff category; escalation and volume basis are joint.
Recipient sellers. If you received the proposal without composing it in Proposal Studio, an amber banner offers Suggest / Why? on the seller rate fields (flat, TOU peak/standard/off-peak, floor). Accept or adjust before you lock your side — same idea as studio advice, inside the wizard.
| Field | Ownership | Enabled / used when | What it means | Why it matters | Example |
|---|---|---|---|---|---|
| Strike Price Structure | Seller | Always | FLAT (one rate) or TOU (peak / standard / off-peak rates). | Chooses which strike numbers matter. TOU often lines up better with TOU Gen-Wheeling credits. | Daytime solar deal → TOU; simple hedge → FLAT. |
| Flat Strike Price (c/kWh) | Seller | Structure = FLAT (still shown; required for FLAT) | Single strike in cents per kWh for every interval. | The number the CfD compares to the credit / reference. | Flat 95 c/kWh. |
| TOU Peak (c/kWh) | Seller | Structure = TOU | Strike in peak hours. | Usually highest — matches expensive peak credits / retail. | Peak 110 c/kWh. |
| TOU Standard (c/kWh) | Seller | Structure = TOU | Strike in standard hours. | Mid band of the day. | Standard 90 c/kWh. |
| TOU Off-Peak (c/kWh) | Seller | Structure = TOU | Strike in off-peak hours. | Usually lowest. | Off-peak 70 c/kWh. |
| Escalation Mechanism | Joint | Always | How the strike adjusts each year: fixed (no change), CPI, CPI-minus, fixed %, or external index. | Both sides must agree how the hedge price grows. | CPI to track inflation; or FIXED for a flat term. |
| Escalation Rate (%) | Joint | Mechanism needs a rate (e.g. FIXED_PCT) | Annual percentage uplift when you chose a fixed-% path. | The number that compounds the strike. | 3.5% per year. |
| Floor Price (c/kWh) | Seller | Optional protection | Lowest strike the seller will live with when price floats or is reviewed. | Seller’s downside shield (often mirrors a private walk-away). | Floor 80 c/kWh. |
| Cap Price (c/kWh) | Buyer | Optional protection | Highest strike the buyer will pay. | Buyer’s runaway-cost shield — often sized under break-even
retail + WER − VWP fee. |
Cap 128 c/kWh. |
| Buyer Eskom Tariff Category | Buyer | Required when the buyer is an off-taker with an Eskom account | Which Eskom retail tariff the buyer sits on (Megaflex, Miniflex, Ruraflex, Nightsave Urban/Rural, Megaflex Gen, Municipal). | Drives the Gen-Wheeling credit rates the WER uses. Wrong category → wrong refund maths. | Factory on MEGAFLEX. |
| Settlement volume basis | Joint | Always | MATCHED or GENERATED — what MWh the CfD multiplies. | The most consequential virtual commercial choice (§4.7, §9.2). | Daytime load under solar → prefer MATCHED so the buyer does not pay strike on night spill. |
Settlement volume basis in plain words:
| Choice | Who carries mismatch risk | Plain meaning |
|---|---|---|
| MATCHED | Seller | CfD only on the hour-by-hour overlap of generation and consumption. Unmatched generation has no CfD. |
| GENERATED | Buyer | CfD on (essentially) all plant output under the deal. Buyer may pay strike on kWh that earn no WER credit. |
Escalation cheat-sheet:
| Mechanism | Plain meaning |
|---|---|
| FIXED | Strike stays put for the term. |
| CPI | Tracks consumer inflation. |
| CPI_MINUS | CPI less an agreed margin. |
| FIXED_PCT | Grows by the escalation rate % each year. |
| INDEXED | Tracks an agreed external index. |
Step 5 — Generator Obligations
Purpose. Performance promises, what happens if the plant under-delivers, who bears curtailment risk, buyer offtake discipline, and insurance. Three blocks on one step: Performance Terms, Curtailment, Insurance.
Performance Terms
| Field | Ownership | What it means | Why it matters | Example |
|---|---|---|---|---|
| Guaranteed Annual Yield (MWh) | Seller | Annual MWh the seller warrants the plant will produce for this deal. | Core volume promise. Under GENERATED settlement, a high guarantee can raise the buyer’s unmatched exposure — choose deliberately (§9.7). | Guarantee 12 000 MWh/yr. |
| Yield Benchmark | Seller | Probability benchmark the yield is measured against: P50 / P75 / P90. | How conservative the promise is. P90 is harder on the seller. | P50 for a balanced ask. |
| Availability Warranty (%) | Seller | % of time the plant must be available to generate. | Separate from yield — covers downtime. | 97%. |
| Annual Degradation (%) | Seller | Allowed year-on-year fade (e.g. panels). | Honest long-term slope so year-10 is not judged like year-1. | 0.5%/year. |
| Underperformance Remedy | Joint | What happens if the seller misses: Liquidated damages, Make-good energy, Price adjustment, or None. | Shared remedy shape when the warranty fails. | Cash → LIQUIDATED_DAMAGES; need MWh → MAKE_GOOD. |
| LD Rate (c/kWh) | Joint | Liquidated-damages rate per shortfall kWh when LDs apply. | Shared sting of under-delivery. | 15 c/kWh on shortfall. |
| Min Offtake (%) | Buyer | Minimum share of contracted / available energy the buyer commits to take (or settle) under offtake discipline. | Buyer’s volume commitment on their side of the hedge. | Buyer accepts 80% minimum offtake. |
| Offtake Shortfall Penalty (c/kWh) | Joint | Penalty rate when the buyer misses the minimum offtake. | Shared price of buyer under-consumption. | 10 c/kWh on the shortfall. |
Underperformance remedies in plain words: LIQUIDATED_DAMAGES — cash per missed unit; MAKE_GOOD — deliver the missing energy later; PRICE_ADJUSTMENT — reprice the deal; NONE — no contractual remedy beyond the other terms.
Curtailment
| Field | Ownership | What it means | Why it matters | Example |
|---|---|---|---|---|
| Curtailment Risk Allocation | Joint | Who bears lost production when the plant is curtailed: Seller, Buyer, Shared, or Eskom. | Simpler than the physical wizard’s multi-cause block — one shared allocation for the virtual CfD. | SHARED; or ESKOM when utility-caused stoppages sit with the utility path. |
| Deemed Energy Cap (hours/yr) | Joint | Max hours/year of “deemed” (treated-as-generated) energy under the curtailment rules. | Caps how much fictional generation can enter settlement. | Cap at 100 hours/year. |
Insurance
| Field | Ownership | What it means | Why it matters | Example |
|---|---|---|---|---|
| All-Risk Property | Seller | Whether all-risk property cover is required / in place. | Plant asset protection. | Seller selects Yes. |
| Business Interruption | Seller | Whether BI cover is required / in place. | Revenue protection if the plant is down. | Yes for a financed plant. |
| Public Liability | Seller | Whether public liability cover is required / in place. | Third-party damage protection. | Yes. |
| Professional Indemnity | Seller | Whether PI cover is required / in place. | Advice / professional-risk cover where relevant. | Yes if the deal structure needs it; else No. |
| Min Coverage (R million) | Joint | Minimum Rand cover (millions) the parties agree must be held. | Shared floor on insurance size. | R 50 million. |
Step 6 — Metering & Settlement
Purpose. Choose who runs the Virtual Wheeling Platform service path and how often money and energy settle. Both fields are joint.
| Field | Ownership | What it means | Why it matters | Example |
|---|---|---|---|---|
| VWP Vendor | Joint | Platform / vendor path for virtual wheeling data and settlement: Mezzanine, Enerweb, or Other. | Tells ops which VWP stack this deal rides. | MEZZANINE for the standard Eskom VWP path in the demo. |
| Settlement Frequency | Joint | How often the CfD is calculated and invoiced: Monthly, Weekly, or Daily. Same Generator Site lock as physical — a later virtual deal cannot pick a different cadence from an earlier AGREED contract on that plant (V8 §1.1). | Faster settlement reduces cash-flow surprise; both sides must approve. | MONTHLY for most corporate hedges (or the site lock, if one already exists). |
Step 7 — RECs & Carbon
Purpose. Whether environmental attributes travel with the hedge, on which registry, how the buyer accounts for Scope 2, and which carbon methodology the seller uses. Enable flags are joint; registry and carbon method are seller; Scope 2 is buyer.
| Field | Ownership | What it means | Why it matters | Example |
|---|---|---|---|---|
| RECs Enabled | Joint | Whether Renewable Energy Certificates are issued for energy under this PPA. | Needed for market-based Scope 2 claims. | On for a corporate RE100 buyer. |
| REC Registry | Seller | Where certificates are issued: ZaRECs (SANEDI), I-REC, or Blockchain. | Seller supplies the registry path. | ZARECS for domestic reporting; I_REC for global Scope 2. |
| Scope 2 Method | Buyer | Market-based (contractual instruments / RECs) vs Location-based (grid average). | Buyer’s GHG accounting choice — market-based needs RECs. | Corporate programme → MARKET. |
| Carbon Credits Enabled | Joint | Whether carbon emission reductions are quantified and credited. | Separate from RECs — turn on only if the deal includes carbon. | On when the buyer wants carbon lines on the statement. |
| REC price (R/certificate) | Joint | Optional contract price per REC. Distinct from the estimated-grade reference price. | Required when unbundled and priced. Taught in V19 §10. | R 35 per certificate. |
| Non-double-counting warranty | Seller | Seller warrants these certificates are not counted elsewhere. | The report is V19 §08. | On for a corporate claim. |
| Carbon Methodology | Seller | How tCO₂ is calculated: Grid average, Build margin, or Combined margin. | Seller’s carbon accounting method when carbon is enabled. | GRID_AVG for a simple annual factor. |
| Credit ownership | Joint | Who owns tradable credits if a registered project exists. Default BUYER. | V19 §14. | BUYER. |
| Offset price (R/tCO₂e) | Joint | Optional contract price per tonne. | Required when carbon is enabled and priced. | R 180 / tCO₂e. |
Step 8 — Legal Terms
Purpose. Force majeure, termination triggers, payment hygiene, liability cap, disputes, regulatory change, assignment, and confidentiality. Almost everything is joint; Eskom Default and Payment Due are buyer-owned.
Force Majeure
| Field | Ownership | What it means | Why it matters | Example |
|---|---|---|---|---|
| FM Definition | Joint | How broad force majeure is: Standard, Extended, or Narrow. | Sets which “acts of God / beyond control” events excuse performance. | STANDARD for a balanced corporate deal. |
| FM Notice (days) | Joint | Days within which the affected party must notify the other of an FM event. | Late notice can lose the protection. | 7 days. |
| FM Termination Trigger (days) | Joint | Continuous FM days after which either party may terminate. | Escape hatch for endless FM. | 180 days. |
FM definition in plain words: STANDARD — usual legal FM list; EXTENDED — broader (more events excused); NARROW — tighter (fewer excuses).
Termination Events (Yes / No — whether that event is a contractual termination trigger)
| Field | Ownership | What it means | Why it matters | Example |
|---|---|---|---|---|
| Material Breach | Joint | Serious breach of contract can end the deal. | Core exit for non-performance. | Yes. |
| Insolvency | Joint | Insolvency / business rescue of a party can end the deal. | Credit-risk exit. | Yes. |
| Change of Control | Joint | Sale / change of ownership of a party can end (or reopen) the deal. | Counterparty-identity protection. | Yes if you care who you are dealing with. |
| Eskom Default | Buyer | Buyer’s Eskom account default can trigger termination rights. | Buyer-side utility standing. | Buyer selects Yes if account default must be a hard exit. |
Payment & Disputes
| Field | Ownership | What it means | Why it matters | Example |
|---|---|---|---|---|
| Cure Period (days) | Joint | Days a party has to fix a breach before harder remedies. | Breathing room before termination / damages. | 30 days. |
| Invoice Cycle | Joint | When invoices are raised: Monthly or End of month. | Cash-flow calendar — this is the base the billing run uses for the due date (V15 §7, §8). | MONTHLY. |
| Payment Due (days) | Buyer | Days after invoice until payment is due. | Buyer’s payment clock — the issuer run reads this onto the document; a missing value prints as standard terms (30 days). | 30 days from invoice. |
| Late Interest (%) | Joint | Interest rate on late payments. | Shared cost of paying late. | 2% per month (or as negotiated). |
| Liability Cap | Joint | Ceiling on damages: Annual contract value, Total contract value, Uncapped, or Custom. | How bad a worst-case claim can get. | Cap at ANNUAL_VALUE. |
| Dispute Resolution | Joint | Forum for disputes: AFSA, ICC, Mediation then arbitration, or Expert determination. | Where fights get resolved. | AFSA for domestic deals; ICC for cross-border. |
| Expert Body | Joint | When disputes use an expert: SAICE, SAIEE, or Agreed ad-hoc body. | Technical fights (meters, yield) often need an expert, not a full trial. | SAIEE for electrical metering disputes. |
| Regulatory Change Risk | Joint | Who bears law / tariff / VWA rule changes: Shared, Buyer, Seller, or Termination right. | Virtual deals are sensitive to Eskom / NERSA rule shifts. | SHARED; or TERMINATION if either side may walk on material change. |
| Assignment & Transfer | Joint | Whether a party may transfer the contract: Consent required, Lender permitted, No transfer, or Free transfer. | Who can inherit the deal. | LENDER_PERMITTED for a project-financed plant. |
| Confidentiality | Joint | Mutual NDA, Standard confidentiality, or None. | How tightly commercial terms stay private. | MUTUAL_NDA. |
Step 9 — Wheeling Charges
Purpose. Explain that network / Gen-Wheeling money is not negotiated as editable wizard fields. Charges and credits are determined by Eskom from the buyer’s tariff category (step 4) and published Gen-Wheeling rates. This step is read-only orientation.
What you see:
An info panel: wheeling charges are Eskom-determined and not directly editable.
The Wheeled Energy Refund (WER) formula in plain symbols:
WER = Σ_TOU [ min(Consumed, Wheeled) × Gen-Wheeling Rate_TOU ]
In lay terms: for each time-of-use band, take the smaller of what the buyer consumed and what was treated as wheeled, multiply by that band’s Gen-Wheeling credit rate, then add the bands up. That refund is the credit leg of the three cash flows in §9.1.
Step 10 — Review & Submit
Purpose. Final glance before Freeze terms. The summary grid is derived from terms you already agreed — use Back (or the stepper) to change anything.
| Summary tile | What it shows |
|---|---|
| Agreement Ref | VPPA-… reference. |
| Deal Type | Commercial topology. |
| Capacity | Contracted MW (or —). |
| Term | Years (or —). |
| Start Date | Agreed start (or —). |
| VWP Vendor | Mezzanine / Enerweb / Other. |
| Settlement | Monthly / Weekly / Daily. |
| Status | Current negotiation status (e.g. Negotiating). |
The green banner reminds you: navigate back to any step to fix gaps. The footer’s Freeze terms gate still enforces completeness and joint approvals (§4.6) — Review alone does not finalise an incomplete sheet.
4.6 Freeze terms — and the gate
Freeze terms is available when required terms and joint approvals are complete, and every local edit has been saved. It first opens read-only review of the saved version. Only Confirm freeze advances the deal to AGREED and starts the signing window. The server rejects an unsaved draft or a saved version changed since review. See §4.2a for saving and leaving safely.
What each wizard demands:
- Physical — every required term for your contract type, tariff type and deal type present, and every joint term approved.
- Virtual — capacity, start date and term; the conditions-precedent checklist captured (the CPs themselves are discharged before activation, not before agreement); a valid strike price — the flat rate for FLAT, all three TOU rates for TOU, plus an escalation rate when the mechanism needs one; the buyer’s Eskom tariff category when the buyer is an off-taker (a trader buyer has no Eskom account); and every joint term approved.
Once finalisable, Freeze terms also appears on every earlier step, so a deal can be concluded from anywhere in the wizard.
4.7 Settlement consequences — and terms outside the wizard
Sections §4.4 and §4.5 are the field-by-field screens. This section is what those families do to settlement (and the few commercial terms that never appear in the negotiation wizard).
Capacity & volume [mostly Joint] — contracted capacity, allocated energy, ToP min volume and capped volume limit bound the matched energy at settlement; for ToP they can create a payment even when consumption falls short (V8 §7). On a buyer- or seller-originated proposal draft, these (and other party / joint fields) can arrive with a suggested value and a short rationale from the matching advisor — you accept or override; nothing is binding until you send. > Where suggestions are taught. Buyer side — shape, cap price, seeded > Simulate defaults — > V3 §13.2.1. > Seller side — price card, floor, warranty, seeded Sales defaults — > V4 §6.4.1.
Tariff & pricing / escalation — at settlement the pricer applies the chosen structure per interval, TOU period and escalation year. Escalation compounds per calendar year; the strategy engine assumes the same curve when valuing the contract (V3).
Curtailment — settlement prices deemed energy at the contract rate and tags curtailment lines with the instruction that caused them (market side in V3 §17).
Spill, excess & banking — settlement’s adjuster writes spill credits and maintains the banking ledger drawdown (V8 §7).
Shortfall & delivery — settlement computes shortfall against the guaranteed profile net of excused windows and prices the chosen remedy (V8 §7).
Metering & settlement cadence — meter references come from the sites; Settlement Frequency chooses how often a settlement period closes (daily contracts settle every morning at 01:00, monthly on the 1st — V1 §2).
RECs & carbon — drive the statement’s certificate lines and the off-taker book’s green-coverage KPI (V3 §13).
Trader terms [captured at the proposal — not in the negotiation wizard] — a trader buyer’s margin (type, c/kWh or %, back-to-back pricing); a trader seller’s source guarantee, portfolio/replacement rights and licence warranty. Chain settlement and the trader P&L read these (V8 §10). Compose them in the trader studios (§3.4e / §3.4f).
Wheeling charges [Derived] — loss factors and UoS charges of V2 §8.3, resolved from the deal’s network path. Nobody negotiates them in the wizard; the billing-responsibility panel in the proposal studios (§3.4) shows who pays.
Virtual family at settlement — one formula: the CfD of V0 §5, applied per period at the chosen frequency (V8 §14). Settlement volume basis decides what that formula multiplies — and therefore who pays when generation and consumption do not line up. Settle on generated volume and the buyer pays strike for plant output that may earn no WER credit; settle on matched volume only and the seller carries that mismatch. There is no quiet default. Cash-flow intuition: §9.
How long a counterparty offer stands, and that private review notes stay private until you accept or share, remain under §3.2 and §3.5a.
Follow along. Seat: IPP 2 (
ipp_2@webill.net) — the negotiation ladder. Path: Negotiations. You should see one Negotiating deal with OffTaker A (open it: ownership badges, and the wizard as the seller sees it), three Agreed deals showing Sign by dates and the Sign button, one Declined with its reason on the badge, and the Active book. For the virtual wizard, switch to Off-taker C — its one Negotiating deal is virtual.
Data. full_demo · seed 42 · stage S04 (lifecycle) · sealed 2026-07-15.
4.8 Price devices — upside sharing and the volume strike
Tariff & Pricing now includes folded Upside sharing and Volume strike panels in both wizards. Leave a device disabled to retain the existing settlement. Upside sharing captures the seller’s share of the positive difference between published hourly SMP and either a fixed threshold or the effective contract price plus a margin. An optional c/kWh cap limits each interval; an annual Rand cap limits the total. It is unavailable on a virtual contract that already uses a market floating leg.
A volume strike prices the first stated MWh normally, then changes the treatment of later energy in chronological order. Choose a month, quarter or contract year. Physical excess can use market price, a discounted contract price, no payment, or the spill terms. A virtual strike uses UNPAID above the limit: it caps CfD payments and leaves WER unchanged. A contract-year strike cannot exceed an existing annual CAPPED limit.
4.9 The availability guarantee
Physical Shortfall & Delivery and virtual Generator Obligations capture the guaranteed percentage, measurement period, method, deadband, damages rate and cap. The guarantee mirrors the existing performance warranty. Meter inferred compares each observed hour against the forecast threshold after contractual excuses. Observed zero production differs from a missing meter reading. Missing evidence refuses measurement; Telemetry refuses until plant telemetry is connected.
Declared outages use recorded SO outage windows. A force-majeure or maintenance excuse must be recorded on the instruction evidence and permitted by the contract; overlapping excuses count once. Damages are assessed when the monthly or contract-year measurement period closes. The seller pays only for shortfall beyond the deadband, subject to any period energy-charge cap.
4.10 Termination — events, notice, cure and payment
Physical step 12, Termination, and virtual step 8, Legal Terms, capture the events, notice and cure periods, force-majeure trigger, and estimated payment method. Existing step numbers stay intact. Convenience termination requires an earliest contract year. Payment choices are none, a fixed schedule per MW and remaining year, or a lost-margin estimate with pinned forecast assumptions. These are contractual estimates, not marked fair values.
Open Termination on the Contracts register to inspect a notice clock and its payment marked estimated. Serving a notice is a human action. The recipient can record a timely cure; the serving party can withdraw. When a served notice becomes effective, the daily contract job terminates the agreement and queues its final shortened settlement. It leaves future settlement eligibility; the final period includes the pinned payment with a balancing counterparty line. Lost-margin notices refuse when the required pinned forecast is absent.
For a lost-margin estimate, select an available price reference in the register. A market reference pins a complete, versioned month of DAM P50 prices; a retail reference pins an effective tariff for the buyer. Enter the reviewed remaining P50 energy, the weighted contract rate and the forecast source and assumptions. The selected monthly average or tariff band is held constant for the remaining term, and the form says so explicitly. Review estimate shows the amount and effective date without serving anything. Confirm reviewed estimate and serve notice saves the assumptions and price evidence. If the contract or reference changes between review and confirmation, review again. Missing reference data blocks serving; later price updates do not rewrite a served notice.
5. Agreement, signing and activation
Re-open reverses AGREED → NEGOTIATING: signatures are voided and every joint term goes back to pending, proposed by the reopener. If neither side signs within 10 days, AGREED → SUSPENDED; revival needs mutual consent.
5.1 Agreed — the terms freeze
In plain words. AGREED means both sides have finished bargaining and locked the commercial sheet. You are no longer editing prices and clauses — you are deciding whether to sign that locked sheet (or to unlock it again on purpose).
How a deal reaches AGREED
Either party chooses Freeze terms, reviews the saved sections, then presses Confirm freeze when the sheet is complete and all drafts are saved. The same rule applies to physical and virtual deals (§4.6):
- Every required term for that deal is filled in.
- No joint term is still waiting for the other side’s approval.
If either check fails, Freeze terms stays gated (the footer lists what is missing). The server enforces the same rules, so an incomplete deal cannot be forced into AGREED by another path.
When Confirm freeze succeeds, the platform:
- sets status to AGREED;
- stamps
agreed_at(the moment the freeze started); - opens the 10-day sign window.
On Negotiations the row turns green (Agreed) and shows “Sign by {date}” — ten calendar days from that stamp. That deadline is enforced: a nightly background job moves unsigned AGREED deals to SUSPENDED once the window has fully elapsed (any half-completed signature is voided). Suspended deals stay on Negotiations but cannot be signed or re-opened until both sides consent to revival (below).
What “frozen” means
While the deal is AGREED:
| You can | You cannot |
|---|---|
| Open Sign and put your name on the locked terms (§5.2) | Change capacity, price, strike, dates, or other wizard fields as if you were still negotiating |
| Re-open to unlock and renegotiate (see below) | Rely on private brief chips / walk-away confirms (§4.3) — those apply only while NEGOTIATING |
| View agreement without changing terms or signatures | Treat AGREED as “live energy” — settlement still waits for SIGNED then ACTIVE (§5.3, §5.4) |
Think of AGREED as sealing an envelope: the letter inside is the deal you both just finished. Signing is writing your name on the envelope. Re-opening is tearing it open again so you can rewrite the letter.
Suspended — the sign window lapsed
If ten calendar days pass after agreed_at without both
signatures, status becomes SUSPENDED. On Negotiations
the row shows orange (Suspended) and the wizard is
read-only. Signing and Re-open are closed.
To resume:
- Either party clicks Request revival.
- The counterparty clicks Accept revival.
- Status returns to AGREED with a
new
agreed_at(fresh 10-day window). Terms stay frozen — this is not a re-open of the bargain.
The requester may Cancel request before the other side accepts. Either side can review the saved terms while suspended.
Re-open — unlocking on purpose
Either party may Re-open an AGREED deal. That is a deliberate step backward to NEGOTIATING. Choose Reopen terms… on the row. The confirmation names the agreement and recorded signatures. Keep agreement cancels without changing anything. Only Clear signatures and reopen performs the reset. It:
- voids any signature already recorded (the first signer must sign again after the next freeze);
- clears
agreed_at(the sign window restarts the next time you reach AGREED); - sends every joint term back to pending, proposed by the person who re-opened — so both sides must approve the shared fields again.
Use Re-open when someone spotted a real mistake or you both want to change a term. Do not use it casually after one side has already signed — you are throwing away that signature and reopening the bargain.
Example
Off-taker and IPP finish the physical wizard. All joint fields show approved; required terms are present. Either side reviews Freeze terms and presses Confirm freeze → status AGREED, Negotiations shows Sign by 15 Aug 2026. The energy price is now locked at 85 c/kWh. If the buyer then wants 82 c/kWh, they must Re-open, change the price (seller must approve again if it is joint or seller-owned as the ownership badges say), reach Freeze terms again, and both must sign the new freeze.
5.2 The signing ceremony
Sign opens the ceremony for the deal. What you see:
- Contract Terms — a short summary. Choose Review full saved agreement to read all saved sections, including legal, network, renewable certificate and carbon terms. Closing review returns to signing. Changing terms requires deliberate reopening.
- Signing Status — Buyer and Seller cards, each Signed (by whom, when) or Pending. If the terms changed after the first signature, a red banner explaining that both parties need to sign the current version.
- Joint Terms Approval — informational: how many joint terms are approved vs pending. It doesn’t block signing, but review before you put your name down.
- The signer form — blank fields for your own full name, work email and optional title. Name and a valid email are required before Sign is enabled. The method is Platform Consent: your agreement is cryptographically bound to the current terms via a content hash — a SHA-256 over the commercial term set, so what you signed is provable later.
After you have signed, your row says Awaiting [counterparty] signature and offers View agreement.
You sign only as your natural role. The first signature records and waits (“Signature recorded. Awaiting counterparty signature.”); the second signature triggers the gate: both signatures present, both hashes identical → the contract advances to SIGNED, both sidebars update, and the deal appears on the Contracts register.
5.3 When a contract is complete (SIGNED)
A deal is commercially complete the moment the signing gate advances it to SIGNED. That is not a soft label — it is the point at which the platform has:
- Frozen terms — locked at AGREED; both parties signed the same content hash (SHA-256 of the commercial term set).
- Two immutable signatures — BUYER and SELLER rows
with name, title, email, method (
PLATFORM_CONSENT), IP, user-agent, serversigned_at, and a frozencontent_snapshot. - A written agreement PDF — generated asynchronously
from those snapshots (not from the live, editable PPA record), hashed as
document_hash, and stored for download.
Written agreement PDF
On the second matching signature the platform enqueues
GenerateAgreement. The worker:
- rebuilds the render context from the signed
snapshot + party orgs
- both signature rows;
- composes the PPA template library
(
priv/agreements/templates/ppa) for the deal type (OFFTAKER_IPP,OFFTAKER_TRADER,TRADER_IPP,TRADER_TRADER); - renders Markdown → HTML → PDF and records an insert-only
ExecutedAgreement(content_hash,document_hash,storage_uri, template version, signature ids).
Where the PDF is stored
| Environment | Backend | Location |
|---|---|---|
| Dev / Test | Local disk | priv/agreements/generated/agreements/<ref>/<content_hash>.pdf
(file://… URI) |
| Production | S3 | s3://$AGREEMENTS_BUCKET/agreements/<ref>/<content_hash>.pdf
(optional Object-Lock) |
Parties download via
/org/agreements/:id (session org must be a
party to the contract).
Example — the thread’s physical deal
| Agreement | PPPA-202607-138209764 |
| Parties | IPP2 Atlantis Wind (Seller) → OffTaker C Midrand DC (Buyer) |
| Deal type | OFFTAKER_IPP · AS_GENERATED · FIXED
85.0 c/kWh |
| Term | start 2026-01-01 · 10 years · DAILY settlement |
| Completeness | both signatures present · matching content_hash ·
status SIGNED (then ACTIVE once the
start date has arrived) |
| Written PDF | ExecutedAgreement with document_hash over
the generated bytes; download from Contracts once status is
GENERATED |
In the demo, open Contracts → PPPA-202607-138209764 →
View contract: signatories, pricing and the Settlements list are the
same evidence the written PDF’s Execution page records.
5.4 Activation
Nothing to click: the daily activation trigger (V1 §6) flips SIGNED contracts to ACTIVE when their start date arrives — both statuses live on the Contracts register (commencement column shows start date and starts in… / N months active). From that moment the contract is a standing instruction to settlement, and the seller’s hierarchy, forecast and strategy screens (V4/V6) treat it as live supply or demand. The written PDF generated at SIGNED remains the immutable record of what was signed; activation does not regenerate it.
Follow along. Seat: IPP 2 (
ipp_2@webill.net). Path: Negotiations → any Agreed row → Sign. You should see the ceremony with both status cards Pending and the blank signer form. (Signing is reversible only via Re-open before the counterparty signs — in a shared demo environment, look, don’t sign.) After both signatures, the deal leaves Negotiations for Contracts — open a SIGNED/ACTIVE demo row there and confirm an executed-agreement download once the generator has run.
Data. full_demo · seed 42 · stage S04 (lifecycle) · sealed 2026-07-15.
6. The contracts register
Contracts (/org/deals/contracts — the
Deals tab you land on) is the executed book: every
physical and virtual PPA this organisation is a party to that reached
SIGNED, ACTIVE or
TERMINATED. An AGREED agreement still
waiting for signatures is a negotiation, not a contract — it is listed
once, under Negotiations, and a
footer note here says how many are waiting.
The number in brackets on the Contracts tab is the size of that book. It is the one Deals tab whose number is an inventory rather than work waiting on you — a contract is not a task — and it is the same number the sidebar shows. The table’s own pill counts what the current filters leave, so the two differ while a filter is on.
There are no stat cards. One context line states the book once — how many agreements, how many active / signed, physical / virtual, and the contracted MW — and the next settlement run with its live countdown, stated once for the book rather than repeated on every row (it is the settlement clock, V1 §2). Columns:
| Column | What it shows |
|---|---|
| Contract | the agreement reference, an Active / Signed / Terminated chip, the physical/virtual pill, and the delivery-profile badge |
| Parties | seller → buyer, your side highlighted You |
| Term | 01 Jan 2026 → 31 Dec 2035, the term length and how far in (or starts in…) |
| Capacity | contracted MW |
| Open | the one way in — the row and its Open button both open the contract page |
6.1 The contract page
Opening a contract leaves the Deals tab bar behind.
/org/deals/contracts/:ppa_id is the contract’s own
view: from there the tabs on screen are that contract’s, and
‹ Back to Contracts returns to the register. The
sidebar still marks Deals, because that is where the contract lives.
The header — reference, status, instrument, both parties, term, capacity and the settlement cadence with the next run — stays put while only the panel beneath the tabs changes. Nothing in that header is repeated inside a tab:
| Sub-tab | What it shows |
|---|---|
| Overview | Who signed, and the term groups the bill is allowed to use. Parties and the network path stay in the header and are not repeated here. Walked in V8 §12.16 |
| Settlements | What happened in each window — status, energy, your net. V8 §12.3 |
| Ledger | How the windows add up, month by month. V8 §12.4 |
| Statements | The document you can send for one window, and its PDF. V8 §9 |
| Disputes | Challenges raised on this agreement’s windows. V8 §12.17 |
| Termination | The notice clock, and the actions to serve, review, cure or withdraw. V8 §12.18 |
Written agreement (when one has been generated) and Register forward (ACTIVE physical PPAs) are actions in the contract header. Registering a forward schedule opens under the same header, without claiming a tab — it is an action, not one of the contract’s standing views.
Two dispute lists, two questions. This tab is one agreement’s dispute history, so it drops the agreement column and dates each row instead. The room at Deals → Disputes is the cross-contract inbox — what needs me? — and its badge counts the disputes waiting on your move. Each names the other, so neither is mistaken for a copy.
Note — the written agreement. When a long-form document has been generated for this physical agreement, Written agreement in the header opens that PDF. The signatories and the term groups on Overview remain the terms settlement reads. The design of the long-form text lives in
docs/references/templates/written_contract.md.
Follow along. Seat: Off-taker C (
offtaker_c@webill.net). Path: Contracts. You should see the thread’s direct deal (PPPA-202607-138209764, IPP2 Atlantis Wind → OffTaker C Midrand DC, Active) among six active contracts — open Settlements on it and the settled periods of V5’s story are already there.
Data. full_demo · seed 42 · stages S04/S09 · sealed 2026-07-15.
7. Worked example — the thread’s physical deal
This chapter walks one physical (wheeled) deal from “I found someone” all the way to “we both signed.” Same cast as V2 §10. Plain words first; screen names in bold when you need them.
Data. full_demo · seed 42 · stage S04 (lifecycle) · sealed 2026-07-15 · M8 gate re-check 2026-07-18 · commit
925037a. Happy-path ACTIVE deal:PPPA-202607-138209764· AS_GENERATED · 1.000 MW · start 2026-01-01 · 10 years · FIXED 85.0 c/kWh · DAILY settlement.
7.1 Who is in the story
Think of three kinds of “shop front” that can start a deal:
| Who starts | Their shop front | Everyday meaning |
|---|---|---|
| Off-taker | an Off-taker Site (e.g. Midrand DC) | “I need power for this building.” |
| IPP | a Generator Site (e.g. IPP2 Atlantis Wind) | “I have a plant with surplus to sell.” |
| Trader | a Trader Pool (e.g. T1 Renewables Pool) | “I buy and sell for a portfolio.” |
A physical deal means energy is wheeled on the grid from the seller’s connection to the buyer’s — not a private cable. Both sides must be on networks that allow that path (for the direct line above, both sites are municipal).
Propose and Review live on Proposals. Negotiate, Agree, Sign, Re-open and Revive live on Negotiations. SIGNED / ACTIVE live on Contracts.
7.2 Three doors into a proposal
Anyone can start — the door depends on your shop front:
| You are… | Open this | Then | Studio you land in |
|---|---|---|---|
| Off-taker Site | Strategy → Procurement | Simulate a candidate → Build Proposal | Buyer proposal studio (§3.4) |
| Generator Site | Strategy → Sales | Simulate a buyer → Build Proposal | Seller proposal studio (§3.4a) |
| Trader Pool (buying) | Strategy → Simulations → Buy | Pick an IPP (or trader) → Build Proposal | Trader buy studio (§3.4e) |
| Trader Pool (selling) | Strategy → Simulations → Sell | Pick an off-taker (or trader) → Build Proposal | Trader sell studio (§3.4f) |
Note. Simulation first is the normal path: you see fit and margin before you put a number on the table. The studio then turns that evidence into a sendable proposal.
7.3 Walk A — Off-taker Site proposes (buyer starts)
Seat: OffTaker C · Shop front: Midrand DC · Counterparty: IPP2 Atlantis Wind.
Numbers we will use
| Item | Value | Plain meaning |
|---|---|---|
| Volume / capacity | ~1 MW / ~12,000 MWh/yr requested | How much energy the site wants |
| Suggested buyer cap | ≈ 115.2 c/kWh | Highest price the buyer is willing to pay (private) |
| Public ask (example) | 85.0 c/kWh FIXED | What the other side will see |
| Private walk-away | 80 c/kWh | “I walk if it goes above this” — never sent |
| Expiry | 30 days | How long the quote stands |
Step by step
- Open Procurement for Midrand DC. Find IPP2 Atlantis Wind among candidates (both municipal → only Physical is offered).
- Run a simulation. Read fit and the suggested cap.
- Click Build Proposal. Stage 0 · Instrument collapses to Physical (Virtual is not available on this path).
- Walk the studio: evidence → price / shape → walk-aways (private) → readiness. Accept the suggested cap onto your private brief if it fits.
- Set expiry to 30 days. Check the seller-eye preview — walk-aways must not appear there.
- Send to seller → proposal status PENDING.
The seller now sees it under Proposals → Received.
7.4 Walk B — Generator Site proposes (seller starts)
Seat: IPP 2 · Shop front: IPP2 Atlantis Wind · Counterparty: OffTaker C Midrand DC.
This is the demo’s happy path that becomes
PPPA-202607-138209764.
- Open Sales for Atlantis Wind. Midrand DC appears as a Sell Candidate (cold storage, 22 kV, Fixed preference).
- Simulate, then Build Proposal → seller proposal studio.
- Only Physical is offered. Fill the price card: public ask 85.0 c/kWh FIXED; keep floors on the private brief.
- Stage 9 buyer-eye preview shows the public card only.
- Clear readiness, expiry 30 days, Send to buyer → PENDING.
When the buyer later picks a contract shape, the seller may get a second pass to confirm shape-gated fields — that is normal, not a new proposal.
7.5 Walk C — Trader Pool proposes
Traders use the same idea with a pool instead of a single site.
C1 · Trader buys from an IPP (T1 Renewables Pool ← IPP3 Midrand Hybrid)
- Seat: Trader 1 → Simulations → Buy → pick IPP3 → Build Proposal.
- Trader buy studio (§3.4e): capacity / term / price for procurement into the pool.
- Send → IPP3 reviews → Accept creates a TRADER_IPP physical contract in NEGOTIATING.
C2 · Trader sells to an off-taker (T1 → OffTaker A Rosebank Mall)
- Seat: Trader 1 → Simulations → Sell → pick Rosebank → Build Proposal.
- Trader sell studio (§3.4f): the pool is the seller; the mall is the buyer.
- Send → off-taker reviews → Accept → OFFTAKER_TRADER physical contract in NEGOTIATING.
Tip. The organisation name and the pool / site name both travel into the written agreement later (§5) — e.g. “Trader 1 · T1 Renewables Pool”.
7.6 Accept — the handshake becomes a negotiation
Whoever received the proposal opens Review (§3.5a):
- Read the offer — public terms, joint asks, days left on the quote.
- Score gaps against your private brief.
- Optionally stage a private response (not sent until you choose).
- Choose an exit (§3.5c):
- Accept & create contract — happy path;
- Decline — walk away (optional reason / findings);
- Counter (including the other instrument when available);
- let it Expire.
Accept does one atomic thing: proposal → ACCEPTED, a physical PPA is created in NEGOTIATING, captured terms and meter refs are replayed onto the contract. Both parties now see the row on Negotiations.
For the demo direct line that is PPPA-202607-138209764,
with meters MTR-NERSA-GEN-1002 (generation) and
MTR-OTS-…c_private (consumption).
7.7 Negotiate in real time
Open the row → Negotiate. The physical wizard (§4.4) opens. Both sides can be in it at once.
Your own pending fields stay editable. Approved joint fields lock until someone Re-opens the whole deal.
What “real time” feels like
- You save a step → the other party’s row shows a red unseen changes badge; their open wizard refreshes.
- Ownership badges (Buyer / Seller / Joint / Derived) tell you who may edit what (§4.2).
Accept suggestions
- Private brief chips and studio Suggest / Why / Accept put numbers onto your side of the sheet.
- Accepting a suggestion is still your edit — joint fields still need the counterparty’s approval.
Make a change
- Edit a field you own (or a joint field that is pending-by-you).
- Save. Counterpart sees the update live.
- If the field is Joint, status goes Pending for them.
Confirm (approve) a change
- Open the pending field.
- Approve — it locks as agreed.
- When every required term is filled and every joint field is approved, the footer’s Freeze terms gate opens (§4.6).
Example numbers on the direct-line deal
| Wizard step | What you lock | Demo value |
|---|---|---|
| Capacity & term | Start / term (joint) | 2026-01-01 · 10 years |
| Capacity | Contract type | AS_GENERATED · 1.000 MW |
| Tariff | Price (seller-led) | FIXED 85.0 c/kWh |
| Curtailment | Risk split | as agreed in wizard |
| Metering | Settlement frequency | DAILY |
| Wheeling | Loss factors / UoS | derived from sites (read-only) |
7.8 Side doors — decline, re-open, suspend, revive
These are the moves people actually need when the happy path wobbles.
Decline (walk away before both have signed)
- From the wizard (while NEGOTIATING) either party can Decline with an optional reason.
- The row stays on Negotiations as Declined, read-only.
- From Proposals, a recipient can also decline before Accept (§3.5d) — that never creates a contract.
Re-open (unlock an AGREED deal on purpose)
Use when someone spotted a mistake after Freeze terms, before both have signed (or after one signature — that signature is thrown away).
- On Negotiations, AGREED row → Reopen terms…. Read the signature-reset warning, then choose Clear signatures and reopen or Keep agreement.
- Status → NEGOTIATING; signatures voided; every joint term goes back to Pending (proposed by the reopener).
- Fix terms → both approve again → Freeze terms → new AGREED and a fresh 10-day sign window (§5.1).
Sign window lapses → Suspended → revive
If neither side finishes signing within 10 days of AGREED, a nightly job moves the deal to SUSPENDED (§5.1).
| What you see | What to do |
|---|---|
| Orange Suspended · “Sign window lapsed” | Signing and Re-open are closed |
| No revival yet | Either party clicks Request revival |
| You requested it | Cancel request if you change your mind |
| They requested it | You click Accept revival |
Accept revival returns the deal to
AGREED with a new
agreed_at (fresh 10 days). Terms stay frozen — this is not
a re-open of the bargain. Then both sign as usual.
7.9 Freeze terms, sign, and go live
- Freeze terms → AGREED. Negotiations shows Sign by {date} (10 days).
- Sign → ceremony (§5.2): name, email, title; content hash binds you to these exact terms.
- First signature waits; second matching signature → SIGNED.
- Row leaves Negotiations and appears on Contracts.
- On the start date, the daily job flips SIGNED → ACTIVE.
- Settlements begin (V8).
The written PDF names organisation + site/pool for each side (e.g. OffTaker C · Midrand DC / IPP 2 · Atlantis Wind).
Follow along. Seat: Off-taker C. Path: Contracts →
PPPA-202607-138209764→ View contract. You should see both signatories, AS_GENERATED, and 85.0 c/kWh. Settlements already list daily periods. To practise negotiation: open a NEGOTIATING sibling on Negotiations, propose a joint field, approve from the other seat, then Freeze terms / Sign / (optionally) Re-open or Request revival on a suspended training row if present.
Previously in the thread → V2 §10 · standing up the cast. Next → V3 §21 · demo walkthrough. The same kWh settles in V8 §13.
Counter with an upside share
During the §7.7 negotiation, a seller can counter the price with a 50% share above the effective contract rate plus 20 c/kWh, capped at 40 c/kWh per interval. Review the upside panel and approve the joint terms before finalising. The resulting payment follows actual published interval prices, so the negotiated percentage alone is not a guaranteed monthly amount.
8. Worked example — the thread’s virtual deal
Same journey as §7, but for a virtual (financial hedge) deal. No wheeled delivery — the buyer still buys grid power; the deal settles a cash difference against a strike. Plain words first.
Data. full_demo · seed 42 · stage S04 (lifecycle) · sealed 2026-07-15 · M8 gate re-check 2026-07-18 · commit
925037a. Cast: IPP3 Midrand Hybrid (Eskom 132 kV) ↔︎ George Eskom Plant (OffTaker C’s Eskom-connected site). MONTHLY settlement; CfD figures marked illustrative where the demo leaves them open.
8.1 What “virtual” means here (in one picture)
Eligibility rule (hard): both ends must be Eskom-connected with the virtual paperwork story in place (VWA registered, account in good standing). If either side is municipal-only, the Eskom Virtual PPA door stays dark (§1.1, §2).
Traders can also propose virtual deals when the rules allow trader participation — same studios, pool as the shop front (§3.4e / §3.4f).
8.2 Three doors into a virtual proposal
| You are… | Open this | Build when… | Studio |
|---|---|---|---|
| Off-taker Site (Eskom) | Procurement | Virtual sim against an Eskom IPP / eligible trader | Virtual buyer studio (§3.4b) |
| Generator Site (Eskom) | Sales | Virtual sim against an Eskom off-taker / eligible trader | Virtual seller studio (§3.4d) |
| Trader Pool | Simulations → Buy / Sell | Counterpart is virtual-eligible | Trader buy / sell studio (§3.4e / §3.4f) |
If both Physical and Virtual are available, stage 0 · Instrument asks you to pick (§3.4c). Here we keep Virtual.
8.3 Walk A — Off-taker Site proposes (George → IPP3)
Seat: OffTaker C · Shop front: George Eskom Plant · Counterparty: IPP3 Midrand Hybrid.
Numbers (illustrative)
| Item | Value | Plain meaning |
|---|---|---|
| Matched fraction (sim) | ~0.71 | Share of hours where generation and load overlap |
| Settlement volume basis | Matched | CfD only on the overlapping volume |
| Buyer strike cap | ~break-even on matched volume | Private ceiling on your brief |
| Buyer Eskom tariff | Megaflex | Sets the credit / reference story |
| Expiry | 30 days | Quote window |
Step by step
- Confirm George’s VWA is REGISTERED and the Eskom account is good standing (V2 §3).
- Procurement → virtual sim vs IPP3 → read matched shapes (~71%).
- Build Proposal → stage 0 · Instrument → keep Virtual.
- Studio walk:
| Stage | What George does |
|---|---|
| 1 Evidence | Reviews matched shapes and ~71% fraction |
| 2 Strike | Chooses Matched basis; Accepts the suggested cap; confirms Megaflex |
| 3 Obligations | Conditions precedent / REC notes as paperwork lands |
| 4 Dispatch | Capacity, term, start, VWP vendor; seller-eye preview (no walk-aways); expiry 30 days; Send |
Private walk-aways stay on George’s brief. The PENDING card shows public joint asks and the strike sheet only.
8.4 Walk B — Generator Site proposes (IPP3 → George)
Seat: IPP 3 · Shop front: Midrand Hybrid.
- Sales → virtual sim vs George → Build Proposal.
- Virtual seller studio: public strike ladder (FLAT / TOU); floors private on the brief.
- If the band is inverted (buyer cannot pay plant cost), the studio offers Withdraw draft instead of send — do not ship a broken quote.
- Otherwise set expiry, preview, Send to buyer → PENDING.
8.5 Walk C — Trader Pool proposes (virtual)
Same pattern as physical §7.5, with Virtual eligibility:
- Buy tab: pool procures a virtual hedge from an Eskom IPP.
- Sell tab: pool offers a virtual hedge to an Eskom off-taker (or another eligible trader).
Organisation + Trader Pool name both appear on the eventual agreement PDF, just as site names do for IPP / off-taker deals.
8.6 Review, four exits, and Accept
Recipient opens Review (§3.5a) — virtual review has five stages (not six).
- Read disclosed terms, joint asks, and both parties’ conditions precedent as schedule risk.
- Gap analysis runs the CfD model on the quoted strike (provenance: based on their quoted strike).
- Stage a private reply if you want; proposal
virtual_termsstay untouched until Accept or share my terms now. - Decide (§3.5c):
- Accept & create contract;
- Decline (optional findings — draft kept for re-propose);
- Counter with a Physical PPA when Physical is available and the gap is material (§3.5e);
- wait for Expiry (discards the review draft).
Accept → VPPA-… created in
NEGOTIATING; both parties see it on
Negotiations.
Counter path (illustrative, one hop)
- IPP3 chooses Counter with a Physical PPA and confirms the shared reason.
- Lands in the physical compose studio; capacity / term / start may carry as suggestions — the strike does not.
- Send → George’s virtual offer is superseded; the physical counter has its own expiry. Max two cross-instrument hops.
8.7 Negotiate the virtual wizard in real time
Open Negotiate → virtual wizard (§4.5). Same real-time rules as physical (§7.7):
| Move | What happens |
|---|---|
| Propose a joint field | Goes Pending for the other side; they see a live refresh / badge |
| Accept suggestion | Brief / Suggest chip writes your number; joint fields still need their approval |
| Approve | Locks that joint field |
| Reject | Sends it back so they can propose again |
| Freeze terms | Only when required terms are complete and no joint field is pending |
Typical virtual locks (illustrative):
| Area | Example |
|---|---|
| Capacity & term | MW, start date, years (joint) |
| Strike | FLAT or TOU strike; Matched volume basis |
| Eskom / VWP | Megaflex category, VWP vendor, MONTHLY settlement |
| Conditions precedent | Tick as paperwork completes |
| Legal / RECs | Force majeure, REC issuance, etc. |
Derived wheeling / WER orientation stays read-only — Eskom sets those rails; you are negotiating the bilateral hedge around them (§9).
8.8 Side doors — decline, re-open, suspend, revive
These match physical (§7.8) for reopening, signing and revival. The virtual wizard does not expose a Decline action:
| Move | When | Result |
|---|---|---|
| Decline | Proposal review before acceptance | Walk away; declined rows stay read-only on Negotiations |
| Re-open | AGREED (before both signed, or after voiding a half-signature) | Back to NEGOTIATING; joints re-pended; new Freeze terms → new AGREED window |
| Suspended | 10 days after AGREED with no full signature pair | Sign / Re-open closed |
| Request revival → Accept revival | Mutual consent on a suspended deal | Fresh AGREED + new 10-day clock; terms still frozen |
Careful. Revival is “open the sign window again,” not “renegotiate the strike.” To change terms, Re-open (only while AGREED, not while Suspended) or decline and start over.
8.9 Freeze, sign, and what ACTIVE means
- Freeze terms → AGREED ·
Sign by {date} (10 days) — virtual now stamps
agreed_atthe same way physical does. - Sign ceremony (§5.2) — both hashes must match → SIGNED.
- Start date → ACTIVE (demo also freezes siblings at NEGOTIATING / SIGNED so you can inspect each stage).
- No meter re-pointing for delivery: George still consumes grid power. Each month, virtual settlement writes the CfD ledger — V8 §14, including hour B’s payment reversal from V0 §5.
Money story in one line: buyer pays Eskom as usual; the virtual deal settles the difference versus the strike on the matched volume (§9).
Follow along. Seat: Off-taker C. Path: Strategy → Procurement → open a virtual sim vs IPP3 → Build Proposal → stage 0 Instrument → walk the four content stages → Send. As seller: Review → five stages → Accept (demo) or Counter with a Physical PPA. Then Negotiations for the virtual wizard (propose / approve / Freeze terms / Sign; try Re-open or revival on a suspended sibling if present). Contracts → ACTIVE
VPPA-…→ View → Strike price (CfD) and Platform & settlement.
8.10 Worked figure — SAWEM TOU-average index
The thread in §8.3 uses the default floating reference: Eskom’s gen-wheeling credit. A market-indexed virtual PPA keeps the same strike and matched volume, and changes only what the strike is netted against.
Teaching slice (illustrative). Flat strike 135 c/kWh. Matched energy already classified into TOU bands. Published SAWEM SMP, volume-weighted inside each band:
| TOU band | Matched kWh | Realised index (c/kWh) | CfD rate (strike − index) | Energy line |
|---|---|---|---|---|
| Peak | 10 | 100 | 35 c | R 3.50 |
| Standard | 20 | 80 | 55 c | R 11.00 |
| Off-peak | 40 | 40 | 95 c | R 38.00 |
| Total | 70 | R 52.50 |
Seller receives R 52.50; buyer pays
R 52.50. The ledger still sums to zero. There is no
wer_credit pair — a SAWEM index is not an Eskom tariff, so
Eskom does not refund this slice.
On the settlement page the card Strike vs realised index names “SAWEM TOU-average SMP” and shows 135 vs 100 / 80 / 40 beside each band. The statement prints the same label and the window’s realised average (V8 §9.11).
Choose this leg in wizard step 4 (Floating reference). Leaving Eskom’s regulated credit rate selected needs no extra click; the George ↔︎ IPP3 story above is unchanged.
Previously → V2 §10 and V7 §7. Next → V3 §21. CfD month → V8 §14.
9. How a virtual PPA makes money
A virtual PPA is not a private cable from the plant to your factory. You keep buying every kilowatt-hour from Eskom (or your municipality) on the normal bill. The deal is a money hedge: it aims to pin the cost of a slice of that energy near an agreed strike price.
Think of three wallets talking every settlement period:
- You ↔︎ Eskom — you pay the full retail bill; Eskom may refund a WER credit on energy that counts under the Virtual Wheeling Agreement.
- You ↔︎ seller (IPP or trader) — you settle the contract for difference against the strike.
- You ↔︎ VWP vendor (often) — a small platform / aggregation fee on the hedged volume.
Physical deals shrink the utility bill because energy was delivered. Virtual deals leave the utility bill’s shape alone and move cash on top. That is why a procurement “saving” that pretends virtual energy displaced retail purchases is the wrong number for a virtual candidate.
9.1 Picture — who pays whom
| Party | Everyday experience |
|---|---|
| Buyer | Grid bill unchanged in shape; credit appears when match qualifies; pays (or receives) the CfD so net cost of the hedged slice sits near the strike; may pay a small vendor fee |
| Seller | Earns the CfD receivable (or pays if credit > strike); does not get paid for unmatched surplus on a matched-basis deal |
| Eskom | Still sells the buyer grid energy; pays the WER credit on qualifying volume — does not re-point meters |
9.2 Matching — the overlap that earns the credit
Hour by hour (or interval by interval), the platform looks at:
- how much the plant produced, and
- how much you consumed.
The matched volume is the smaller of the two. Only that overlap is the volume the hedge usually cares about when settlement volume basis is Matched (glossary, settlement volume basis).
| Situation | What it means in money |
|---|---|
| Plant making power and you using it | Those kWh are matched → can earn WER + settle strike |
| Plant making power while you are off | Surplus — no WER on that slice for you; under Matched basis you do not pay strike on it either |
| You using power while the plant is quiet | You just buy the grid as usual — outside the hedge |
Note. A short conceptual story in V0 §5 shows the pure “strike vs credit × volume” algebra. On this platform the volume that enters that algebra is normally the matched slice (see the worked day in §9.4 and V8 §14).
Tiny hour (intuition only)
| kWh | |
|---|---|
| Plant output this hour | 100 |
| Your site use this hour | 40 |
| Matched | 40 |
| Unmatched plant surplus | 60 — not on your hedge if basis = Matched |
If instead you used 120 while the plant made 100, matched = 100 and the other 20 kWh is plain grid (outside the hedge).
9.3 The money formula (plain words)
For each time-of-use band on the matched volume:
- Eskom WER credit to buyer ≈
WER rate × matched kWh - CfD between buyer and seller ≈
(strike − WER rate) × matched kWh- Strike above WER → buyer pays seller the gap.
- Strike below WER → seller pays buyer the gap.
- Buyer’s net on that slice ≈ WER received + CfD paid (or minus CfD received) → aims at strike × matched kWh (before vendor fee).
- Vendor fee (if any) ≈
fee rate × matched kWh— usually buyer → VWP.
The engine often posts this as:
- an energy line at
(strike − WER rate), and - a separate wer_credit line the buyer receives from Eskom
— same economics, clearer on the statement (V8 §14).
9.4 Worked day — both pockets (demo data)
One settled day on the thread’s direct virtual PPA. Same numbers the settlement screen uses.
Data. full_demo · seed 42 · stages S04/S09 · sealed 2026-07-15 · re-derived 2026-07-18 ·
VPPA-202607-138349269· period 2026-07-03 · statusDRAFT· topologyeskom_vwa· M8 commit925037a. Seller: IPP 3 (IPP3 Midrand Hybrid). Buyer: OffTaker C (George Eskom Plant).
Inputs
| Value | Plain meaning | |
|---|---|---|
| Agreement | VPPA-202607-138349269 |
The virtual contract |
| Deal type | OFFTAKER_IPP |
Plant → site (no trader in the middle) |
| Strike | FLAT 92.0 c/kWh | Agreed hedge price |
| VWP vendor fee | 1.25 c/kWh | Small admin on matched volume |
| Frequency | DAILY | This demo day settles once for 3 Jul 2026 |
Step 1 — how much overlapped?
| Quantity | kWh |
|---|---|
| Supply (IPP3 metered share for this claim) | 463.696 |
| Demand (George metered) | 14,599.999 |
| Matched = delivered | 463.696 |
| Unmet demand on this claim | 0 — George still draws the rest from the grid outside the hedge |
TOU split of the match:
| TOU | Matched kWh |
|---|---|
| Peak | 90.347 |
| Standard | 373.349 |
| Off-peak | 0 |
| Total | 463.696 |
Step 2 — rates by band
Strike is flat 92 c. WER credit rates differ by TOU.
The energy (CfD) rate the ledger posts is strike − WER:
| TOU | Strike | WER credit | Energy rate (buyer → IPP) |
|---|---|---|---|
| Peak | 92 c | 25 c | 67 c
(92 − 25) |
| Standard | 92 c | 15 c | 77 c
(92 − 15) |
Step 3 — rand by band
| TOU | Qty kWh | Energy (buyer → IPP) | WER (Eskom → buyer) |
|---|---|---|---|
| Peak | 90.347 | 90.347 × 0.67 = R
60.53 |
90.347 × 0.25 = R
22.59 |
| Standard | 373.349 | 373.349 × 0.77 = R
287.48 |
373.349 × 0.15 = R
56.00 |
| Total | 463.696 | R 348.01 | R 78.59 |
Admin (VWP): 463.696 × 1.25 c = R 5.80
(buyer → vendor).
Step 4 — buyer’s pocket (George)
| Line | Amount | Direction |
|---|---|---|
| Pay seller (energy / CfD) | R 348.01 | out |
| Pay VWP vendor (admin) | R 5.80 | out |
| Receive WER credit | R 78.59 | in |
| Net on this period’s hedge | −R 275.22 | 348.01 + 5.80 − 78.59 |
Check without admin: 348.01 − 78.59 = R 269.42 ≈
92 c × 463.696 kWh (strike × matched). The R
5.80 fee is the extra on top.
George’s ordinary Megaflex bill for the other ~14,136 kWh of the day is unchanged by the hedge — still paid to Eskom as a normal retail customer.
Step 5 — seller’s pocket (IPP 3)
| Line | Amount | Direction |
|---|---|---|
| Receive energy / CfD | R 348.01 | in |
| WER | — | Eskom pays the buyer, not the IPP |
| VWP fee | — | buyer pays the vendor on this deal shape |
| Net on this period | +R 348.01 | receivable |
Step 6 — prove the ledger still balances
| Party | Category | Amount |
|---|---|---|
| IPP3 Midrand Hybrid | energy | +R 348.01 |
| George Eskom Plant | energy | −R 348.01 |
| George Eskom Plant | wer_credit | +R 78.59 |
| Eskom | wer_credit | −R 78.59 |
| VWP Vendor | admin | +R 5.80 |
| George Eskom Plant | admin | −R 5.80 |
| Σ | 0 ✓ |
Every rand has an opposite. That is the same conservation rule as physical settlement (V8 §8).
Follow along. Seat: IPP 3. Path: Contracts →
VPPA-202607-138349269→ Settlements → 3 Jul 2026. Virtual pill on; matched ≈ 464 kWh; seller net R 348.01; ledger Σ = 0. Switch to the George seat for the same period to see WER +R 78.59, admin −R 5.80, and net −R 275.22.
9.5 What changes if the credit is above the strike
Same matched volume, imaginary WER 120 c and strike 92 c:
- Energy rate =
92 − 120 =−28 c → seller pays buyer. - Buyer still ends near strike × matched before fees; the cash just flips direction on the CfD rail.
That flip is why a virtual deal is a hedge, not a one-way invoice.
9.6 Settlement volume basis — which kWh enter the formula
| Basis | Plain meaning | Risk picture |
|---|---|---|
| Matched (demo day above) | Only the overlap settles | Unmatched plant output does not bill the buyer at strike |
| Generated | Buyer can owe strike on plant output even when not consuming | Higher unmatched exposure for the buyer if shapes diverge |
Advisors warn when a generated basis plus a high yield promise would force the buyer to pay strike on volume they cannot match (§4.7).
9.6.1 The market-indexed floating leg
The formula in §9.3
nets the strike against Eskom’s gen-wheeling / WER
credit. That is the default floating reference
(ESKOM_CREDIT_RATE) and the only one the estate used before
this choice existed. Existing ACTIVE virtual PPAs keep it — the wizard
does not make you re-pick it.
Step 4 of the virtual wizard (Tariff & Pricing)
now also offers two market-indexed legs. Both read the
published SAWEM day-ahead System Marginal Price — the
same public board as GET /api/v1/dam/prices/{trading_date}
— never an unpublished working result.
| Floating reference | What the strike is netted against | Buyer exposure in plain words |
|---|---|---|
| Eskom’s regulated rate (default) | Gen-wheeling / WER credit for the buyer’s tariff category, once per settlement month | Net cost of the hedged slice aims at strike. WER still posts from Eskom to the buyer. |
| SAWEM market price | Volume-weighted SMP across the whole settlement window | The CfD floats with the wholesale market. A high SMP period shrinks (or reverses) what the buyer pays the seller. |
| SAWEM market price averaged by time-of-use | The same published SMP, volume-weighted inside peak / standard / off-peak | Same board, split the way a TOU strike already is. Peak hours can print a different index from overnight. |
What changes in the buyer’s pocket
On the Eskom-credit leg, WER received plus CfD paid still aims at
strike × matched kWh (before the vendor fee). On a
market-indexed leg there is no WER pair. The Wheeled
Energy Refund is an Eskom-tariff mechanism; a SAWEM index has no Eskom
counterparty to pay it. The ledger posts only the signed
energy pair:
CfD = matched kWh × (strike − realised index)
- Strike above the realised index → buyer pays seller.
- Strike below the realised index → seller pays buyer.
The buyer’s grid bill is unchanged either way. What moved is the other rail: regulated credit vs published SMP. Leave the default and nothing about today’s Eskom-credit contracts changes, in cents.
The settlement page and the statement show the index label and the period’s realised average next to the strike. Those figures are the ones the ledger already used — they are not recomputed from raw intervals when you open the page.
A worked TOU-average figure lives in §8.10. Settlement maths and the missing WER lines are in V8 §7.4, V8 §8.7, and V8 §9.11.
9.7 What the system suggests when you compose
Suggestions are chips with reasons — never silent autofills.
Buyer — strike cap. Rough break-even is
retail context + WER − VWP fee on matched
volume. The recommended cap sits a little below that (cushion ≈ 90%) so
you keep a slice of value. Figures name the matched volume they were
sized on.
Seller — strike ladder. Public flat and TOU rows; floors stay private. Because WER itself is TOU-differentiated, a TOU strike can line up with the buyer’s credit without giving away volume. You still cannot sell below LCOE + margin — that floor remains a hard block.
Start date and conditions precedent. Prefill from facts on file (VWA, licence, meters, grid, insurance, environmental). The earliest sensible start usually waits on the slowest open CP — most often VWA approval. A start date before VWA clearance is the most common avoidable error.
9.8 Where to go next
| Question | Where it is taught |
|---|---|
| Physical vs virtual in one page | V0 §5 |
| How you contracted this deal | V7 §8 |
| Strike / WER / basis in the wizard | V7 §4.5 · §4.7 · §9.6.1 |
| Procurement Desk (virtual volumes, not “saving”) | V3 §13.2 |
| Full settlement explorer day (same numbers) | V8 §14 |
| Ledger conservation | V8 §8 |
| A VW portfolio rather than this per-contract hedge | V17 |
9.9 Virtual Wheeling is not this deal
The Deal Room’s Eskom Virtual PPA is one IPP and one off-taker site, with a strike-versus-credit settlement and the Wheeled Energy Refund netted inside that contract. Eskom’s own register is something else: a Virtual Wheeling account that holds many generators and many meters, and pays one consolidated refund to the named account holder within forty-five days.
A site may be both a Virtual PPA counterparty and a VW portfolio member. The two paths never share a statement — classic wheeling stays at 20-minute grain; Virtual Wheeling is 15-minute throughout. Compose the portfolio, read the refund, and follow the 45-day term in V17.
