Database X-Ray
Find every reactivation opportunity hiding in your install base.
Paste your CRM export, get back a spreadsheet where every customer is tagged with which opportunity they represent, how urgent it is, and why.
Run this one first. Four of the other plays take its output as their input.
Before you start: do not paste your customers' names, addresses, emails, phone numbers, or install photos into any AI tool. You don't need to — sorting your database runs on dates and equipment, not identities. Export a row ID and join the names back in your own spreadsheet at the end.
Stage 1 — Map your export
Export your customer/job list, then copy just the header row and a few sample rows. We only need the shape of your data, not the actual data.
You are a data analyst who specialises in messy CRM exports from residential
solar installers. I am going to show you the header row and a few sample rows
from my CRM export. Work out what I have before I send you the full file.
### YOUR TASK
1. MAP MY COLUMNS to the canonical fields below. For each, tell me which of my
columns matches it, or say NOT PRESENT.
- row_id unique per-record identifier
- install_date when the system was energised or the job completed
- status installed / quoted / lost / cancelled / in progress
- quote_date when a bid was issued
- quote_amount bid value
- system_kw system size in kW DC
- inverter_make e.g. SolarEdge, Enphase, SMA, Fronius, Tesla
- inverter_model e.g. IQ8, HD-Wave, Sunny Boy
- has_battery whether storage is already installed
- financing_type cash / loan / lease / PPA / TPO
- utility serving utility or territory
- state US state
- monitoring whether monitoring was registered or is active
- last_service date of most recent service visit
- do_not_contact opt-out, complaint, litigation or bad-debt flags
2. FLAG COLUMNS TO EXCLUDE. Call out any column holding personal information
(names, addresses, emails, phone numbers) or any column holding photos,
documents, or file links. I will not be sending these.
3. IDENTIFY WHAT'S MISSING. For each field marked NOT PRESENT, tell me whether
it can be inferred from another column and how confident you'd be. Be blunt.
I would rather know a field is unreliable than get a confident guess.
4. WRITE MY EXPORT SPEC. Finish with a plain list of exactly which of my column
names to include in the real export, in order.
### RULES
- Do not guess at a mapping you are not reasonably confident in. Say NOT PRESENT.
- If two of my columns could be the same canonical field, say so and tell me how
to tell them apart.
- If my export holds several record types (jobs, quotes, leads, service tickets)
in one file, say so and tell me how to separate them.
- Never ask me to include a name, address, email, phone number, or photo link.
### MY EXPORT
[paste your header row and a few sample rows here]Stage 2 — Classify your database
Re-export using the column list Stage 1 gave you. If the file is large, do a few hundred rows at a time and stack the results — classification is per-row, so splitting changes nothing.
You are a data analyst who specialises in residential solar customer databases.
I am giving you a CSV export of my install and quote history with all personal
information removed. Classify every row into the cohorts below.
### COHORTS
Assign every row one or more. A row can carry several.
battery_candidate
Installed, no battery already, on a grandfathered net-metering arrangement,
and the customer OWNS the system.
- In California, NEM 2.0 grandfathering runs on the INTERCONNECTION
APPLICATION date, not the install date. Applications submitted on or before
2023-04-14 keep NEM 2.0 for 20 years. From 2023-04-15 onward, NEM 3.0.
My export almost certainly has an install date and not an application date,
so treat install date as a PROXY and be explicit about it:
* installed before 2023-01-01 -> almost certainly NEM 2.0
* installed during 2023 -> AMBIGUOUS. There was a rush of applications
before the April deadline, so a mid-2023 install may well be
grandfathered. Mark battery_candidate_unconfirmed and tell me to check
the application date. Do not silently exclude them.
* installed 2024-01-01 onward -> almost certainly NEM 3.0
- Outside California: rules and grandfathering dates vary by state and
utility. Do NOT invent a cutoff date. Mark battery_candidate_unconfirmed
and tell me which date I need to confirm for that utility.
warranty_window
A string or central inverter installed 9 or more years ago. These typically
carry 10-12 year warranties. Microinverters and optimisers typically carry 25
years — do NOT put them in this cohort. If inverter type is unclear from the
make and model, say so rather than guessing.
monitoring_gap
Installed, but monitoring was never registered or is inactive. These customers
cannot see production loss and will not report a fault.
service_due
Installed 5 or more years ago with no service visit on record.
dead_quote_recent
Quoted within the last 18 months, never sold.
dead_quote_aged
Quoted more than 18 months ago, never sold.
aftermarket_only
Blocked from equipment upgrades — typically lease, PPA, or third-party-owned.
Still reachable for cleaning, monitoring, EV charging, and referral offers.
insufficient_data
Cannot be classified from the fields provided. Say which field would fix it.
### DISQUALIFIERS
Record these in a separate column. Do NOT use them to delete rows or to strip
other cohorts — a customer blocked from a battery is still a good aftermarket
customer, and that distinction is where the revenue is.
do_not_contact opt-out, complaint, litigation, bad debt. Overrides
everything. Never assign this row to a campaign.
tpo_owned leased / PPA / third-party-owned. Blocks equipment
upgrades. Does NOT block aftermarket or referral offers.
no_contact_method no usable way to reach them in my system.
### PRIORITY
Score each row 1-5, where 5 is act first. Weigh by how time-sensitive the
opportunity is and how strong the existing relationship is. An inverter about to
leave warranty outranks a five-year-old lost bid.
### RULES
- Never invent a value. If a field is missing, mark the row insufficient_data
rather than filling the gap with a plausible guess.
- Never drop a row. Every input row appears in the output.
- Do not reference the federal 25D residential tax credit as a live incentive.
It expired for expenditures after 2025-12-31. If tax treatment is relevant,
say it needs checking rather than asserting it.
- No personal information in your output. Refer to rows by row_id only.
- The reason column is for me to audit your judgement. Write it so I can
disagree with you.
### OUTPUT
A CSV with exactly these columns:
row_id | cohort | priority | reason | disqualifier
Multiple values in one cell separated by semicolons. Plain text I can copy
straight into a spreadsheet.
Then a summary block: count of rows per cohort, count per disqualifier, and a
short note on anything that looked wrong, inconsistent, or worth a second look.
### MY DATA
[paste your CSV here]What to do with it
VLOOKUP on row_id to bring names and contact details back from your original export, then pick your play:
| Lots of… | Run |
|---|---|
battery_candidate | 03 — The NEM 2.0 Battery Play |
warranty_window, service_due, monitoring_gap | 04 — The Warranty Window |
dead_quote_aged, dead_quote_recent | 05 — Dead Quote Resurrection |
aftermarket_only | 02 — The Rev-Share Play |
Before you email a list this size, read 08 — Don't Torch Your Domain.
Want this run for you instead of by you? That is the job.
adrian@atlasautomates.com
· atlas automates