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.

prompt 1
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.

prompt 2
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_candidate03 — The NEM 2.0 Battery Play
warranty_window, service_due, monitoring_gap04 — The Warranty Window
dead_quote_aged, dead_quote_recent05 — Dead Quote Resurrection
aftermarket_only02 — 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