Phase I Report Autopilot
A free setup that writes the boilerplate 70% of a bank-ordered Phase I ESA, fills every address and date automatically, and leaves you doing only the part you're actually paid for: the judgment.
What can be automated, and what can't
A Phase I ESA is a legal product. A bank lends real money against it, and the CERCLA landowner-liability protections it supports depend on it having been done to the standard by a named Environmental Professional. So before building anything, be clear about the line.
Four things stay human. Permanently.
- The site visit. Walking it, the photos, the drums and staining and stressed vegetation and floor drains. No AI substitute exists.
- The interviews. Owner, occupants, the local fire marshal or building department.
- The opinion. Whether something is a REC, a CREC, an HREC, or de minimis is the EP's call, and it's the whole reason the report has value.
- The signature. Signing an EP statement over facts nobody verified is the one genuinely career-ending move in this field.
Everything else is typing. Repeating the address 40 times, restating the same boilerplate scope language, turning field notes into third-person past tense, formatting the off-site listing table. That's what this system takes over.
Two hard rules make the whole thing safe: the AI never invents a fact, and the AI never renders an opinion. It only rewrites and arranges information you hand it. Everything below is engineered around those two rules.
Five parts
Nothing here is exotic. It's a spreadsheet, a folder, a template, an AI project, and a checklist — wired so each one feeds the next.
Build the Job Sheet
This is the spine. Every fact in it gets pushed into the report automatically later, so it has to be typed correctly exactly once.
- Open a new spreadsheet — Google Sheets (free) or Excel, whichever you already use.
- Name it
Job Sheet. - Paste the header row below into cell A1. It will spread across the columns.
- Each new property from the bank becomes one new row. That's the only data entry you do.
Column names have no spaces on purpose — the merge step needs them that way.
ProjectNumber SiteName SiteAddress SiteCity SiteState SiteZip County APN Acreage ClientName ClientContact ClientAddress DateReceived VisitDate ReportDate DatabaseVendor DatabaseDate EPName EPTitle Status ReportLink
Tip: put ReportDate in as plain text like September 3, 2026, not a date-formatted cell. Merge fields sometimes turn real dates into 9/3/2026 0:00:00, and you don't want that on a cover page.
Set up the Data Pack folder
One folder per property, named so it sorts properly. Everything you gather lands here, and it doubles as your appendix and your file-of-record if the report is ever questioned.
- In Google Drive or Dropbox, make a folder:
Projects. - Inside it, one folder per job named
[ProjectNumber] – [SiteAddress]. - Inside that, six subfolders — copy the names below so they're identical every time:
01 Client & Scope (engagement letter, user questionnaire, title/lien search) 02 Database Report (the radius report PDF) 03 Historical (aerials, topos, Sanborn, city directories) 04 Physical Setting (soils, geology, flood, radon, wells) 05 Site Visit (photos, field notes, sketch) 06 Interviews (notes, emails, agency responses)
Rename every historical file with its year the moment you download it — 1963 aerial.jpg, 1938 Sanborn sheet 12.jpg. You will cite those years by hand a dozen times, and hunting for them later is where the hours vanish.
Turn your template into an auto-filling template
This is the single biggest time saver and it involves no AI at all. Right now you open last month's report and hand-replace the address everywhere. Instead, you mark those spots once and let the software fill them.
If your template is in Microsoft Word (most likely)
Word has mail merge built in. It's free, it's been there for twenty years, and it fills headers and footers too.
- Save your Job Sheet as an Excel file (
.xlsx) if it isn't already. If it's in Google Sheets: File → Download → Microsoft Excel. - Open a fresh copy of your report template in Word. Save it as
MASTER TEMPLATE (merge).docxso you never edit your original. - Go to the Mailings tab → Select Recipients → Use an Existing List → pick your Job Sheet file → choose Sheet1.
- Find the first place the site address appears. Delete the old address. With the cursor there, click Insert Merge Field → SiteAddress. A grey
«SiteAddress»placeholder appears. - Repeat for every repeating fact, everywhere it appears. Cover page, section 1, section 2, figure captions, the EP statement. Don't skip the header and footer — double-click into the header first, then insert the field there.
- Save. You now have a template that fills itself.
Each new job then takes about fifteen seconds: add the row to your Job Sheet, open MASTER TEMPLATE (merge).docx, then Mailings → Finish & Merge → Edit Individual Documents, choose From: 4 To: 4 (whichever row number the job is), and a brand new document appears with every field filled. Save it into that property's folder.
If you'd rather work in Google Docs
Same idea, one click, but you need to paste in a short script. Write your placeholders in the template as {{SiteAddress}}, {{ClientName}} and so on — the double curly braces matter, and the name inside must match your column header exactly.
- Put the template in Drive as a Google Doc. Copy its ID from the address bar — the long string between
/d/and/edit. - Open the folder where drafts should land. Copy its ID from the address bar — the string after
/folders/. - Open your Job Sheet in Google Sheets → Extensions → Apps Script.
- Delete whatever is in the editor, paste the code below, and put your two IDs on the first two lines.
- Click the save icon, then reload the spreadsheet tab. A new Reports menu appears in the menu bar.
- Click any cell in a property's row, then Reports → Make draft from this row. Approve the permission prompt the first time. The finished draft's link gets written into the
ReportLinkcolumn.
// ===== PASTE YOUR TWO IDs BETWEEN THE QUOTES =====
const TEMPLATE_ID = 'PUT_TEMPLATE_DOC_ID_HERE';
const FOLDER_ID = 'PUT_DRAFTS_FOLDER_ID_HERE';
// =================================================
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('Reports')
.addItem('Make draft from this row', 'makeDraft')
.addToUi();
}
function makeDraft() {
const ui = SpreadsheetApp.getUi();
const sheet = SpreadsheetApp.getActiveSheet();
const row = sheet.getActiveRange().getRow();
if (row === 1) {
ui.alert('Click a cell in a property row first, not the header row.');
return;
}
const lastCol = sheet.getLastColumn();
const headers = sheet.getRange(1, 1, 1, lastCol).getDisplayValues()[0];
const values = sheet.getRange(row, 1, 1, lastCol).getDisplayValues()[0];
const addrCol = headers.indexOf('SiteAddress');
const label = addrCol > -1 && values[addrCol] ? values[addrCol] : 'row ' + row;
const name = 'DRAFT Phase I - ' + label;
const folder = DriveApp.getFolderById(FOLDER_ID);
const copy = DriveApp.getFileById(TEMPLATE_ID).makeCopy(name, folder);
const doc = DocumentApp.openById(copy.getId());
const parts = [doc.getBody(), doc.getHeader(), doc.getFooter()];
for (let i = 0; i < headers.length; i++) {
const h = headers[i];
if (!h) continue;
const pattern = escapeForSearch('{{' + h + '}}');
const value = values[i] || '';
parts.forEach(function (part) {
if (part) part.replaceText(pattern, value);
});
}
doc.saveAndClose();
let linkCol = headers.indexOf('ReportLink') + 1;
if (linkCol === 0) {
linkCol = lastCol + 1;
sheet.getRange(1, linkCol).setValue('ReportLink');
}
sheet.getRange(row, linkCol).setValue(copy.getUrl());
ui.alert('Draft created:\n\n' + copy.getUrl());
}
function escapeForSearch(text) {
return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}Build the Writer
This is what replaces pasting into a fresh chat every time. A Project is a chat window with a permanent memory: your template, your past reports, and your rules live inside it, so you never re-explain the job.
- Go to claude.ai or chatgpt.com. Either works; the free tier is enough to test, and paid is about $20/month if you want the better model and longer documents.
- In the left sidebar, click Projects → New project. Name it
Phase I Drafting. - Upload to the project's knowledge: (a) your blank template, and (b) two or three of your best finished reports with client names removed. The finished ones are what teach it your voice — this step is the difference between usable output and generic filler.
- Find the project's instructions box (Claude calls it "Set project instructions"; ChatGPT calls it "Instructions"). Paste the House Rules below in verbatim.
You draft sections of Phase I Environmental Site Assessment reports written to
ASTM E1527-21 and 40 CFR Part 312 (All Appropriate Inquiries). I am the
Environmental Professional. You are not, and you never write as if you are.
HARD RULES
1. NEVER INVENT A FACT. Not an address, site name, year, tank, release, spill,
distance, direction, permit number, owner, business name, well depth, or
database listing. If I have not given it to you, write
[[NEED: exactly what is missing]] and keep going. An empty bracket is a
correct answer. A plausible guess is a serious error.
2. NEVER RENDER THE OPINION. You do not decide what is a REC, CREC, HREC, or
de minimis condition. Draft the sentence and leave the call to me:
"In the opinion of the Environmental Professional, [[EP CALL: REC / not a
REC — with reason]]."
3. FOLLOW MY TEMPLATE EXACTLY. Same section numbers, same headings, same order,
same boilerplate wording. Do not improve it, reorder it, retitle it,
modernize it, or add sections it does not have.
4. USE MY VOCABULARY. Recognized environmental condition (REC), controlled REC,
historical REC, de minimis condition, data gap, significant data gap,
business environmental risk, subject property, adjoining property. Say
"release," not "contamination," unless my template says contamination.
5. DISTANCES ALWAYS IN FULL FORM: "approximately 450 feet north-northeast of
the subject property." Never "nearby," "close to," or "in the vicinity."
6. EVERY OFF-SITE LISTING GETS ALL SIX FIELDS: facility name, address,
database(s) it appears in, distance, direction, and whether it is
up-gradient, down-gradient, or cross-gradient. Any missing field becomes
[[NEED: ...]].
7. TENSE AND VOICE: third person throughout, no "I" or "we." Past tense for
what was observed on the site visit ("The subject property was observed
to be occupied by..."). Present tense for what exists.
8. NO FILLER. No "it is important to note," no "in today's regulatory
landscape," no restating the question, no closing summary paragraph unless
my template has one. No bullet lists inside narrative sections unless my
template uses them there.
WHAT I GIVE YOU
A "JOB FACTS" block. Everything you write must trace back to something in it.
WHAT YOU RETURN
Only the requested sections, in template order, ready to paste — then a final
numbered list titled OPEN ITEMS FOR EP containing every [[NEED]] and
[[EP CALL]] you left behind. No preamble, no explanation of what you did.Then save the intake form below somewhere you can grab it — a pinned note, or a text file in your Projects folder. This is what you fill in and paste for each property.
Draft these sections of my Phase I report: 2.0 Site Description, 3.0 User Provided Information, 4.0 Records Review, 5.0 Site Reconnaissance, 6.0 Interviews, 7.0 Findings. Follow the House Rules. === JOB FACTS === PROJECT Project number: Subject property address: APN / parcel: Acreage: Client / User: Report date: Site visit date and weather: CURRENT USE Current occupant and use: Structures (count, square footage, year built, construction type): Utilities (water, sewer, heating fuel, electric): Paving / surface cover: WHAT I SAW ON SITE USTs or ASTs (size, contents, condition, evidence of former tanks): Hazardous substances and petroleum products stored or used: Drums, containers, stained soil or pavement, stressed vegetation, odors: Floor drains, sumps, pits, clarifiers, oil-water separators: PCB-containing equipment (transformers, hydraulic lifts): Wells, septic, cisterns: Solid waste, fill material, debris piles: Non-scope items noted only (asbestos, lead paint, radon, mold): ADJOINING PROPERTIES North: South: East: West: HISTORICAL SOURCES REVIEWED (source, years, what each one showed) Aerial photographs: Topographic maps: Sanborn fire insurance maps: City directories: Building department / assessor / fire department records: Prior reports provided by user: DATABASE REVIEW Vendor and date of report, search radii: On-site listings: Off-site listings (name, address, database, distance, direction, gradient): PHYSICAL SETTING Topography and slope direction: Surficial soils: Regional geology: Depth to groundwater and inferred flow direction: Flood zone: INTERVIEWS (who, role, date, what they said) OTHER Vapor encroachment screening (ASTM E2600) outcome: Environmental lien / activity and use limitation search outcome: Data gaps and why they exist: User questionnaire returned? Y/N: === END JOB FACTS ===
The blank lines are not a flaw. Leaving a line empty makes the AI write [[NEED: ...]] there, which becomes your own to-do list. That's the mechanism that keeps invented facts out of a signed report.
Gather the Data Pack
The AI can only be as good as what you feed it, and this is the part that stays research. The paid radius report is worth buying and billing through — but everything supporting it has a free source.
| What you need | Where | Cost |
|---|---|---|
| Regulatory radius report (the one you cite) | EDR, ERIS, or GeoSearch | $100–250 |
| Federal sites: NPL, CERCLIS, RCRA, TRI, ERNS | EPA Envirofacts · Cleanups in My Community | free |
| State UST, LUST, spills, voluntary cleanup | Your state DEQ/DEP/EPA GIS viewer — search "[state] DEQ UST LUST map viewer" | free |
| Historical aerial photographs | Historic Aerials (free to view) · USGS EarthExplorer (free to download) | free |
| Historical topographic maps | USGS TopoView | free |
| Sanborn fire insurance maps | Library of Congress · your state university library | free |
| City directories | Local public library — many have digitized runs and will pull years by email | free |
| Soils and surficial geology | USDA Web Soil Survey | free |
| Flood zone | FEMA Flood Map Service Center | free |
| Radon zone | EPA radon zone map | free |
| Water wells and groundwater levels | USGS Water Data · state well log database | free |
| Wetlands and surface waters | USFWS Wetlands Mapper | free |
Two habits pay for themselves. First, drop each finding straight into the Job Facts form as you go rather than into a scratch note — no second transcription. Second, watch your radius report's date: under ASTM E1527-21 the records and the site visit go stale at 180 days, and a report leaning on an eight-month-old database search is a finding waiting to happen.
The daily loop
Once the four pieces exist, this is the whole job. Roughly ninety minutes of desk work per property instead of most of a day.
- Add the row. New property from the bank → one new row in the Job Sheet.
- Make the folder. Copy the six-subfolder skeleton, order the radius report.
- Merge the shell. Word mail merge or the Reports menu. You now have a document with every address, date, client, and project number already right in the body, the header, and the footer.
- Do the site visit. Photograph everything. Fill the "WHAT I SAW ON SITE" block in your phone's notes app while you're standing there — it's faster than transcribing later and it's more accurate.
- Fill the Job Facts form. Paste it into the Phase I Drafting project with your findings.
- Paste the output into the merged shell, section by section.
- Search the document for
[[. Resolve every[[NEED]]and every[[EP CALL]]. This is the real work, and it's now the only work. - Run the redline. Checklist below. Then sign.
Somewhere around the fifth property you'll notice the AI's first draft needs less editing than it did on the first. That's the finished reports in the project knowledge doing their job. Every few weeks, drop a newly finished report in and delete the oldest.
The redline, before you sign
Machine-assembled reports fail in predictable ways: a leftover address from the last job, a Findings section that contradicts the Records Review, a bracket nobody resolved. Run all thirteen every time.
Two upgrades worth the trouble
Auto-intake from the bank's email. When the assignment arrives as a predictable email, a free automation on Make (1,000 free operations a month, plenty for this) can read it, add the Job Sheet row, and create the folder skeleton before you've opened it. Worth doing once you're past roughly ten properties a month.
Let the AI write into the folder directly. Both Claude and ChatGPT now have desktop apps that can read a folder on your computer. Point one at a property's Data Pack folder and it can pull the facts out of the PDFs itself instead of you retyping them into the Job Facts form. Try it on a job you've already finished first, and check its numbers against your own hard — PDF extraction gets digits wrong, and a transposed distance is exactly the error this system exists to prevent.
Don't hide it, price it
The instinct is to keep this quiet. The better move is the opposite: a writer who turns reports around in three days instead of ten, with the same signature behind them, is worth more per report and can carry more of them. The standard hasn't changed and neither has the diligence. Only the typing went away.
