Environmental Reporting Automation

A build guide for one environmental report writer

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.

Setup one afternoon
Cost $0
Tech skill none
Standard ASTM E1527-21
Start here

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.

The shape of it

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.

01The Job Sheet
One spreadsheet. One row per property. Every fact that repeats — address, client, project number, dates — typed exactly once.
02The Data Pack
A folder per property holding the database report, historical maps, aerials, flood map, soils, and your photos. The evidence.
03The Assembler
Your template with merge fields where the repeating facts go. One click produces a document with every address and date already correct.
04The Writer
An AI project that already knows your template, your section numbering, and your voice. You paste facts; it returns prose.
05The Redline
A fixed checklist you run before signing. Twenty minutes instead of four hours, and it catches what the machine can't.
Step 0110 min · once

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.

  1. Open a new spreadsheet — Google Sheets (free) or Excel, whichever you already use.
  2. Name it Job Sheet.
  3. Paste the header row below into cell A1. It will spread across the columns.
  4. 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.

Job Sheet · header row
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.

Step 0210 min · every job

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.

  1. In Google Drive or Dropbox, make a folder: Projects.
  2. Inside it, one folder per job named [ProjectNumber] – [SiteAddress].
  3. Inside that, six subfolders — copy the names below so they're identical every time:
Folder skeleton
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.

Step 0330 min · once

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.

  1. Save your Job Sheet as an Excel file (.xlsx) if it isn't already. If it's in Google Sheets: File → Download → Microsoft Excel.
  2. Open a fresh copy of your report template in Word. Save it as MASTER TEMPLATE (merge).docx so you never edit your original.
  3. Go to the Mailings tab → Select RecipientsUse an Existing List → pick your Job Sheet file → choose Sheet1.
  4. Find the first place the site address appears. Delete the old address. With the cursor there, click Insert Merge FieldSiteAddress. A grey «SiteAddress» placeholder appears.
  5. 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.
  6. 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.

  1. Put the template in Drive as a Google Doc. Copy its ID from the address bar — the long string between /d/ and /edit.
  2. Open the folder where drafts should land. Copy its ID from the address bar — the string after /folders/.
  3. Open your Job Sheet in Google Sheets → Extensions → Apps Script.
  4. Delete whatever is in the editor, paste the code below, and put your two IDs on the first two lines.
  5. Click the save icon, then reload the spreadsheet tab. A new Reports menu appears in the menu bar.
  6. 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 ReportLink column.
Google Apps Script · paste whole thing
// ===== 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, '\\$&');
}
Step 0420 min · once

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.

  1. 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.
  2. In the left sidebar, click ProjectsNew project. Name it Phase I Drafting.
  3. 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.
  4. Find the project's instructions box (Claude calls it "Set project instructions"; ChatGPT calls it "Instructions"). Paste the House Rules below in verbatim.
House Rules · paste into project instructions
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.

Job Facts form · fill in and paste each time
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.

Step 05every job

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 needWhereCost
Regulatory radius report (the one you cite)EDR, ERIS, or GeoSearch
Federal sites: NPL, CERCLIS, RCRA, TRI, ERNSEPA Envirofacts · Cleanups in My Communityfree
State UST, LUST, spills, voluntary cleanupYour state DEQ/DEP/EPA GIS viewer — search "[state] DEQ UST LUST map viewer"free
Historical aerial photographsHistoric Aerials (free to view) · USGS EarthExplorer (free to download)free
Historical topographic mapsUSGS TopoViewfree
Sanborn fire insurance mapsLibrary of Congress · your state university libraryfree
City directoriesLocal public library — many have digitized runs and will pull years by emailfree
Soils and surficial geologyUSDA Web Soil Surveyfree
Flood zoneFEMA Flood Map Service Centerfree
Radon zoneEPA radon zone mapfree
Water wells and groundwater levelsUSGS Water Data · state well log databasefree
Wetlands and surface watersUSFWS Wetlands Mapperfree

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.

Step 06every job

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.

  1. Add the row. New property from the bank → one new row in the Job Sheet.
  2. Make the folder. Copy the six-subfolder skeleton, order the radius report.
  3. 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.
  4. 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.
  5. Fill the Job Facts form. Paste it into the Phase I Drafting project with your findings.
  6. Paste the output into the merged shell, section by section.
  7. Search the document for [[. Resolve every [[NEED]] and every [[EP CALL]]. This is the real work, and it's now the only work.
  8. 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.

Step 0720 min · every job

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.

Later, if you want it

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.

One more thing

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.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top