I wanted automated alerts when tee times opened up at my golf course. The course releases times two weeks out through a lottery system. The good slots get taken, but as the date approaches, people's plans change and times get dropped back into the system.

You can manually check every couple hours for the few days leading up to when you want to play. Not difficult, just annoying. I figured there had to be a way to automate this.

I knew it was possible, I just didn't know how to build it.

The Basic Approach

Started with ChatGPT: "I want to automate checking for available tee times at a golf course website. How would I build something that logs into the site and checks for openings?"

My assumption was I'd need to mimic human behavior—log in, navigate to the tee sheet, read the page. ChatGPT suggested browser automation using Playwright.

While trying to get it to work, it told me to open Chrome DevTools and watch the Network tab while the tee sheet loaded. I'd never done this before, but the instructions were specific: "Look for requests that return JSON data."

Found two endpoints: GetCountDownTimesByCourse and GetAvailableTeeTimes. When I showed ChatGPT the JSON response, I asked if we could just use this instead of browser automation.

That changed everything. Much simpler to hit an API directly than drive a browser.

Building It Out

Took about six hours one night to get a working script. The pattern was:

We repeated this cycle dozens of times. Every error message I learned a little bit more.

Finally after a few hours, a big breakthrough. I asked ChatGPT for a summary of the project, what are we trying to do, what do we know, summarize back what we have.

ChatGPT gave me a very well written prompt "we're building a bot to xyz, we hitting this endpoint, we're running this code, using this json, to do this, that, the other. I took that summary, made some small adjustments, put it in a fresh chat and moved to 04-mini-high (or the one best for coding), then boom, code worked.

def check_tee_times():
    resp = requests.get(f"{API_BASE}/GetAvailableTeeTimes/{DATE}/{COURSE_ID}")
    data = resp.json()

    for slot in data["data"]["teeSheet"]:
        if (slot["bookingTimeTypeTxt"] == "Available" and
            slot["availPlayers"] >= 4 and
            time_in_window(slot["teeTime"])):
            send_email(slot)

It's 2 AM and I have a script that checked the API and emailed me when it found matching slots.

Each problem was solved by pasting the error message back to ChatGPT and working through the fix together.

Making It Actually Useful

With the basic script working, I added features:

Multiple dates: Instead of hardcoding one date, it reads from a JSON config file with multiple entries.

De-duplication: Added a notified.json file to track what I'd already been alerted about. No repeated emails for the same tee time.

Better formatting: Converted military time to AM/PM, added actual day names, made emails more readable.

Deployment: First tried Render (cloud platform), later moved it to my Raspberry Pi to run locally.

What Actually Happened

I can't write Python from scratch. I generally understand what the code does when I read it. I can modify config files and trace through logic. But if you asked me to write an HTTP request handler without AI assistance, I couldn't.

That doesn't matter. I built working software by describing what I wanted clearly and letting AI handle the implementation details. I was the PM and AI was the engineer. I just figured out how to clearly articulate the PRD, what I wanted and how I wanted it to work, AI wrote the code. I've never been a traditional PM but I've been in the role building business systems.

Current State

The system works. It monitors multiple dates and time windows, handles timezones, maintains state to avoid duplicate notifications, runs reliably with logging, and uses config files instead of hardcoded values.

It's been running on my Pi for weeks. I get alerts when good times open up. I book them before other people notice.

The barrier wasn't technical knowledge. It was believing the tools existed to help me solve this problem and being willing to work through the learning and debugging process.

I believe most people could build something like this. The tools are there. You just have to try.