denis bauer· belgrade, serbia·linkedIn·cv·email·Book a call with me
Extrovert

Customer success, rebuilt as an agentic operation

Extrovert · AI LinkedIn engagement SaaS for B2B sales teams · May to September 2026

190
logged investigations in 14 weeks
14
custom skills, ~2,100 lines
6
live data sources
48
post-mortems turned into rules

🧭 What this was

Extrovert is an AI LinkedIn engagement product for B2B sales teams, with a founder and four engineers. I ran support, billing, the help center and founder-facing analytics as Head of Customer Success — the whole function, one person.

Rather than work the queue by hand, I rebuilt the function as an agentic operation on Claude Code: a router that decides what kind of question it is, an investigation skill wired directly into production, and a loop that turns every wrong answer into a rule so the same mistake does not come back.

The point was never automation for its own sake. It was that a support answer should be traced to the code path that produced it and confirmed against production, not assembled from a plausible story — and that one person should be able to hold that standard across a whole queue.

🔌 The workstation

A single setup document rebuilds the entire environment on a fresh machine in under an hour: data connections, skills, operating rules, and a smoke test per integration.

SourceAccessUsed for
Production Postgres, 6 schemasRead-onlyAccount state, campaigns, jobs, billing, assistant threads
Grafana LokiLogQLProvider responses, request traces, job timing
IntercomRead + article editingConversations, contacts, help-center articles
YouTrackRead + writeFiling and tracking engineering tickets
AttioReadChurn list, subscription state, partner flags
Six product reposLocal clonesTracing the exact code path behind a symptom

One rule runs through all of it: the database is read-only and there is no send tool on the inbox. The agent produces SQL and drafts; I run them and I send them. Nothing reaches a customer or the database without a human in between.

🧩 How a ticket gets routed

Fourteen skills in three tiers. The router's first decision is whether the answer depends on this specific account's state. If it does not, the reply is grounded in the help center. If it does, the investigation skill traces the symptom to the code that produced it and confirms it in production before anyone gets a verdict.

Inbound message
cs-user-help
triage router
kb-read
ground the answer in the help center
Answer does not depend on account state
ops-extrovert-debug
logs + database + source
tool-youtrack
file a ticket
SQL block
operator runs it
Draft reply
operator reviews and sends
TierSkillsWhat they do
Triagecs-user-help, ops-extrovert-debug, tool-youtrackRead the ticket, route it, investigate across logs, database and source, file the ticket, draft the reply, log the case
Knowledge basekb-read, kb-plan, kb-write, kb-formatting, kb-release-audit, kb-overhaul, kb-ai-agent-enrichmentPull the authoritative article before answering; plan, draft and format new ones in house style; audit a sprint release into a work list; sweep every article against the current product
Analyticsai-assistant-conversation-analysis, onboarding-funnel-analysis, churn-recovery-analysis, ops-trial-abuseAnswer founder questions from raw production data rather than dashboards

♻️ The part that compounds

Every case gets written down. Every wrong answer gets dissected, and the lesson lands in the skill or in persistent memory the same day — wired to the exact place it will fire next time, not filed in a document nobody reopens.

Case handled
cs-log.md
one line per case
Operator pushes back?
wrong answer caught
cs-error-log.md
post-mortem: what was missed, and why
Rule in the skill
fires on the next case
Memory file
outlives the session
↻ back into the next case
ArtifactVolumePurpose
cs-log.md190 casesOne line per case: user, symptom, evidence, verdict, ticket
cs-error-log.md48 post-mortemsWrong answer, reality, why it was missed, the guardrail that generalises
Skill rule sectionsDozens of dated entriesThe guardrail wired where it fires next time
Memory37 files, 13 of them feedback rulesFacts and corrections that outlive a session
kb-queue.md131 closed itemsStale articles and gaps, consumed by the KB skills

The triage skill grew from 30 lines to 141 over four months, and every line added cites the case that earned it. The hardest misses produced the rules I would keep anywhere: no verdict without a pinned mechanism, an empty result is provisional until the fetch path is proven, resolve identity by profile rather than by email, and read the provider's raw response before naming a cause.

🔍 Support by the numbers

190 investigations in 14 weeks, each ending in a verdict backed by code references and production evidence. The baseline was two independent sources per verdict, with logs pulled when the question turned on a specific moment the database does not record.

MeasureCountNote
Cases logged190Across 14 weeks
Working-as-designed verdicts33Each traced to the exact code path and confirmed in the database
Confirmed bugs15Reproduction, mechanism and code reference handed to engineering
Manual SQL fixes12Read-back query, transaction, verify query — run by a human
Tickets filed as reporter22Most resolved
Distinct tickets worked83Filed, commented on, or referenced in case logs

Typical case shapes: a number the customer sees that does not match the database, a campaign that stopped, an invite that never went out, a post the customer saw on LinkedIn but not in the feed, a billing portal that rejects a paying customer.

Bugs found this way included an import breaking on a session parameter in the URL, a deadlock when deleting a topic during bulk reject, duplicate activities from two URL forms, posts silently not reaching a campaign, a 60-second access token breaking long operations, and a text sanitiser stripping Spanish punctuation.

📚 A help center with two audiences

Three AI agents answer on the company's behalf, and all three read the same help center:

  • ·Intercom Fin — replies to customers in the support inbox, often before a human sees the conversation at all.
  • ·The public MCP agent — a public endpoint that lets AI clients outside the product query it and answer from those same articles.
  • ·The in-app assistant — walks users through setup inside the product itself.

When an agent walks a user through a setup, the article is effectively its prompt. So every article was rewritten to work as executable instructions and still read as plain help for a human.

MeasureCount
Articles in the help center96
Authored by me69
New since May 202623
Rewritten August to September~45
Release audits5 sprints
Queue items closed131

House rules the skills enforce: no internal mechanics or provider names in customer copy, UI labels verified against the deployed frontend rather than the dev branch, and nothing goes live without a human seeing the diff — an edit to a published article is live the moment it is saved.

📊 Founder-facing analytics

Six standalone analyses, each answering a question the founder asked, each computed from raw production data rather than from a dashboard.

AnalysisWhat it did
Churn recoveryClassified every account on the churn list by driver with explicit confidence levels, and separated the genuinely churned from the mislabelled. Surfaced accounts still paying with auto-renew off, two systemic bugs holding users, and real customers wrongly excluded as partners. Runs per-account dossiers in subagents so the main context stays clean, and ships with an eval set.
Assistant benchmarkA 25-question benchmark run against both the in-app assistant and Intercom Fin, scored question by question. Proved the assistant actually reads the help center, and separated its own failures from gaps in the knowledge base that both agents shared.
In-app assistant conversation auditsEvery external thread read in full. Found two infrastructure failures the product's own error flag never caught, plus a whole class of onboarding failure. Became a standing weekly health check.
Onboarding funnelTraced new owners from signup through content, campaign, prospects, start and first output — from durable database state rather than event tracking.
Voice in the in-app assistantA five-document series on how the in-app assistant fills a user's writing voice: how it is used today, how the instructions should be designed, what to fix, and an implementation plan.
Customer reportingWeekly exports for an agency customer, plus one-off feed and team-usage exports for individual accounts.

💡 What actually made it work

  • ·A human gate on every write. Read-only database access and no send tool is not a limitation, it is the thing that makes the rest safe to run fast.
  • ·Verdicts need a mechanism. “Probably a sync issue” is not an answer. Two independent sources and a named code path, or it does not ship to the customer.
  • ·Write the mistake down where it will fire. A post-mortem in a document is a diary entry. The same post-mortem as a rule inside the skill is a guardrail.
  • ·Routing beats one big prompt. Most of the quality came from the first decision — does this answer depend on account state — not from the depth of any single step.
  • ·Documentation is now an interface. Once agents answer on your behalf, help-center articles are prompts. They have to be executable, not just readable.