| name | sizmo-cli |
| description | Drive the sizmo GoHighLevel CLI — export location state, diff what changed, run the morning brief, and make confirm-gated writes. Use when working with any GHL location via the terminal or as an agent tool. |
sizmo CLI
Unofficial GoHighLevel CLI. Zero dependencies. MIT. npx sizmo or node bin/sizmo.mjs.
Every command: --json (stable envelope) · --profile <name> (multi-client) · --loc <id> (override).
Look Up IDs Before Running a Command
sizmo list
sizmo list calendars
sizmo list pipelines
sizmo list tags
sizmo list fields
sizmo list values
sizmo list users
sizmo list forms
sizmo list surveys
sizmo list products
sizmo list links
sizmo list businesses
sizmo list objects
sizmo contact find "Ana Cruz"
sizmo contact find ana@example.com
sizmo contact find "ana" --limit 25
All pull from local model cache (0 API calls except values which is always live).
Run sizmo sync to refresh if data looks stale.
The Core Loop (location-as-file)
sizmo export --out location.json
sizmo diff location.json
sizmo diff before.json after.json
sizmo apply location.json
Diff output is plain English — no IDs, no JSON arrows:
Pipelines
+ Renewals
~ Sales — stages updated
Tags
− cold-lead
Read Commands (no confirmation, no risk)
sizmo brief — morning screen: revenue at risk, unreplied threads, open opps. Start here. (--format md|slack to paste into Slack, email, or Notion)
sizmo focus — one ranked to-do queue by money at stake (--format md|slack)
sizmo triage — unreplied conversation sweep (who is waiting on a human)
sizmo pipeline — pipeline health + stuck deals sweep (closest thing to "list open opportunities") (--format md|slack)
sizmo snapshot — point-in-time state summary
sizmo export — full location dump to JSON (deterministic, key-sorted, byte-identical re-exports)
sizmo apply <file> — confirm-gated, additive only. Creates custom values, custom fields and calendars the file has and this location does not. Matches on NAME (not id), so it is idempotent across locations. It can never create pipelines, location tags or users — GoHighLevel has no API operation for those — and it says so in the preview rather than doing three sixths of the job silently. Never deletes, renames or updates.
sizmo diff <file> [file2] — what changed between saved state and live (or two saved states)
sizmo segment --tag X — find contacts by criteria (tag, phone, created-days, etc.)
sizmo crm — query the local CRM model — counts, lists, staleness
Money surfaces (all read-only — money never moves from the CLI):
sizmo receivables — A/R: who owes, how much, how old (--format md|slack)
sizmo booked-not-paid — sessions with no invoice or payment (the money leak)
sizmo reconcile — money reconciliation: collected by source, flags, recurring (--format md|slack)
sizmo noshow — no-show recovery: who to re-book
sizmo contact find "<query>" — find a contact by name/email/phone; prints the id every write needs (--limit N, default 10)
sizmo invoice list — all invoices; --status draft|sent|paid|void to narrow; --top N
sizmo appointment list — upcoming appointments (next 14 days default); --days N to look further ahead; --top N
Local queue state (never touches GoHighLevel — state lives in ~/.config/sizmo/memory/):
sizmo ack <contactId> — snooze a contact so they stop surfacing in focus/brief
sizmo ack --list — every active snooze with its expiry (expired ones marked)
sizmo ack --clear <contactId> — un-snooze; the item returns to the queue immediately
- Acked items are hidden, not deleted, and their count is always signalled in the
focus/brief footer. Pass --show-acked to reveal them. If a contact you expect is
missing from a queue, check here before concluding the data is wrong.
Write Commands (all need --confirm)
Every flag name below is verified against the actual source, not assumed — a prior version of this
file had several fabricated ones (tag add, --stage-id, send email <id> --subject) that never
matched the real CLI. If a flag here ever looks wrong, sizmo help <command> is the ground truth.
sizmo contact create --email a@b.co --name "Ana Cruz" --confirm
sizmo contact upsert --email a@b.co --name "Ana Cruz" --confirm
sizmo contact update <contactId> --email new@x.com --confirm
sizmo contact delete <id> --confirm
sizmo opp create --name "Deal" --pipeline "Sales Pipeline" --stage "New Lead" --contact <id> --confirm
sizmo opp move <id> --stage "Won" --confirm
sizmo opp update <id> --value 5000 --status won --confirm
sizmo opp delete <> --confirm
sizmo tag <contactId> --add vip --confirm
sizmo tag <contactId> --remove cold-lead --confirm
sizmo note <contactId> --text --confirm
sizmo calendar create --name [-- --slot-min --team-member uid1,uid2] --confirm
sizmo calendar delete <> --confirm
sizmo appointment book --calendar --contact <> --start 2026-07-15T14:00:00Z --confirm
sizmo appointment update <apptId> --start 2026-08-02T14:00:00Z --end ...Z --confirm
sizmo appointment update <apptId> --status noshow --confirm
sizmo appointment book --calendar --contact <> --start 2026-07-15T14:00:00Z \
--end 2026-07-15T15:00:00Z --title --assigned-user <userId> --no-notify --confirm
sizmo appointment cancel <apptId> --confirm
sizmo appointment note <apptId> --text --confirm
sizmo field update <fieldId> --name --confirm
sizmo field update <fieldId> --placeholder --confirm
sizmo value update <valueId> --value --confirm
sizmo value update <valueId> --name --confirm
sizmo field create --name [-- TEXT --model contact] --confirm
sizmo field delete <fieldId> --confirm
sizmo value create --name --value --confirm
sizmo value delete <valueId> --confirm
sizmo create --name --redirect-to --confirm
sizmo delete <linkId> --confirm
sizmo send <contactId> --channel email --message --confirm
sizmo send <contactId> --channel email --message --subject --confirm
sizmo send <contactId> --channel sms --message --schedule 2026-08-01T09:00:00Z --confirm
sizmo send <contactId> --channel sms --message --confirm
sizmo send cancel <messageId> --channel sms --confirm
sizmo invoice draft --contact <> --item [--currency PHP --due 2026-08-01] --confirm
sizmo invoice send <invoiceId> --confirm
Forms, Surveys, Transactions, B2B
sizmo forms
sizmo forms <formId>
sizmo surveys
sizmo surveys <surveyId>
sizmo transactions
sizmo transactions --top 50 --type subscription
sizmo transactions --json
sizmo business list
sizmo business create --name "Acme" --website "https://..." --confirm
sizmo business update <id> --city "Cebu" --confirm
sizmo business delete <id> --confirm
Auth
sizmo init
sizmo config set --profile client1 --loc <locationId> --pit-stdin
sizmo auth status
sizmo doctor
PIT lives at ~/.config/sizmo/profiles.json (mode 0600). Never in argv, never in env passed from outside, never committed.
Safety Model
- No card-charging command exists — GoHighLevel exposes no public endpoint for it.
invoice draft
creates a document, invoice send delivers a pay-link the customer acts on; both confirm-gated.
- Scope-is-the-gate (since 2.0) — sizmo exposes only what your PIT's scopes + the public API
allow; a missing scope → clear error + exact GHL settings path to fix it.
degraded:true in JSON envelope ≠ zero — a source was blocked. Read warnings[]. Never treat blocked as "0".
- Deletion is single-target, never bulk — every
delete fetches the resource first, names it in
the confirm preview, then deletes that one record by id. No --all, no wildcard.
- Exit codes:
0 ok · 1 API error · 2 usage · 3 auth/no-location · 4 not found · 5 needs --confirm
Natural Language Interface (optional — requires AI key)
sizmo ask "brief"
sizmo ask "who hasn't replied in 3 days"
sizmo ask "tag Ana Cruz as follow-up"
sizmo ask --confirm
sizmo ask "tag Ana as follow-up and book her Friday at 2pm" --confirm
sizmo ask "delete Marco's stalled deal"
sizmo ask --confirm
sizmo ask "create a trigger link for the black friday promo pointing to https://…" --confirm
Setup:
sizmo config set --profile <name> --ai-key "sk-ant-..." --ai-provider anthropic
sizmo config set --profile <name> --ai-key "sk-..." --ai-provider openai
Flow: intent → (bare command names skip the AI entirely) → LLM resolves one or more steps →
reads run immediately; writes preview + cache the resolved plan → a bare --confirm replays that
exact plan (never re-asks the AI, so it can't fire something different from the preview).
Confidence < 70% → asks to rephrase. Contact/opportunity names → auto-search → resolves to ID.
Pronoun follow-ups ("her") resolve from a local cache — the AI only ever sees a placeholder token.
Providers: anthropic (default, claude-haiku-4-5-20251001) · openai (gpt-4o-mini).
Fires directly: tag, note, send, contact (create/upsert/delete), opp (create/move/delete),
value (create), field (create/delete), calendar (create/delete), business (create/update/delete),
link (create). Resolve-and-print only (needs a bare id, or is money/scheduling that stays a
deliberate manual step): opp update, appointment book/cancel/note, send cancel, link delete,
invoice draft/send. Full walkthrough with examples: docs/how-to/ask.md.
As an Agent Tool
Call one command per question. Use --json for structured output. Check degraded flag before trusting numbers. Never fire a write without the human at the keyboard triggering the --confirm step — that gate is the human in the loop. A sentence typed WITH --confirm fires in one call for non-destructive writes (tag, note, book) — you are approving the sentence, not a preview. Anything DESTRUCTIVE (delete, cancel) refuses that shortcut: it previews the exact record and exits 5, so a second bare sizmo ask --confirm is required.
sizmo brief --json --profile acme
sizmo diff snapshot.json --json
sizmo contact upsert --email x --json
Built by Sizmo / CJ Salamida. Unofficial — not affiliated with HighLevel.
Repo: github.com/csalamida/sizmo-ghl-cli