Creem CLI + AI Coding Assistant: The Payment Workflow I Actually Use

March 31, 2026

The Creem CLI is probably the tool that changed how I handle payments the most. I just stopped opening the dashboard. Transactions, subscriptions, checkout status, it’s all right there in the terminal next to my code.

If you’re a solo dev shipping a SaaS 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. I was doing this like ten times a day and it was killing me.

This is what I actually use every day on my project my first 1m saas. Creating products, testing payments, debugging, and handing the boring stuff to an AI agent. I also made a YouTube video walking through the whole thing if you’d rather watch.

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 stuff 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. It just works.

Product’s live. Now open the checkout URL and do a test purchase. Creem gives you test cards:

  • 4242 4242 4242 4242 always succeeds
  • 4000 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

OK this is the part I care about most. After a test purchase I don’t go to the browser. I stay in the terminal.

creem checkouts get ch_3maG1MXsrJLQC1FRzu8lrA

Status: completed. Same as the browser would show me.

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. Honestly I don’t know how I used to do this through the browser lol.

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:

  1. Payment didn’t go through. Card declined, frontend didn’t catch it.
  2. Payment went through but the webhook never hit your server. Wrong endpoint, server was down.
  3. 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. Once you have this habit it saves you so much time. Like you stop guessing and just check.

TUI mode

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 I’m looking for. Open the TUI, scroll around, grab an ID, then run a specific command. Super handy.

Let the AI agent take over

Everything I just did was manual. Now same thing but with an AI agent.

I’m using Codex here. Works with Claude Code, Cursor, anything that can run 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

This is the part that honestly sold me on the whole workflow.

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. 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. I was genuinely surprised the first time I tried this.

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, all 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 whole interaction takes like 30 seconds.

The verification script

Every time I test a purchase I used to manually run three commands to verify. Checkout, subscription, transaction, every single time. So I just turned it 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.

Same feedback loop as before, just automated. Change code, run the script, ten seconds. The 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. I do the thinking, the agent does the typing.

Commands and the verification script are on GitHub. SKILL.md is the CLI reference for AI agents.

If you’ve got a better workflow I’d like to hear about it.