Energy analysis for a solar installation company's customers: the engine behind the comparison in the showreel.
Built an energy intelligence platform that analyses electricity and gas bills, compares them against the Australian energy market, and forecasts wholesale prices—including VPP modelling, government Solar Sharer schemes, and more. Its Amber Electric VPP estimate achieved accuracy within $42 per year of real-world costs, supported by a custom forecasting engine and a high-performance optimiser written in Rust.
The hard part of an energy comparison is not the maths, it is the bill: every retailer prints a different one, and nobody wants to type it in. RenewCompare reads a photo or PDF of the bill, prices the customer's real usage against the market and returns a ranked comparison with the annual cost of each plan, as a report in plain words with the plan code printed on it so the customer can quote it to the retailer. The sales team runs it in the appointment, on the customer's own bill. Where a figure cannot be supported it is withheld rather than guessed, and estimates are labelled as estimates.
$42 / yrhow close the Amber Electric estimate lands to real costs
1 billis all the customer has to provide
27 yrsof market data behind each forecast
From bill to comparison
Every plan priced on its own published terms
A bill says how much was used and what it cost. Plans differ in when the cheap hours fall, how the rates change with the seasons and what the first kilowatt-hours of solar earn. The engine keeps the bill's totals as the truth, models only when in the day they happened, and prices every plan on the terms its retailer published.
One bill, end to end
1Read the billA photo or PDF becomes structured fields: usage by time of day, rates, supply charge, controlled load, demand, tiered feed-in and any guaranteed discount. Staff check what was read before anything is priced.
2Shape the dayHalf-hourly load and solar shapes are sized from the bill, with a battery pass where there is one, then scaled so imports and exports equal the bill exactly.
3Price every planEach plan's time windows, seasons, daily tiers, demand charges and feed-in are applied to that profile over a whole year, each season once, then scaled to the bill's days.
4RankPlans rank by the figure the customer will see, GST included, one plan per retailer. Demand-tariff and other special plans sit in their own list.
5ReportA PDF the customer keeps: each plan's annual cost, rows that add up to the price, the plan code to quote, and a note to re-run the report if it is more than 30 days old before changing retailer.
The national plan catalogue
Plans come from the Consumer Data Right feed, the regulated source Energy Made Easy itself runs on, synced every night. More than 21,000 active plans are stored with their full published terms rather than flattened into one rate per bucket.
Bills that don't fit the mould
Wholesale-passthrough invoices itemise the market instead of printing a price list, so they get their own fixed-template reader, which parsed 18 of 18 real invoices. Controlled load, demand charges and tiered feed-in are read from the bill and priced.
The right code for the meter
Retailers publish a separate offer for each meter setup, often at the same price. Ties are broken by the customer's own controlled-load setup, so the plan code on the report is the one that fits their meter, and the report says to mention a separately metered controlled load.
Gas, solar and a new system
Gas bills are compared the same way. Beyond the bill, it models solar payback, and what today's bill becomes with new solar, a battery or an EV, priced on the projected usage rather than on today's bill alone.
The wholesale side
27 years of the market, and a forecast of the next week
A wholesale-passthrough plan cannot be priced from a rate card: its price follows the market, which settles every five minutes. So RenewCompare carries its own model of the National Electricity Market, built on AEMO's published data.
27 years of prices
Every month of AEMO's price and demand archive since December 1998, for all five regions: about four million half-hours. The full archive feeds the history and the statistics; the forecasting models train on 2019 onwards, the market as it runs today.
A forecast with a range
Gradient-boosted quantile models, one per region and quantile, give a low, middle and high price for every half-hour of the next seven days. Spikes are capped when training the middle forecast so a rare event doesn't bend a typical day; the high forecast keeps the tail. On a full year held out from training, they beat the standard week-ago baseline by roughly 20–40% in every region.
A battery schedule in under a millisecond
The optimiser is an exact dynamic program over the battery's state of charge, written in Rust. It respects the export limit, curtails rather than exports when the feed-in price is negative, and prices a drained battery instead of counting it as savings. It is fast enough to run per plan, per month and per scenario, and tests hold it to the same answers as its Python twin.
Refreshed every night
A scheduled job fetches the current month, retrains every model, rewrites the forecasts and the price statistics, and runs the tests. Nothing is published unless they pass, so a failed night leaves the last good forecast serving.
Keeping it honest
Measured against real data, and withheld where it can't be supported
A comparison is only worth something if the cheapest plan was actually considered and the figure on the page is the one the customer will pay.
Checked against measured homes
I took three homes with real half-hourly meter data, priced every plan exactly on that data, then gave the engine only the bill totals. When bucketed rates put the wrong plan first, I moved pricing onto each plan's full published terms. Afterwards, the plan it ranked first from the bill alone was the cheapest on the main list for all three.
Checked against real invoices
The wholesale average printed on real wholesale-passthrough invoices tracks the pipeline's own market average month by month, a little above it, as a household's evening-heavy load and network losses predict. It is an outside check on the market data itself.
Rows that add up
Every plan's breakdown adds up to the price quoted. Fees, discounts and any modelled adjustment get their own rows, and a remaining gap is shown as “Other adjustments”, never hidden. The acceptance check is a real response of 518 plans with no row off.
Estimates labelled as estimates
The Amber Electric VPP estimate is titled as an estimate and shown as a range, with no plan code or rates, and its saving reads “Save up to”. In a new-system comparison every money figure is an estimate, and the wholesale plan is a range, never one number.
Withheld, not guessed
No demand line on the bill means no demand charge. A plan code is printed only when it is the retailer's real code. When a bill's GST basis is unclear, the yearly analysis rebuilds the bill both ways and lets the printed total decide, and it abstains when the rebuild is incomplete.
Tested at every seam
2,300+ automated tests sit behind the engine and its services. Contract tests fail any change that would break the API the Salesforce version calls, the rule that makes rows add up is tested in each copy that prints a report, and the Rust optimiser is tested against its Python twin.
Where it runs
Two front doors, one engine
RenewCompare runs in-house as an internal tool. Staff use a console in the browser, and a version built for Salesforce puts the same tool on the customer’s account page. Both call the same engine.
The staff console
Bill comparison, solar payback, and gas alongside electricity.
Your new system: today's bill against the bill with new solar, a battery or an EV.
Yearly analysis: up to ten bills for one customer, usage from every bill, priced at the latest bill's rates.
Batch reports: up to 20 bills in one pass, out as branded customer PDFs.
A wholesale desk: spot prices, the seven-day forecast and the battery optimiser.
It sits behind the company's single sign-on, and the engine's credentials stay on the server: the browser never holds a token.
Inside Salesforce
Built for the customer's account page, where the sales team already work.
Upload the bill, check the details read from it, and get the ranked report in the appointment.
A solar payback report alongside the bill comparison.
Download the customer PDF: the same branded report the console produces.
The same rules as every other report: plan codes, the re-run note, rows that add up and estimates labelled as estimates.
When the engine refuses something, the user sees its plain message.
The phone app. A phone app was built with Expo to product standard and kept release-ready. It was shelved when the company chose to run RenewCompare as an internal tool, and the code is kept. More of my Salesforce work is on the Salesforce page.