The Ledger

Notes from building Sunledger, written by Shawn North. What the bills teach us, what breaks, what ships. RSS

Start here

The $994 bill that started this

For years my solar credits quietly paid the small monthly charges and I stopped thinking about electricity. Then I changed one pool pump schedule and the year ended in a $994 true-up. This is the story of why Sunledger exists.

Read the story →

August 20, 2026 / No. 7

The bills I can't read

I only read SCE bills. Everything else gets turned away with an offer to learn yours by hand and email you back, and the bills people lend me teach me a whole utility at a time.

Until today the refusals themselves left no trace, so what to build next was guesswork. Now every one gets counted. Which kind of refusal it was, the utility's name, the rate plan code if the bill printed one. No file, no email, nothing off the bill. I skipped saving a fingerprint of the file, which would have made my counts cleaner, because that isn't mine to keep.

The refusal a PG&E customer sees, offering to learn their bill by hand.

What a PG&E customer sees.

Two small fixes rode along. The refusal names the utility it saw instead of pointing everyone at sce.com, and saying no thanks gets a friendly note back now instead of a red error.

Nothing on the tally yet but my own test drops.

August 18, 2026 / No. 6

Your bills, side by side

Save a second bill and Sunledger now shows your trend. The year-long tab climbing month over month toward its settlement, your account credit draining, the daily connection charge drifting. Every line is arithmetic on bills you saved, so you can check any of it against your own paper.

It lied to me within the hour. My card announced my connection charge had gone up 2,458.4%. What actually happened is that SCE restructured the old basic charge, 3.1 cents a day, into the larger base services charge, 79.4 cents a day, somewhere between my August and December 2025 bills. Different name, same job, most of the money moved from somewhere else on the bill. A trend that compares two different charges isn't a trend, it's a lie with an axis. The card now explains the restructure instead, which is worth more than any percentage, because that change confused plenty of people and no bill ever explained it.

My trend card, built from three of my own bills.

My own card, from three bills of my flip year. The tab climbing toward its settlement, and the restructure explained instead of a made-up price rise.

Keep reading →

August 18, 2026 / No. 5

The bugs were all in the words

I spent two days feeding my own bills back through the reader and checking every sentence against the paper. Five bills, from month one of my billing year to the $994.36 settlement. Every number came out right. The bugs were all in the words. The month the state's $36 Climate Credit flipped my bill negative, the reading said my charges had been "taken out of" my credit. Backwards, money went in. One function call was the cause, an abs() that erased the minus sign before the sentence was written.

// Before. abs() erased the direction, so -$5.76 added
// became "$5.76 taken out of that credit".
$this->money(abs($bill->newChargesUsd));

// After. Keep the sign, and let it choose the sentence.
$bill->newChargesUsd < 0
    ? 'this month added to it rather than draining it'
    : 'the small fixed charges come out of it';

Another card told me my meter "finished the year" two months into it. A third quoted the Climate Credit at $56 from memory, when this year's is $36.

Keep reading →

August 17, 2026 / No. 4

The two cent robbery

Before the year of the $994 bill, I had the opposite problem. My panels made more power than the house used. A lot more. The year that ended in June 2024, I sent SCE 5,580 more kilowatt hours than I bought back. At SCE's own rates, printed on my own settlement, that surplus was worth $1,191.38.

They paid me $129.12.

The math is right there on page 5. 5,580 kWh times $0.02314. Two cents and change per kilowatt hour, for power they turn around and sell to my neighbors at 30 to 60 cents depending on the hour. By their own accounting my surplus was worth almost twelve hundred dollars, and they kept 89% of it. The bill discloses this in a footnote, which warns that the amount you receive "may be less" than your year-to-date energy charges. May be less. It was about a tenth.

Robbery. There's no other word for it. I didn't use less power that year, I gave SCE more than I took, and the reward for that was two cents on a kilowatt hour they resell at retail the same evening.

The rate has a name, Net Surplus Compensation, and SCE publishes it every month. Here's their page as of this week. Every single month on the list is under two cents.

Keep reading →

August 14, 2026 / No. 3

We rebuilt Sunledger this week

Sunledger used to be a watchdog. You connected your solar system and your SCE account, and it watched your true-up all year and warned you before the surprise. I built it because of my own $994 bill, and it worked. It reproduced my real settlement within about 1%.

The problem was everything before "it worked." It took three connections before it could say a single word. A SolarEdge API key, your SCE login through a data partner, and an onboarding wizard. I watched myself put off my own product's setup, which is a special kind of signal.

Meanwhile I'd built a side page where you could just drop the PDF of a bill and get it explained. I fed it my own bills, and the thing I kept noticing was that it told me in ten seconds what the watchdog needed three integrations to say. If I'd had that one page in month 6 of my true-up year, it would have changed what I did.

So that page is the product now. Drop your electric bill in, get it back in plain English. Free, no account, nothing connected.

The Sunledger home page, a drop zone for your electric bill.

The whole product. The home page is a drop zone.

Keep reading →

August 13, 2026 / No. 2

Your bill is two sets of books

The most confusing thing on a solar bill is a credit balance sitting on the same page as a four-figure charge. Mine showed both at once, a couple hundred dollars of credit up front and $954 of year-to-date charges buried further in. People see that and conclude the bill is wrong. It isn't. It's two ledgers.

The first ledger is cash on your account. It pays the small fixed monthly charges, the connection fee and the fees the state adds to every kWh, and it drains a little every month. That's the credit you see on page 1.

The second ledger is your energy. Everything you buy and everything your panels send out nets against each other all year on a running tab, and none of it is billed monthly. The two ledgers touch exactly once, at the annual true-up, when whatever credit is left gets applied against whatever the tab has grown to.

Keep reading →