Both setups, on the screen, step by step. Same content as the PDFs, but you can follow it without switching tabs. Every code block is copy-able. We'll click through this together on the call.
This is the walk-through. Not the high-points tour. Every click, every button name, every field in order. If you've never built a Custom GPT before, follow this line by line and you'll have a working Research Engine inside your ChatGPT account in about 10 minutes. We'll do it together on the call, and then this guide is yours for any time you want to rebuild, tune, or show someone else how it works.
GPT-INSTRUCTIONS.txt — the instructions you'll paste into your GPT.GPT-STARTERS.txt — the four conversation-starter prompts, one per line.Open chatgpt.com in your browser. If you're already signed in, skip to Step 2.
If you're not signed in: click Log in in the top right. Enter your email and password (the same ones you already use for ChatGPT).
You have two ways to get there. Pick whichever feels easier:
Way A (click path):
Way B (direct URL):
chatgpt.com/gpts/editorEither way, you should now see a page with two panels:
This is the most important click of this entire guide. Do not use the Create tab. That one tries to build your GPT by chatting with you, and it will fight you on the specificity we need.
Click Configure. The left panel will change from a chat to a form with fields like "Name," "Description," "Instructions," and so on. That's where we're working.
The Configure tab is one long form, top to bottom. Fill each field in order. Don't skip around.
At the very top, there's a circle with a camera icon — a profile photo for your GPT. You can click it and upload any image, or let ChatGPT auto-generate one (it'll offer). Or skip entirely. This is cosmetic.
If you want, upload your Vistage headshot or the Local Nerds logo. Otherwise, leave it as the default.
Click in the Name field and type exactly:
Tim's Prospect Research Engine
That's what you'll see in your GPT sidebar later. You can change it any time.
Click in the Description field. Type (or paste):
Researches CEO candidates for my Vistage groups against my criteria — private, never fabricates, writes hooks in my voice.
This is the one-liner that shows under the name. It's not shown to anyone else (your GPT is private), it's just for you.
This is the big one. The Instructions field is the "brain" of the GPT — everything it knows about how to do its job lives here.
GPT-INSTRUCTIONS.txt (it's in the research engine zip on the Session 1 page).The text box should now have about 70–80 lines of instructions, starting with "You are a research assistant helping Tim Cole..." and ending with "...Tim's building this with you, not using a product."
Below Instructions, find the Conversation starters section. You'll see four rows with plus-signs and text fields.
GPT-STARTERS.txt.If any of the four rows has old placeholder text, click the X next to that row to remove it first, then paste.
You should end up with four conversation starters filled in. These will show up as clickable suggestion buttons whenever you open the GPT in a new chat.
Below Conversation starters is a section called Knowledge. This is where you'd upload reference files (like your 8-step email cadence or a sample spreadsheet) that the GPT reads on every turn.
Leave this empty for now. We'll add files together in Session 2 once we see how the GPT performs without them. Adding files too early can actually make the GPT worse because it tries to use everything.
Scroll down to the Capabilities section. You'll see four checkboxes:
Below Capabilities is a section called Actions with a button that says "Create new action." Do not click this. Actions are for wiring your GPT up to external APIs — way more advanced than we need today. Ignore it completely.
Further down may be a section labeled Additional Settings with a toggle for "Use conversation data in your GPT to improve our models." If it's there and checked, uncheck it — this keeps your prospect research out of OpenAI's training data. (Not every account has this toggle; if you don't see it, don't worry about it.)
Look at the top right of the screen. There's a button that says Create, with a small down-arrow next to it.
The page will briefly show a saving indicator, then give you a confirmation screen. You've just built your Custom GPT.
The confirmation screen will offer a link to open the GPT you just built. Click it. You'll land in a fresh chat with your Research Engine.
Before you close this tab, test the GPT on one name so you know the setup is good.
In the message box, type (or paste) a real name of someone you're curious about. A good first test is one of the ten prospects already in your pipeline. Try:
Research this person for my Vistage group: Marco Antonio Abarca, CEO of Ready Foods in Denver.
Press Enter.
You should see the GPT say something like "Searching the web..." and start looking up Marco. This takes 20–60 seconds depending on how deep the search goes.
When it's done, the GPT should return a research card in the format you saw in Session 1:
Compare what it returned to the Marco Abarca entry in your pipeline spreadsheet. The hooks may be worded slightly differently — that's expected; there's natural variance. The key question: does it sound like something you'd actually write?
For a harder test, try a name the GPT couldn't possibly have in its training data — someone who made the news in the last couple of months. For example:
Research this person for my Vistage group: [someone whose name came up in this week's DBJ].
If the GPT does the web search, pulls real signal, and returns a defensible card, you've got a working Research Engine.
If something looks off — the hooks feel generic, the revenue band is wildly wrong, a LinkedIn URL looks invented — tell me in the chat (you can talk TO the GPT about what it got wrong) and/or flag it for our Session 2 tune-up.
Close the current tab. Go back to your main ChatGPT window.
Look at the left sidebar. At the top, you should see a section that starts with pinned GPTs or recent GPTs. Your new GPT should appear in there, labeled "Tim's Prospect Research Engine."
Click it once to pin it. (Some versions of the UI auto-pin; some don't.) Now it's always one click away.
Here's how I'd suggest you use it starting this week:
The whole system's power is that you can change its brain in 10 seconds.
Common tuning moments:
Every edit takes effect immediately, for every new chat. Old chats keep their old instructions.
This is the most serious failure mode and the one the Instructions specifically try to prevent. If it happens:
Three possible causes:
It drifted. Open Edit GPT → Instructions → find the "Hook voice rules" section → add at the top: "This format is non-negotiable: 'intrigued by your [X] and business leadership'. Never deviate." Redeploy (hit Update).
Don't panic. In ChatGPT:
STOP and email me. Don't fight it. I'd rather unblock you in 30 seconds on a quick email than have you sit on a frustrating bug for 20 minutes. [email protected]
Every morning by 6am MT, a scheduled ChatGPT task posts a ready-to-paste list of new Denver Business Journal signals — CEO appointments, acquisitions, expansions — directly into your ChatGPT thread. Each row is pre-enriched with Title, Company, Industry, Revenue Band estimate, a LinkedIn search link, the Recent Signal from the article, and a drafted Intrigue Hook. You open ChatGPT at 6:30, glance at the list, copy-paste into your tracker, claim the good ones in Vistage, and you're in your cadence.
I initially wanted this to write directly into your Excel file while you slept. ChatGPT's current Microsoft connector is read-only and can't append rows to Excel, so the design shifted to "task outputs a paste-ready list at 5:45am, you copy it into your workbook at 6:30am." That's a 30-second paste step per morning, in exchange for a curated shortlist that would have taken you an hour to build by hand. Net win.
Prospect PipelineOpen your recruiting workbook in Excel. Right-click any existing Group tab → Insert → Worksheet. Rename it: Prospect Pipeline.
Paste the following into cell A1 (it's tab-separated — Excel will split it across 15 cells when you paste):
Date Signal First Last Company Title Industry Est. Revenue Band City LinkedIn Search Recent Signal Intrigue Hook Source URL Status Notes
If the columns don't split: paste into Word first, select all, Table → Convert Text to Table (tab-separated), then copy the resulting table into Excel. Or use Data → Text to Columns with Tab as the delimiter.
Save the workbook. This tab is the home for all incoming DBJ signals. Your existing Group tabs stay untouched.
Open your existing Custom GPT (the one you built in Part 1, or yesterday's call). Click the GPT's name at the top → Edit GPT → Configure tab.
Scroll down to Conversation starters. Add these two:
Full research [paste a name]
Pull latest DBJ Fastest-Growing list
Scroll up to Instructions. At the very bottom of the existing text, paste this block:
=== DBJ Prospect Research Support (added 2026-04-22) ===
You support two Tim-initiated commands related to the Prospect Pipeline tab in his recruiting workbook:
1. "Full research [name]" or "Full research [name] at [company]"
- Call the /enrich Action configured in this GPT with {name: "First Last", notes: "[any notes Tim gave]"}
- Take the returned dossier and format it as a replacement row Tim can paste into his Prospect Pipeline tab
- Keep the original row structure: Date, Signal (unchanged), First, Last, Company, Title, Industry, Est. Revenue Band, City, LinkedIn Search, Recent Signal (strongest from dossier), Intrigue Hook (strongest single candidate from dossier), Source URL (unchanged), Status = "Researched", Notes (append any flags from the dossier prefixed "Flags:")
2. "Pull latest DBJ Fastest-Growing list"
- Search the web for "Denver Business Journal Fastest-Growing Companies" for the current year
- For each company on the list that's a private Denver-area company, produce a row matching the Prospect Pipeline schema
- Signal = "fastest-growing". Source URL = the list page URL.
- Output as a tab-separated markdown table Tim can paste into his workbook
INTRIGUE HOOK VOICE (applies everywhere)
- Peer-to-peer, CEO to CEO. Not vendor-to-prospect.
- Anchored to the Recent Signal directly. No generic hooks.
- BANNED words: "impressive", "inspiring", "innovative", "exciting", "amazing", "remarkable"
- Fills this slot: "intrigued by your ___ and business leadership"
- Short. Should flow when read aloud.
LINKEDIN URL RULE
Never invent or guess a LinkedIn profile URL. If you need to provide one, construct a Google search URL of the form:
https://www.google.com/search?q=site%3Alinkedin.com%2Fin+%22First+Last%22+%22Company%22
=== END DBJ Prospect Research Support ===
Click Update (top-right) to save.
In ChatGPT (the web app or desktop), open a regular new chat — NOT inside your Custom GPT. Pick any model (GPT-4o is fine).
Paste this entire message into the chat and send:
Create a scheduled task:
Name: DBJ Morning Scan
Schedule: Every day at 5:45am America/Denver time
Prompt:
Run the Denver Business Journal morning scan. Output a paste-ready markdown table. Do NOT attempt to write to any file.
SOURCE (do not try bizjournals.com directly — it is Cloudflare bot-blocked):
Fetch this Google News RSS URL and parse for recent items:
https://news.google.com/rss/search?q=site%3Abizjournals.com%2Fdenver+%28CEO+OR+President+OR+named+OR+appointed+OR+acquires+OR+acquisition+OR+expands+OR+expansion+OR+headquarters+OR+growing%29&hl=en-US&gl=US&ceid=US:en
Keep items with pubDate within the last 7 days.
SIGNAL TYPES TO KEEP
- new-ceo: CEO, President, Owner, or Managing Partner named or appointed at a private company
- acquisition: company acquired, acquired-by, or made an acquisition
- expansion: expansion, new HQ, new location, significant hiring event
- new-hq: relocating or opening Denver-area headquarters
SIGNAL TYPES TO SKIP
- Funding rounds under $10M (too early-stage)
- 40 Under 40 (over-pitched)
- Denver Inno startup coverage (too early-stage)
- Public-company earnings, government, nonprofit, municipal news
GEOGRAPHIC FILTER (~25 miles of downtown Denver)
KEEP: Denver, Aurora, Centennial, Lakewood, Englewood, Arvada, Littleton, Thornton, Westminster, Wheat Ridge, Commerce City, Greenwood Village, Glendale, Broomfield (south), Parker, Lone Tree, Highlands Ranch, Golden.
SKIP: Colorado Springs, Fort Collins, Boulder, Loveland, Longmont, Greeley, Pueblo, Grand Junction, Vail, Aspen.
LITE ENRICHMENT PER ITEM
For each surviving item, try to fetch the DBJ article page via browsing. If the article page fails to load (Cloudflare block), use the Google News title and snippet only.
Produce these fields per row:
- Date: today's date (YYYY-MM-DD)
- Signal: one of the tags above
- First, Last: the person named (blank if the article is about the company without naming an executive)
- Company: company name
- Title: CEO / President / Founder / Owner / Managing Partner (blank if not stated)
- Industry: 1 to 3 words (e.g., "Logistics", "Healthcare IT", "Commercial Real Estate")
- Est. Revenue Band: $5-10M, $10-25M, $25-50M, $50-100M, $100-250M, $250-500M, or BLANK. Only fill when there is a strong cue (employee count with known industry multiples, stated revenue, acquisition deal size). BIAS STRONGLY TO BLANK. A wrong guess costs Tim a claimed Vistage slot. Blank is better than wrong.
- City: HQ city (from KEEP list only)
- LinkedIn Search: Google search URL of the form https://www.google.com/search?q=site%3Alinkedin.com%2Fin+%22First+Last%22+%22Company%22 — never invent or guess a profile URL
- Recent Signal: one specific sentence from the article (quote or tight paraphrase, not generic)
- Intrigue Hook: best single phrase completing "intrigued by your ___ and business leadership" — anchored to the Recent Signal, peer-to-peer voice, BANNED words: impressive, inspiring, innovative, exciting, amazing
- Source URL: DBJ article URL
- Status: "New"
- Notes: prefix "Hook alts:" then list 2 alternate Intrigue Hook candidates semicolon-separated
OUTPUT FORMAT
Reply with:
Line 1: "5:45am DBJ scan — [N] items, last 7 days. Paste the table below into the Prospect Pipeline tab (Tab key will split columns):"
Line 2: blank
Lines 3+: a tab-separated table with the 15 columns in this order:
Date Signal First Last Company Title Industry Est. Revenue Band City LinkedIn Search Recent Signal Intrigue Hook Source URL Status Notes
Use literal TAB characters between columns, one row per line, no markdown pipe characters.
ZERO-HIT CASE
If no items survive filtering: reply "5:45am DBJ scan — no new signals in the last 7 days."
SOURCE-UNREACHABLE CASE
If Google News RSS is unreachable or returns no items: reply "5:45am DBJ scan — Google News unreachable this morning, will retry tomorrow."
DEDUP
Do not attempt to dedup. Tim will eyeball against his existing Prospect Pipeline tab before pasting rows. The Source URL is the dedup key if he wants to remove duplicates later via Excel's Remove Duplicates feature.
Send that whole block. ChatGPT will read it, propose a schedule, and ask you to confirm. Say yes / confirm. A "task" bubble will appear in the chat.
In your Tasks list (profile icon → Tasks), find DBJ Morning Scan and click the three-dots menu → Run now (or the equivalent manual-trigger button — OpenAI has moved this around; if you don't see Run, just edit the task, save, and wait for the next trigger, or send yourself a fresh "run DBJ Morning Scan now" message).
Wait 2–5 minutes. A new chat thread should open with the scan output.
If you see that, you're done. Copy the table (everything from the Date header line down), paste into cell A2 of your Prospect Pipeline tab, and you're live.
New to Claimed.Pursuing.Optional upgrade for a specific prospect: in your Custom GPT say "Full research [name]" — the GPT calls the deeper research engine and hands you back a stronger Intrigue Hook and flags. Paste the updated row back over the original in Prospect Pipeline, Status = Researched.
Profile icon → Tasks → find DBJ Morning Scan → three-dots menu → Pause (temporarily) or Delete (permanently).
Rows already in your workbook stay. Delete them manually if you want. Re-enabling any time resumes the morning scans.
ChatGPT's task UI has shifted a few times in 2026. If any part of the setup behaves unexpectedly, expand a diagnostic below and paste the matching prompt into a fresh ChatGPT chat. These are written to give ChatGPT the full context in one message so it can help you figure out what's happening, without you needing to know the current menu layout.
I set up a scheduled task in ChatGPT called "DBJ Morning Scan" that should fire at 5:45am America/Denver every day and post a message in its thread. Today I opened ChatGPT at [TIME] and there's no new message from it.
Please walk me through how to:
1. Verify the task is actually active — where exactly is the tasks list in the current ChatGPT UI (desktop web app, as of today)?
2. Check the task's last run status and any error it hit.
3. Manually trigger it now to see if it runs at all.
4. Check whether I'm hitting the 10-active-tasks cap that ChatGPT Plus has.
Tell me the exact clicks in the current UI, and if a screenshot would help, tell me what to capture.
My scheduled task "DBJ Morning Scan" has been running but for the last 3+ days it has either output "no new signals in the last 7 days" or returned an empty result. I know for a fact that the Denver Business Journal has published CEO appointment and acquisition articles in that window.
The task fetches this URL:
https://news.google.com/rss/search?q=site%3Abizjournals.com%2Fdenver+%28CEO+OR+President+OR+named+OR+appointed+OR+acquires+OR+acquisition+OR+expands+OR+expansion+OR+headquarters+OR+growing%29&hl=en-US&gl=US&ceid=US:en
Please do three things:
1. Fetch that URL right now and tell me how many items are in it with pubDate in the last 7 days, and list the first 5 headlines.
2. If there ARE items there, tell me which of my filters (signal types, geographic filter for Denver metro, exclusions) would be cutting them out.
3. Suggest a loosened version of the filters we could try for one week as a calibration test.
My scheduled task "DBJ Morning Scan" is producing rows that don't match my ICP. Here are 3 recent bad rows [PASTE THE BAD ROWS HERE].
My ICP is: private-company CEOs/Presidents, $5M-$500M revenue, HQ within 25 miles of downtown Denver. I'm the Vistage chair — I recruit for CEO peer-advisory groups.
Please:
1. Tell me WHY each of these rows got through the filter — which keyword matched, which geographic filter was too loose.
2. Suggest a specific tightening for each bad row that wouldn't also kill good rows.
3. Give me a replacement version of the filter block in my task prompt that I can paste in.
I have a ChatGPT Custom GPT set up by my consultant with an Action that calls a research endpoint. I tried saying "Full research [name]" and one of these things happened: [PICK ONE AND DESCRIBE:
(a) it didn't call the Action at all, just made up an answer
(b) the Action returned an error
(c) the answer came back but not in the row format I expected].
Walk me through:
1. Confirming the Action is still configured — where do I look in the GPT's Configure panel?
2. Testing the Action directly (not through conversation) to see what it returns.
3. If it's making up answers without calling the Action, what's the fix?
This is a ChatGPT Plus account. The GPT was working yesterday.
Text or email me. Screenshots of the ChatGPT thread after the task runs are the most useful. [email protected] · 970.800.1295