Skip to content
Brad Johnson, home
All words · 8 min read

How I Run a CSM Book of 44 Accounts Through an AI Agent

How I run a book of 44 enterprise accounts through an AI agent, and why the most important file is the one that briefs it.

Tags:#ai#customer-success

I’m a Strategic Customer Success Manager at Netlify, with a book of about 44 enterprise accounts. Most of my work now runs through Claude Code. Claude Code is an AI agent that runs in a terminal: I type what I want in plain English, and it reads and writes files on my laptop, runs commands, and reaches other systems I’ve connected it to.

I’m technical. I spent seven years in the industry before Netlify. I’m still not an engineer, and nothing below needs one. Most of what makes the setup useful is unglamorous: a folder layout and a document I keep up to date.

One folder per account

Every account gets a folder, and every folder has the same layout:

Customers/
  <account>/
    account.json     ids, renewal date, plan type
    contracts/       order forms and agreements
    data/            usage exports
    invoices/
    deliverables/    anything the customer will see
    notes/           internal only

The last two folders do the most work. Whether the customer can see a file is answered by which folder it sits in. Call prep notes, sizing scratch work and anything with internal numbers go in notes/. Only finished, customer-facing documents go in deliverables/. The workflows the agent follows are written to respect that split, and a small script checks that every folder still matches the layout. The agent can’t mix the two up by accident, because the structure doesn’t leave room for it.

The same layout also means I never explain where things are. “Use the latest usage export” means the newest file in data/, for every account.

The brief

At the top of the workspace is a file called CLAUDE.md. Claude Code reads it at the start of every session. Think of it as the onboarding doc for an assistant that forgets everything the moment a session ends.

It holds who I am, how I like to work, the facts I’ve verified and my style rules. It’s about 4,000 words now. The top looks like this:

## Who I am
Strategic Customer Success Manager at Netlify. Book of business: ~44 enterprise
accounts. I am technical (7 years in industry before Netlify) but I am not a
full-time engineer: explain terms I might not know in one plain sentence, do
not lecture.

The facts section is where it earns its keep. Every fact carries the date I checked it and what I checked it against:

- Build compute and build minutes are NOT charged, in any form. The only
  build-related charge is the production deploy itself. Verified against the
  canonical docs 2026-09-03.

The “how to work with me” section is short and specific:

- If audience (customer vs internal), format (PDF, deck, HTML, Slack, email),
  length, or basis is not stated, ask in a numbered list before building.
  I answer numbered lists fast.
- Deploys: branch deploys or draft deploys by default. Ask before deploying
  to production.

I answer a numbered list in seconds. A wrong guess about the audience means a rewrite.

What it can reach

A connector is a plug-in that lets the agent read from, and sometimes act in, another app using my login. Mine:

  • Salesforce, through Salesforce’s own command line tool, for accounts, renewal dates and opportunities.
  • Day AI, our CRM and meeting recorder, for call notes and open action items.
  • Gmail, Google Calendar, Google Drive, Slack, Linear, Notion, DocuSign and Netlify through connectors.

The less obvious one is code. A repository is a project’s code plus the full history of every change made to it. I keep read-only copies of three of Netlify’s: the docs site, the API and the customer dashboard. I never run them. The agent searches them to answer questions like “what did this billing page say on a given date” or “what exact wording does the customer see in this tooltip.” That’s how I pinned down the date a pricing change landed, from the commit history instead of from memory or a Slack thread.

Here’s how that plays out across the three kinds of work that fill most of my weeks.

Morning: call prep

A skill is a workflow written down as a file, which the agent follows whenever my request matches it. Call prep is the one I use most. I type:

prep me for my call with <customer>

The agent gathers everything in parallel without asking first. From Salesforce it pulls the account and open opportunities, from Day AI the last three meetings and open action items, and from the account folder the latest usage export, invoices and prior proposals. It also reads the last 30 days of email and Slack threads that mention the customer, and the calendar invite for the meeting itself. If a source isn’t available, it says so in one line and keeps going.

Then it writes a one-page brief into the account’s notes/ folder, in the same shape every time:

# <Customer> · <date> · <length> · attendees
Snapshot: renewal date, plan type, account team, last touch
Since last call: 3 bullets
Usage: one sentence + the one number that matters
Open items I owe them
Talk track (max 3 for 30 min, 5 for 60)
Likely questions and my answers: 2-4
Asks / expansion angles
Demo (optional): one concrete thing to show, ready to paste
Next step to propose

The depth follows the length of the meeting. A 30-minute call gets three talking points at most, and a 60-minute call gets five. The printed version leaves out account ids, in case I share my screen.

Before this, prep took me anywhere from 15 minutes to several hours, depending on the call. Now I start from a page that already has everything on it, and my time goes to deciding what to say.

Afternoon: a renewal proposal

Netlify moved enterprise customers from plans priced per unit of each resource to a credit-based model, where usage of each resource draws down a shared pool of credits. A lot of my proposals help customers make that move. There are two kinds. A contract conversion translates what a customer already has under contract into credits, with no change to the price. A usage-based sizing, for a renewal, sizes a credit pool from 6 to 12 months of real usage plus some headroom.

Both go through a skill. It starts by looking at what’s in the account folder, then asks its questions as a numbered list:

1. Basis: contract (as-is) or usage-based?
2. Audience: customer-facing or internal only?
3. Term options to show?
4. Anything to exclude or not mention?
5. Version: new doc or V<n> of an existing one?

Then it computes everything from the files in the folder and prints the arithmetic in the chat before it builds anything, so I can sanity-check it at a glance. Next it renders the proposal as a web page in our house design, the same fonts, colors and layout as every other document I send. The last step is a checklist. It recomputes every headline number in a separate pass, scans for banned punctuation, checks that nothing resembling an internal account id made it into the page, and confirms the page has its Download PDF button.

That button is a rule of its own. Deliverables are web pages, never PDF files. Every page has a Download PDF button with print styles, and that’s how a customer gets a PDF if they want one. There’s one source for every document and no stale PDF copies floating around. It went into the brief on September 15.

Now and then: a small tool

My territory review used to mean downloading five Salesforce reports and dragging the CSVs into a spreadsheet. Now one script queries Salesforce directly and one page presents the result.

Before trusting it, I checked it against the exports it replaced. The current quarter’s renewals matched 8 of 8 rows, next quarter’s 11 of 11, and expansions 4 of 4. It also differs from the stock reports in two places, both on purpose. Renewals are grouped by the account’s CSM instead of by whoever owns the opportunity, so a renewal in my book that someone else owns shows up, labeled, instead of quietly dropping out. Churned accounts stay in the list, marked, outside the totals.

It’s a small thing, and right now I’m the only one who uses it. The other things I’ve built the same way, all deployed on Netlify:

  • An account lookup app my team uses: pick a CSM, see their book, with links to Salesforce and the Netlify admin, and a button that opens our customer agent for that account.
  • Additions to our in-house customer agent, which the team uses to look up a customer’s usage, check adoption and review invoices. I added CSV downloads, which have been extremely popular, and a new page for invoices.
  • A macOS menu bar app that lists my open Day AI action items, takes reminders in plain language (“tomorrow at noon”) and keeps nagging until I answer.
  • Demo portals built on Netlify’s usage API, including one that shows an agency its bandwidth grouped by its own clients, so it can bill them.

Keeping the brief current

The brief is a document I maintain like any other piece of work. When the agent gets something wrong and I correct it, the correction goes into the brief as a rule, with the date. Three real ones:

- Never "what this X is / is not". No heading, label or sentence framed as
  "What this document is", "What it is not", or any variant, in any document.
  Set 2026-09-29.
- Deliverables are HTML only. Never render a .pdf file. Rule set 2026-09-15.
- Text I am meant to copy and paste (Slack messages, emails, replies) goes in a
  plain fenced code block, never a blockquote. Blockquotes paste with ">"
  markers. Set 2026-09-30.

Smaller preferences go into a memory store, a set of notes Claude Code keeps between sessions. On October 1 I pushed back on a draft Slack reply to a customer: “it’s a slack message. and that’s way too long. stop with all of the bullets all the time.” The note it saved:

Customer Slack replies: a few short sentences, conversational prose, no bullet
lists, no bold-label structure. Answer the question first, add at most one or
two helpful points. Aim for 3 to 5 sentences.

The next post covers the other half of all this: what happened when the agent got the arithmetic wrong, and the checks that came out of it.