How we drive new customers to activation
The customer onboarding agent we run on Kortix — a daily cron that checks every new account against its onboarding milestones in Postgres, drafts a nudge email when one stalls, and alerts the owning CSM in Slack with the context to act.
The first thirty days decide most renewals long before the renewal date shows up. An account that gets its workspace live, finishes setup, and hits its first real result in week one tends to stick. An account that signs and then goes quiet — no second login, no setup finished, no teammate invited — is already at risk, and usually nobody notices until the CSM happens to open HubSpot and wonder why an account they haven't heard from in three weeks is still on "customer since" last month.
We run a customer-onboarding agent on Kortix that checks every new account against its onboarding milestones every day, catches the ones that are stalling, drafts a nudge for the customer, and alerts the owning CSM with exactly what's stuck and why. It never changes an account and never sends anything itself — it hands the CSM a head start instead of a surprise churn conversation two quarters later.
The problem
A new account's onboarding progress lives in two places that don't talk to each other: the product events and activation milestones sit in Postgres, and the account record — who owns it, when it became a customer — sits in HubSpot. Neither system on its own tells a CSM whether an account is on track. A login count means nothing without knowing what day of onboarding the account is on; a HubSpot record means nothing without knowing whether the account has actually done anything since it signed.
The usual fallback is a CSM manually checking their book of accounts, or a dashboard that shows raw usage numbers with no sense of what "on track" even means for a given account's age. By the time a stalled account gets noticed, it's often past the point where a simple nudge would have fixed it.
What we built
On Kortix, a daily cron triggers an agent that reads HubSpot for every account inside its onboarding window and owned by a CSM, checks that account's activation milestones and product events in Postgres, and classifies each one as on track, stalled at a specific milestone, or overdue for full activation. For every stalled or overdue account, it drafts a nudge email addressed to the customer's own missed step and posts an alert to the owning CSM's Slack with the specific context — what's done, what's stuck, and what the nudge says. The draft waits in the CSM's inbox; the CSM decides whether to send it, edit it, or reach out a different way.
How it works
Run on a daily cron
A cron trigger fires the agent once a day. Each firing spawns a fresh session in its own sandbox with no memory of yesterday's run — the account list and every milestone are re-read from HubSpot and Postgres each time, and a marker property on the HubSpot record tracks which milestone was last nudged so the same stall doesn't get a duplicate email every day it persists.
Give the agent the onboarding playbook
The milestone framework — what counts as workspace-live, core setup, first activation event, team expansion, and full activation, and by what day each is expected — lives as a skill that travels with the agent, along with the stall/overdue thresholds and the tone for a nudge. When we learn which milestones actually predict a healthy account, we update the skill and every account benefits the next day.
Connect Postgres and HubSpot
Through scoped connectors, brokered server-side so no raw token reaches the model, the agent:
- Reads accounts from HubSpot — which ones are inside the onboarding window, and who the owning CSM is.
- Reads activation milestones and product events from Postgres — read-only, to see exactly what each account has and hasn't done since it signed.
- Writes back to HubSpot only which milestone a nudge was last drafted for — never a plan, a seat count, or any other account setting.
Post to Slack, draft to email
Two channels, two purposes: a Slack post to the owning CSM with the account's onboarding status and the specific stall, and an email draft — the nudge to the customer — held for the CSM to open, edit, and send.
Set the guardrails
The agent tracks progress and drafts outreach; it never changes anything on the account itself and never contacts the customer directly. It cannot send the nudge email, and it cannot touch a plan, a seat, a billing setting, or any other account state. Credentials are encrypted in the Secrets Manager and injected at runtime, never shown to the model or written to logs.
Hand off to the CSM
With that in place, a CSM opens Slack to a specific reason an account needs attention today — not a generic "check in on your accounts" reminder — and opens their inbox to a nudge already drafted around the exact step the customer hasn't taken. They read it, decide if it fits, and send it themselves.
The pattern
A daily cron spawns a session with read connectors into Postgres and HubSpot. The milestone framework lives as a skill. The agent flags the stall, drafts the nudge, and alerts the CSM; the CSM reviews, edits, and sends.
Guardrails
The agent touches new, revenue-relevant accounts, so what it can do is narrow and explicit:
- Draft and alert only. The agent never sends the nudge email itself and never contacts the customer directly. The email is a draft in the CSM's inbox until the CSM sends it.
- No account changes, ever. The agent never touches a plan, a seat count, a billing setting, or any other account state — in HubSpot or anywhere else. It reports and drafts; it does not administer.
- Scoped writes. The only thing the agent writes back to HubSpot is which milestone a nudge was last drafted for — never the deal stage, the owner, or any account property a CSM relies on.
- Isolation. Every run happens in its own microVM sandbox. Credentials for Postgres and HubSpot are encrypted in the Secrets Manager and injected at runtime, never exposed to the model or the logs.
- Everything is code. The milestone framework, the stall thresholds, and the per-system permissions are files in the repo, versioned and changed through a reviewed change request rather than a dashboard setting.
The outcome
Onboarding stalls that used to surface only when a CSM happened to look now arrive the same day they start, with the exact missed step and a nudge already written. The agent watches every new account and does the noticing; the CSM still decides what to send and when.
Read more
How we handle GDPR data-subject requests on a deadline
The GDPR-DSAR agent we run on Kortix — it verifies each incoming access or deletion request, locates the subject's data across our product database, compiles the report inside the SLA, and flags it for legal to review before anything goes out.

How we keep our docs in sync with the code
The docs agent we run on Kortix — connected to GitHub and our codebase. Once a day it checks the code that landed since its last run and updates the docs those changes affected, opening a PR for review.

How we QA every pull request automatically
The QA agent we run on Kortix — connected to GitHub and our test environment. It checks out each PR, runs the suite, exercises the change, and posts the result.
Engineer your first loop
Give your company a workforce of agents that run on a schedule, ship real deliverables, and improve one reviewed change at a time. Free to self-host, managed cloud from $20.
Open source · SSO · RBAC · on-prem · no lock-in