The Creem CLI is probably the tool that changed how I handle payments the most. I stopped switching to a dashboard. Transactions, subscriptions, checkout status — all right here in the terminal, next to my code.
If you’re a solo dev or indie hacker shipping a SaaS product, you know the pain. You push a change to your checkout flow, switch to the browser, open the payment dashboard, wait for it to load, click around to find the transaction, check the subscription status… and then go back to your editor. That context switch kills momentum.
This is the workflow I use every day on my project my-first-1m-saas. Creating products, testing payments, debugging, and handing the boring stuff off to an AI agent. I also made a YouTube video walking through the whole thing if you prefer watching over reading.
Setup takes thirty seconds
brew tap armitage-labs/creem && brew install creem
Standard Homebrew tap. Linux binary is on their docs.
creem login
Opens a browser, you authenticate, key gets stored locally. Then check your identity:
creem whoami
See the creem_test_ prefix? That means sandbox mode. No real charges. Break things freely.
One more thing — if you use an AI coding assistant, point it to creem.io/SKILL.md. That’s the CLI reference made for AI agents. We’ll come back to this.
Create a product and test payments
Let me create a subscription product:
creem products create \
--name "pro plan" \
--description "pro plan for my 1m saas" \
--price 1999 \
--currency USD \
--billing-type recurring \
--billing-period every-month \
--tax-category saas \
--tax-mode inclusive
Prices are in cents — 1999 means $19.99. Tax category is SaaS, so Creem handles global tax automatically. I don’t think about VAT or GST.
Product’s live. Now open the checkout URL and do a test purchase. Creem gives you test cards:
4242 4242 4242 4242— always succeeds4000 0000 0000 0002— always declines (insufficient funds)
Any future expiry, any CVC. I test both every time before shipping a checkout change. Happy path, sad path, make sure both work.
Verify with CLI, not the dashboard
This is the part that actually matters. After a test purchase, I don’t go to the browser. I stay in the terminal.
creem checkouts get ch_3maG1MXsrJLQC1FRzu8lrA
Status: completed. Matches the browser.
creem transactions list --limit 5 --json
Transaction is there. Amount, currency, status — all JSON. I can pipe this into jq, but right now I just want to see it.
creem subscriptions list --status active --json
Subscription is active. Full chain works — product, checkout, payment, subscription.
That’s the feedback loop. Code, test, verify. Takes about ten seconds. No dashboard, no refreshing.
The debugging mindset
Here’s where the CLI gets really useful. Say a customer paid, but your app still shows them on the free plan. Where’s the problem?
Three possibilities:
- Payment didn’t go through. Card declined, frontend didn’t catch it.
- Payment went through, but the webhook never hit your server. Wrong endpoint, server was down.
- Server got the webhook, but the code didn’t handle it. Bug in the handler, database write failed.
So I check the payment side first:
creem transactions list --limit 5 --json
creem subscriptions list --status active --json
Transaction exists. Subscription is active. Creem did its job.
So the problem is on my end — webhook handler or database. CLI just narrowed it from three possibilities to one. No log diving needed.
That’s the mental model. Start from the payment platform, work back to your code.
TUI mode — when you don’t know what to search for
Sometimes I don’t have a specific query. I just want to browse.
creem transactions
No subcommand — it opens an interactive browser. Like a dashboard, but in the terminal.
j and k to move (same as Vim), Enter for details, q to quit. Works for products, customers, subscriptions too.
creem subscriptions
I use this when I don’t know what to search for. Open TUI, scroll around, grab an ID, then run a specific command.
Let the AI agent take over
Everything I just did — create product, test checkout, verify — all manual. Now same thing, but with an AI agent.
I’m using Codex here. Works with Claude Code, Cursor, anything that runs shell commands.
Remember SKILL.md? I pointed the agent to it. That file has every command, every flag, every output format. The agent doesn’t guess — it reads the docs and runs exact commands.
I told it: “Create a Max plan, $199 a month, recurring, SaaS.”
It runs the same products create I typed earlier. Same flags, figured out the values from my prompt. Product created. Checkout done. Subscription confirmed. Same result, zero typing.
This is why --json matters. The agent doesn’t need pretty tables — it needs structured data it can parse. Not screenshots — actual JSON.
AI business summary
Once the agent has CLI access, you can ask bigger questions.
I asked: “Give me a business summary.”
It starts with whoami to check the account. Then products list, customers list, subscriptions list, transactions list — pulling everything with --json.
Then it puts it together:
- 2 products, 1 customer, 2 active subscriptions
- MRR $218.99, ARR $2,627.88
- 91% revenue from the Max plan
Six commands, one question, full business snapshot. I didn’t copy or format anything. The agent figured out which commands to run, what data to pull, and how to calculate MRR from the subscription prices.
For a solo dev — this is huge. A business overview that normally needs a BI tool or a spreadsheet, done in thirty seconds. And it updates every time you ask — no stale dashboards, no manual data entry.
Day-to-day: humans vs AI agents
Beyond building and debugging, here are the commands I use regularly. I run them side by side — me on the left, AI agent on the right.
Left pane — table output, for humans:
creem products list
creem subscriptions list --status active
creem customers list
Table output. Names, prices, status — at a glance. No --json needed. Tables are for me.
Right pane — same thing, AI agent uses --json:
I give the agent this prompt:
Check my store status: list all products, count active and past-due subscriptions, and find the billing portal link for customer cust_VK1w1RZhhPRFUJ0VcHfRH.
The agent runs:
creem products list --json | jq '.items[].name'
creem subscriptions list --status active --json | jq '.items | length'
creem subscriptions list --status past_due --json | jq '.items | length'
creem customers billing cust_VK1w1RZhhPRFUJ0VcHfRH
Same data, different format. Tables for humans, JSON for agents. Only difference is one flag.
Real scenario — customer emails about an invoice or wants to update their card:
creem customers list
Grab their ID…
creem customers billing cust_VK1w1RZhhPRFUJ0VcHfRH
One command, billing portal link. Send it to the customer. Done.
The verification script
Every time I test a purchase, I run three commands to verify. Let me turn that into a script.
#!/bin/bash
# Run after a test purchase to verify the full chain
CHECKOUT_ID=$1
echo "Verifying checkout $CHECKOUT_ID..."
STATUS=$(creem checkouts get $CHECKOUT_ID --json | jq -r '.status')
echo "Checkout: $STATUS"
SUB=$(creem subscriptions list --status active --json | jq -r '.items[-1].status')
echo "Subscription: $SUB"
TXN=$(creem transactions list --limit 1 --json | jq -r '.items[0].status')
echo "Transaction: $TXN"
if [ "$STATUS" = "completed" ] && [ "$SUB" = "active" ] && [ "$TXN" = "paid" ]; then
echo "✓ All good — full chain verified"
else
echo "✗ Something broke. Check webhook handler."
fi
Pass in a checkout ID. It checks checkout, subscription, transaction — all three.
chmod +x verify-checkout.sh
./verify-checkout.sh ch_3maG1MXsrJLQC1FRzu8lrA
All green — full chain works. If something breaks, you see exactly which step failed.
This is the same feedback loop from earlier, just automated. Change code, run the script, ten seconds. This script is in the GitHub repo.
That’s my setup
CLI gives me the feedback loop — create, test, verify. One script, ten seconds.
AI agent handles the rest — summaries, lookups, repetitive stuff. The split is simple: I do the thinking, the agent does the typing.
The only thing that really changed my workflow was treating the CLI as the default. Not the dashboard, not the browser. The terminal. Once you’re there, everything else — jq, AI agents, scripts — just clicks into place.
Commands and the verification script are on GitHub. SKILL.md is the CLI reference for AI agents.
The key insight is really simple: your payment platform should live where your code lives. Not in a separate browser tab. Not behind a login screen. Right there in the terminal. Once I internalized that, everything got faster — testing, debugging, even business decisions.
If you’ve got a better workflow, I’d like to hear about it.