How to drop new practice files so they get built and deployed automatically
The automation runs every weekday at 09:00 Mountain. It dispatches by file type: a raw referrer CSV goes to Phase 1 (the sweep builds the prospect list for PRD review); a PRD-approved xlsx goes to Phase 2 (build the HTML engine + deploy to sga-growth.dev/growth-engine/). Every outcome comes back to you as a task in sga3p.
What the automation does — and what it needs from you
One scheduled run every weekday morning:
- Weekdays 09:00 (Mountain) — the sweep reads both Drive folders (Input + Output) and dispatches by what it finds in each Input file:
.csvwithout aKeep? (Y/N)column → Phase 1. The sweep runs the prospect scan itself, writes the prospect-list Excel to the Output folder, and sends you a task..xlsxwhose name contains prospect list → Phase 2. The sweep reads your approved list, builds the HTML engine, publishes it, and sends you a task with the URL..csvwith aKeep? (Y/N)column → approved-CSV bridge. Same as Phase 2, but the sweep first enriches the Keep = Y rows via Google Places (address, phone, website, drive time) and converts them into an approved xlsx.
Three things the automation needs to do its job:
- The file in the Input folder — both the raw roster and, later, the approved list
- The filename starts with the practice's Paylocity code (or, for the approved xlsx, the practice slug the sweep gave it)
- The original referrer roster CSV left in the Input folder, unrenamed, so the engine can populate the Referrers tab
1 · The Drive drop zone
Two folders — Input and Output
Input folder — everything you drop goes here: the raw referrer roster CSV to kick off a practice, and the PRD-approved prospect list (xlsx) when the review is done.
Output folder — the sweep drops the generated prospect-list Excel here for you to review with the PRD. You never need to put anything in this folder.
Drop files any day of the week; the sweep checks the Input folder every weekday at 09:00 Mountain. Drop on a Friday afternoon and it processes Monday.
2 · Filename convention
Roster CSV: Paylocity code + underscore + anything
The sweep reads the leading token of a CSV filename (everything before the first underscore) and looks it up in the SGA crosswalk. What comes after the underscore is up to you.
<PAYLOCITY_CODE>_<Practice_Words>_Provider_List.csvApproved xlsx: keep the name the sweep gave it, or code + "prospect list"
The easiest thing is to leave the filename exactly as it came out of the Output folder. If you rename it, it must start with the Paylocity code (or the practice slug) and contain the words prospect list. Underscores, hyphens, or spaces are all fine.
<slug>_prospect-list_v1_YYYY-MM-DD.xlsx (unchanged from the Output folder)<PAYLOCITY_CODE>_prospect_list_approved_YYYY-MM-DD.xlsx
JAXDSPFLPP_Jacksonville_Dental_Specialists_Provider_List.csvpensacola-perio-and-implant-dentistry_prospect-list_v1_2026-08-17.xlsxPENSACFLPP_prospect_list_approved_2026-09-15.xlsxJacksonville Dental Specialists Provider List.csvjaxdspflpp_provider_list.csvCJS_Referrals_by_Doctor_L12M.xlsxAAS-SC). Don't take codes from the PGP assignment spreadsheet — about half its rows carry old or shifted codes. Abbreviations like CJS aren't codes. If in doubt, ask Amy before dropping the file.
3 · The three lanes
The file type tells the automation what you want
Three lanes, decided by what's in the file — there are no filename tags.
<CODE>_…_Provider_List.csvProspects · Saturation Check · PRD QA Checklist sheets), drops it in the Output folder, and sends you a task titled "Prospect list ready for PRD review — <Practice>". Review it with the PRD.
…prospect-list….xlsxPRD QA Checklist sheet, set Keep? (Y/N) = Y on every office the PRD wants to pursue (optionally Override tier and PRD notes), save, and drop the xlsx in the Input folder. Next weekday morning the sweep builds the engine — Referrers tab from your original roster CSV, Prospects tab from the Keep = Y rows — publishes it, and sends you "Referral Growth Engine deployed — <Practice>" with the live URL. Only Keep = Y rows are ingested; tier overrides and PRD notes merge onto those rows.
Engine only? If the PRD doesn't want a prospect list, mark no rows Keep = Y and drop the xlsx anyway. The sweep sees zero approvals and ships the engine with a "not commissioned" placeholder in the Prospects tab.
<CODE>_….csv with a Keep? (Y/N) columnKeep? (Y/N) column, enriches the Y rows via Google Places (address, phone, website, drive time), converts them into an approved xlsx, and builds the engine in the same run. The filename must start with the Paylocity code, and the original roster CSV must still be in the Input folder.
driveMin_<Location> column on the Prospects sheet), the sweep pauses it and sends you a task titled "Referral Engine — multi-location practice needs Amy's review". Reassign that task to Amy. Amy either splits the list by office (one engine per Paylocity code, e.g. AAS-SC Aiken + AAG-GA Augusta) or builds a single master engine with all locations declared — reference: aiken-augusta oral & facial surgery — master, built 2026-08-07.
4 · CSV column format
Two supported schemas — the automation auto-detects
The automation reads the CSV header row and picks the matching parser. Both schemas produce the same engine output; the differences are what data each carries and how tiering is derived.
Preferred · Referral-Lab Export
What Jayme's most recent Jacksonville drop uses. Doctor-level rows with rank and specialty; the automation groups rows by practice address, picks the top-ranked doctor as the card lead, and lists other doctors in the notes.
Legacy · Office Manager Roster
The original format from Q2. Practice-level rows with office manager contact info. Still supported for older data pulls; tiering is driven by a suffix on the Practice column (see section 5).
Referral-Lab Export columns
| Column header | Notes |
|---|---|
| Overall_Rank | Integer rank (1 = top referrer). Drives tier — see section 5. |
| First_Name | Doctor first name |
| Last_Name | Doctor last name |
| Nickname | Optional |
| IsInternal | True / False. True → Green Internal tier. |
| AffiliatedPartner | Optional |
| Specialty | General Dentist, Endodontist, Oral Surgeon, Orthodontist, Pediatric Dentist, etc. |
| Mobile_Phone | Doctor mobile (optional) |
| Email_Address | Doctor email (optional) |
| Practice | Practice / office name |
| Address, Address2, City, State, Zipcode | Practice address (used to dedupe doctors at same office) |
| Phone_Number, Fax_Number | Practice main lines |
| Study_Club_Name, Birthday_Date, Graduated_Year | Optional — surfaced in notes when present |
| Last_Note, Next_Task, Last_Referral | Optional — surfaced on the card |
Legacy Office-Manager columns
| Column header | Notes |
|---|---|
| Practice | Practice name. Suffix rules drive tier — see section 5. |
| Address, Address2, City, State, Zipcode | Practice address |
| Phone_Number, Fax_Number, Email_Address | Practice contact |
| Office_Manager_First_Name, _Last_Name, _Email_Address | Office manager contact |
| Hours_of_Operation | Free-text (optional) |
Overall_Rank column and separate First_Name / Last_Name for the doctor, it's the Referral-Lab Export (preferred). If it has Office_Manager_First_Name and no rank column, it's the legacy Office-Manager Roster. Both work.
5 · How tiering works
Green / Yellow / NeedsReview — driven by whichever schema you dropped
Referral-Lab Export → Rank drives tier
Legacy Office-Manager → Suffix on Practice column drives tier
-INTERNAL REFERRALS (no space after dash) and - New Ref Outreach (space after dash) are what the parser looks for. Anything else falls into the "no suffix" bucket.
6 · What the automation does
Every weekday 09:00 (Mountain) — one sweep, two phases
The daily sweep runs on Amy's machine (if her laptop is asleep at 09:00 it runs when it next wakes). It syncs both Drive folders, then works through every new or changed Input file:
Phase 1 · raw roster .csv
- Looks up the Paylocity code in the SGA crosswalk to get the practice name and home address.
- Scans the surrounding market (Google Places, within about an hour's drive), scores and tiers the candidates, checks saturation against your roster, and builds the Excel with the
Prospects,Saturation Check, andPRD QA Checklistsheets. - Uploads the Excel to the Output folder.
- Sends you a task: "Prospect list ready for PRD review — <Practice>", with a link to the file and the saturation verdict.
Phase 2 · approved .xlsx
- Resolves the practice from the filename — the Paylocity code, or the slug the sweep gave the file — using the Phase 1 record.
- Inspects the xlsx: counts
Keep? (Y/N)= Y rows on thePRD QA Checklistand checks for multi-locationdriveMin_*columns (multi-location → hold, see section 3). - Builds the HTML engine — Referrers tab from your original roster CSV, Prospects tab from the Keep = Y rows with tier overrides applied. Approved prospects are marked visit-ready, so they appear on the Start Here snapshot, Monthly Routes, and Weekly Execution in their cadence months (A = Jan · Jun · Sep, B = Feb · Oct).
- Auto-bumps the version (v1, v2, v3…) so previous builds stay reachable.
- Publishes to
sga-growth.dev/growth-engine/<slug>_referral_growth_engine.htmland adds it to the growth-engine index. - Sends you a task: "Referral Growth Engine deployed — <Practice>", with the live URL. Spot-check it before the next PRD meeting.
Published engines live at sga-growth.dev/growth-engine/ (SGA SSO required).
7 · When a file gets skipped
Reasons a file can get skipped, fail, or wait
- No Paylocity code prefix on a CSV. The filename doesn't start with uppercase letters +
_. → You get a failure task. Rename and re-drop. - Paylocity code not in the crosswalk. A typo, an abbreviation (
CJS), a made-up composite code for a two-office network (AIKENAUGSCDD), or a stale code from the PGP spreadsheet. → Failure task. Fix the code (section 2) and re-drop. - xlsx without "prospect list" in the name. The sweep assumes it's a reference file (e.g. a referrals-by-doctor pivot) and ignores it — silently, every day, with no task. This is the one case you won't hear about. → Rename so the name contains prospect list and starts with the code or slug; it processes on the next run.
- Missing or corrupt data. Practice column empty on every row, unparseable file, xlsx missing the
ProspectsorPRD QA Checklistsheet. → Failure task. Reissue the export. - Approved list with no matching roster. Phase 2 can't find a roster CSV with the same Paylocity code in the Input folder. → Failure task. Put the original roster CSV back (or drop it fresh) with the matching prefix.
- Multi-location list. Two or more
driveMin_*columns. → Hold task to you; reassign to Amy. - Nothing happened, no task. The file hadn't changed since the sweep last processed it — normal for files that stay in the folder. If you meant to re-run it, drop a new version.
_approved. That was the July process and it no longer applies. The roster stays exactly as you dropped it; approval is signalled by the xlsx (or a CSV with a Keep? (Y/N) column). Renaming the roster in Drive can make the sweep treat it as a new file and run a second, paid prospect scan.
Amy can see every skip and wait in the daily sweep log — if something looks wrong, send her the filename and the date you dropped it.
Questions?
Email Amy McNeill. Drops made any weekday get picked up at the next 09:00 (Mountain) sweep. If it's urgent and needs to go out the same day, drop by 08:30 Mountain.