Skip to content

Monthly Savings Report

On the 1st of each month, Grid Getter crunches the previous month’s data and emails you a savings report. It covers what your battery earned by discharging during peak hours, what your solar saved you, what you got paid for excess export, and — for SRP and APS demand-plan customers — how much the battery shaved off your peak demand charge.

The report breaks down into:

  • Total estimated savings for the month
  • Per-kWh savings from battery discharge
  • Solar savings (self-consumption value plus net metering credits)
  • Demand savings, if your plan charges demand (SRP and APS only)
  • Energy totals: solar produced, battery discharged, grid imported
  • How many times your automations fired
  • A shareable link to a public report card

Each report includes a unique link at gridgetter.com/r/<token>. Anyone with it can see your savings summary — no login needed. If you have a referral link, it gets embedded automatically; when someone signs up through it, you both get a free month.

  • An active, connected Tesla Powerwall site
  • An energy plan set up in Settings → Energy Plan

No energy plan means no report. The calculations need your rate schedule to mean anything.


Grid Getter works from a counterfactual: what would you have paid without the battery and solar, versus what you actually paid? Every data point gets priced at the TOU rate in effect at that exact hour.

Every kWh record gets assigned a TOU period (ON_PEAK, OFF_PEAK, SUPER_OFF_PEAK, etc.) and a rate. The lookup works like this:

  1. Convert the UTC timestamp to your local timezone
  2. Find the season (Summer, Winter, etc.) based on the month
  3. Walk that season’s TOU windows to find one whose day-of-week and time-of-day range contains the timestamp
  4. Pull the import rate from energy_charges and the export rate from sell_tariff.energy_charges for that season + period

If no window matches — which shouldn’t happen with a well-formed tariff — the calculator falls back to OFF_PEAK rates and logs a warning.


For each hourly bucket, Grid Getter computes:

discharge_value = battery_kWh_discharged × import_rate_at_that_hour
charge_cost = battery_kWh_charged × import_rate_at_that_hour

Every kWh the battery discharged is a kWh you didn’t buy from the grid, valued at whatever rate was in effect that hour. Every kWh that went into charging is a cost, because without the battery you wouldn’t have pulled that energy. Net savings:

per_kWh_savings = max(sum(discharge_value) − sum(charge_cost), 0)

The max(..., 0) floor handles edge cases where the battery charges and discharges mostly off-peak, making the cycle net-zero or slightly negative. That shouldn’t count against you.


Two things roll into solar savings.

Self-consumption is the solar your home used directly — energy that didn’t touch the grid in either direction:

solar_self_consumed_kWh = max(solar_kWh − exported_kWh, 0)
self_consumption_value = solar_self_consumed_kWh × import_rate

You didn’t buy it, so it’s valued at what you would have paid for grid power at that hour.

Export credits are what the utility paid you for the excess:

export_credit = exported_kWh × export_rate

Export rates come from sell_tariff.energy_charges — your net metering or buyback rate, which is usually lower than your import rate.

solar_savings = self_consumption_value + export_credits

Demand savings (SRP and APS customers only)

Section titled “Demand savings (SRP and APS customers only)”

Demand charges are based on your single highest average power draw during any billing interval in on-peak hours — not your total consumption for the month, just your worst moment. The battery helps by covering that spike with stored energy so your grid draw stays lower.

Demand interval: 30 minutes for SRP, 60 minutes for APS.

For each raw telemetry sample during on-peak hours:

  1. Assign it to a demand interval bucket, aligned to clock time in your timezone
  2. Track two values per sample: actual grid kW, and counterfactual grid kW (actual + battery discharge kW)
  3. Average all samples within each bucket
  4. The highest bucket average across the month is your peak demand for that season/period

Savings are then calculated as:

For flat-rate demand plans:

demand_savings = (peak_without_battery − peak_with_battery) × demand_rate

For tiered plans, where the rate itself changes as demand crosses thresholds:

demand_savings = tiered_charge(peak_without_battery) − tiered_charge(peak_with_battery)

Only periods with a demand charge entry in your tariff count. If the battery produced zero reduction, demand savings are omitted from the report.

The report card shows both the actual and counterfactual peak in kW so you can see exactly how much the battery shaved.


total = per_kWh_savings + solar_savings + demand_savings

demand_savings is 0 for energy-only plans or any month where the battery didn’t reduce the peak.


ComponentSource
Energy savings + solarHourly rollups (HistoricalPowerHistoryHourlyRollup)
Demand savingsRaw 1-minute telemetry (HistoricalPowerHistory)
Automation countAutomationActionLog, scoped to the calendar month
TOU ratesYour saved energy plan (SiteTariffTable)

The cron fires on the 1st of each month. It queries a ±1 day UTC window to handle timezone edge cases, then filters down to records that fall within your local calendar month.


Why is demand savings missing from my report? Demand savings only appear for SRP and APS plans with demand charges configured. Energy-only plans don’t generate this section.

My kWh numbers are lower than what the Tesla app shows. Why? Grid Getter’s pipeline starts collecting data when you connect your account. Anything before that date isn’t in the system.

Can I pull up an old report? Yes — every email has a permanent shareable link. The report card stays live as long as your account is active.

The numbers look wrong. What should I check? Start with Settings → Energy Plan. If the TOU periods or rates are misconfigured, all three savings components will be off.