<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Santi</title>
    <description>The latest articles on DEV Community by Santi (@santigamo).</description>
    <link>https://dev.to/santigamo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3673582%2F3134f111-9944-40b8-b9ac-3e0173b64f80.jpeg</url>
      <title>DEV Community: Santi</title>
      <link>https://dev.to/santigamo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/santigamo"/>
    <language>en</language>
    <item>
      <title>Building an AI Store Operations Agent for Creem with OpenClaw</title>
      <dc:creator>Santi</dc:creator>
      <pubDate>Tue, 31 Mar 2026 19:56:42 +0000</pubDate>
      <link>https://dev.to/santigamo/building-an-ai-store-operations-agent-for-creem-with-openclaw-3fef</link>
      <guid>https://dev.to/santigamo/building-an-ai-store-operations-agent-for-creem-with-openclaw-3fef</guid>
      <description>&lt;p&gt;Your Creem store generates events all day — new sales, failed payments, cancellations, upgrades, downgrades. If you're a solo founder or a small team, checking the dashboard every few hours is not sustainable. You miss things. A payment fails on Friday night, and you don't notice until Monday. A customer cancels, and by the time you react, they're gone.&lt;/p&gt;

&lt;p&gt;This guide shows you how to build an AI agent that monitors your Creem store 24/7. It doesn't just send alerts — it analyzes situations and takes action. When someone cancels, the agent calculates their lifetime value, decides whether to offer a discount, and executes it. No human in the loop unless the agent isn't confident enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The agent uses three layers, each solving a different problem:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fisnz1x45gckzp7r5o47k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fisnz1x45gckzp7r5o47k.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 1: Webhooks — Real-time event processing
&lt;/h3&gt;

&lt;p&gt;When something happens in your Creem store, the platform fires a webhook event. Our lightweight bridge service (&lt;code&gt;bridge/webhook-receiver.ts&lt;/code&gt;) receives it, verifies the HMAC-SHA256 signature to confirm it's authentic, deduplicates it by event ID, and logs it to &lt;code&gt;events.jsonl&lt;/code&gt; as an audit trail.&lt;/p&gt;

&lt;p&gt;Creem often emits multiple events for one business action — for example a single purchase can generate &lt;code&gt;subscription.update&lt;/code&gt;, &lt;code&gt;subscription.active&lt;/code&gt;, &lt;code&gt;checkout.completed&lt;/code&gt;, and &lt;code&gt;subscription.paid&lt;/code&gt;. To avoid waking the agent four times for one checkout, the bridge batches events for a few seconds and sends a single summary to OpenClaw.&lt;/p&gt;

&lt;p&gt;Instead of using &lt;code&gt;/hooks/wake&lt;/code&gt;, the bridge calls OpenClaw's &lt;code&gt;/hooks/agent&lt;/code&gt; endpoint. That matters because &lt;code&gt;/hooks/agent&lt;/code&gt; can both run an isolated agent turn &lt;strong&gt;and&lt;/strong&gt; deliver the result back to the user over Telegram. The bridge also auto-detects the latest Telegram recipient from OpenClaw's session store, so after you message the bot once, future webhook alerts can be routed there automatically.&lt;/p&gt;

&lt;p&gt;The bridge is intentionally thin — a small Bun + Hono service with no business logic of its own. It doesn't decide what to do. It just makes sure the event is real, logs it, batches noisy event bursts, and hands the situation off to the brain. If you need to audit what happened, &lt;code&gt;events.jsonl&lt;/code&gt; has every verified event with timestamps, customer IDs, and the full raw payload.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 2: CLI — Active control
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://github.com/santigamo/creem-cli-developer-toolkit" rel="noopener noreferrer"&gt;Creem CLI&lt;/a&gt; is how the agent interacts with your store. It can list customers, inspect subscriptions, check transaction history, create discounts, pause subscriptions, and more — all from the terminal.&lt;/p&gt;

&lt;p&gt;This is what makes the agent more than a notification bot. When the churn analysis says "offer a 20% discount to retain this customer," the agent actually does it. It runs &lt;code&gt;creem discounts create&lt;/code&gt;, then notifies you on Telegram with what it did and why.&lt;/p&gt;

&lt;p&gt;The CLI uses the same Creem API you'd use from the dashboard, but it's terminal-native — which means an AI agent can use it directly. No API client libraries, no SDK, no code to maintain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 3: Heartbeat — Periodic health monitoring
&lt;/h3&gt;

&lt;p&gt;Webhooks are fast, but they're not 100% reliable. Networks fail, services go down. The heartbeat is your safety net.&lt;/p&gt;

&lt;p&gt;Every 30 minutes, OpenClaw's native heartbeat system triggers the agent to run a full store health check. The agent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Loads the previous state from &lt;code&gt;~/.creem/heartbeat-state.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Queries the store for current transactions, subscriptions, and customers&lt;/li&gt;
&lt;li&gt;Compares the two snapshots&lt;/li&gt;
&lt;li&gt;Reports any changes — or stays silent if nothing happened&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This means even if a webhook gets lost, the heartbeat catches it within 30 minutes. The state file persists across restarts, so the agent never loses track of where it was.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proactive Workflows
&lt;/h2&gt;

&lt;p&gt;The agent handles all 13 Creem webhook events, but three workflows stand out:&lt;/p&gt;

&lt;h3&gt;
  
  
  Failed payment alerts
&lt;/h3&gt;

&lt;p&gt;When a subscription goes &lt;code&gt;past_due&lt;/code&gt;, the agent doesn't just say "payment failed." It fetches the customer's details, checks their transaction history (first-time failure vs. repeat offender), and sends you a Telegram alert with full context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer email and product&lt;/li&gt;
&lt;li&gt;Payment amount&lt;/li&gt;
&lt;li&gt;How long they've been a subscriber&lt;/li&gt;
&lt;li&gt;Whether this is a recurring problem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This context matters. A first-time failure on a $200/month enterprise customer deserves more attention than a repeat failure on a $5 trial.&lt;/p&gt;

&lt;h3&gt;
  
  
  Churn detection and autonomous retention
&lt;/h3&gt;

&lt;p&gt;This is the agent's most powerful workflow. When a subscription is canceled or scheduled for cancellation:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The agent fetches the customer's full history — product, plan, country, subscription age&lt;/li&gt;
&lt;li&gt;It calculates their lifetime value by summing all transactions&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It analyzes the situation and chooses one of three actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Create a retention discount&lt;/strong&gt; — for high-value customers worth saving&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Suggest pausing&lt;/strong&gt; — for customers who might come back later&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No action&lt;/strong&gt; — for very new or low-value customers&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the agent's confidence is &lt;strong&gt;80% or higher&lt;/strong&gt;, it executes the action autonomously and notifies you after the fact&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If confidence is &lt;strong&gt;below 80%&lt;/strong&gt;, it sends you a recommendation on Telegram and waits for approval&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This confidence-based execution model means the agent handles the clear cases on its own (saving you time) while escalating the ambiguous ones (keeping you in control). You get the best of both worlds: automation without blind trust.&lt;/p&gt;

&lt;h3&gt;
  
  
  Daily revenue digest
&lt;/h3&gt;

&lt;p&gt;Every day, the agent generates a summary of your store's activity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total revenue for the day&lt;/li&gt;
&lt;li&gt;Number of new transactions and customers&lt;/li&gt;
&lt;li&gt;Subscription changes (new, canceled, upgraded, downgraded)&lt;/li&gt;
&lt;li&gt;Active subscriber count&lt;/li&gt;
&lt;li&gt;Comparison with the previous day&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This replaces the "open the dashboard and squint at graphs" ritual. One Telegram message, every morning, with everything you need to know.&lt;/p&gt;

&lt;h2&gt;
  
  
  Natural Language Queries
&lt;/h2&gt;

&lt;p&gt;You don't need to memorize CLI commands. Just ask the agent in plain English:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"How much revenue did we make this week?"&lt;/li&gt;
&lt;li&gt;"How many active subscribers do we have?"&lt;/li&gt;
&lt;li&gt;"Who cancelled today?"&lt;/li&gt;
&lt;li&gt;"Show me the last 10 transactions"&lt;/li&gt;
&lt;li&gt;"What products do we have?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent translates your question into the right CLI commands, runs them, and gives you a human-readable answer. This works because OpenClaw agents have full access to the tools defined in their skills — the Creem CLI is just another tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.openclaw.ai/" rel="noopener noreferrer"&gt;OpenClaw&lt;/a&gt; installed and running&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/santigamo/creem-cli-developer-toolkit" rel="noopener noreferrer"&gt;Creem CLI&lt;/a&gt; installed and authenticated&lt;/li&gt;
&lt;li&gt;A Creem API key (test mode recommended to start)&lt;/li&gt;
&lt;li&gt;A Telegram bot (create one via &lt;a href="https://t.me/botfather" rel="noopener noreferrer"&gt;@BotFather&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://bun.sh/" rel="noopener noreferrer"&gt;Bun&lt;/a&gt; runtime (for the webhook bridge)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ngrok.com/" rel="noopener noreferrer"&gt;ngrok&lt;/a&gt; (to expose the webhook bridge to the internet)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 1: Clone the repo
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/santigamo/creem-openclaw-agent
&lt;span class="nb"&gt;cd &lt;/span&gt;creem-openclaw-agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything lives in the repo: AGENTS.md, HEARTBEAT.md, the skill, and the webhook bridge.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Install the skills
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install the Creem CLI skill&lt;/span&gt;
npx skills add santigamo/creem-cli-developer-toolkit

&lt;span class="c"&gt;# Copy the store agent skill into the OpenClaw workspace&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; skills/creem-store-agent ~/.openclaw/workspace/skills/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Merge agent instructions into the workspace
&lt;/h3&gt;

&lt;p&gt;Instead of blindly overwriting the workspace files, ask the agent to read the repo versions and merge them into its current workspace:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Read these two files and merge their content into your current AGENTS.md and HEARTBEAT.md.
Our content takes priority — keep any useful defaults from the current files but the
core instructions should come from ours:

~/Code/creem-openclaw-agent/AGENTS.md
~/Code/creem-openclaw-agent/HEARTBEAT.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This preserves any useful OpenClaw defaults while applying the Creem-specific behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Enable hooks in OpenClaw
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw config &lt;span class="nb"&gt;set &lt;/span&gt;hooks.enabled &lt;span class="nb"&gt;true
&lt;/span&gt;openclaw config &lt;span class="nb"&gt;set &lt;/span&gt;hooks.token &lt;span class="s2"&gt;"your-hooks-secret"&lt;/span&gt;
openclaw gateway restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Configure the webhook bridge
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fill in your &lt;code&gt;.env&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;CREEM_WEBHOOK_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_signing_secret   &lt;span class="c"&gt;# From Creem dashboard → Webhooks&lt;/span&gt;
&lt;span class="nv"&gt;OPENCLAW_HOOKS_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_hooks_token      &lt;span class="c"&gt;# Same value used in OpenClaw hooks config&lt;/span&gt;
&lt;span class="nv"&gt;WEBHOOK_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 6: Start the bridge and tunnel
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Terminal 1: webhook bridge&lt;/span&gt;
pnpm &lt;span class="nb"&gt;install
&lt;/span&gt;pnpm webhook

&lt;span class="c"&gt;# Terminal 2: ngrok tunnel&lt;/span&gt;
ngrok http 3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Register the ngrok public URL in the Creem dashboard as your webhook endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://your-ngrok-url.ngrok-free.app/api/webhooks/creem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 7: Enable Telegram delivery
&lt;/h3&gt;

&lt;p&gt;Message your Telegram bot &lt;strong&gt;once&lt;/strong&gt;. That's enough.&lt;/p&gt;

&lt;p&gt;OpenClaw creates a Telegram session for that conversation, and the webhook bridge can auto-detect that session and route future alerts there. No manual chat ID lookup is required.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 8: Open the WebUI and run
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. The agent starts monitoring on the next heartbeat cycle (every 30 minutes), and processes webhook events in real time.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Extend
&lt;/h2&gt;

&lt;p&gt;The agent is built with standard OpenClaw patterns, so extending it is straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Add more notification channels&lt;/strong&gt; — The skill can be modified to send alerts to Slack or Discord instead of (or in addition to) Telegram&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom retention logic&lt;/strong&gt; — Edit the churn analysis section in &lt;code&gt;skills/creem-store-agent/SKILL.md&lt;/code&gt; to adjust confidence thresholds or add new retention strategies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Additional workflows&lt;/strong&gt; — Add dispute handling, upgrade celebration messages, or weekly trend reports by extending the skill&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple stores&lt;/strong&gt; — Run separate OpenClaw agents with different Creem API keys, each monitoring its own store&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key design principle is that the agent's behavior is defined in plain text files (SKILL.md, AGENTS.md, HEARTBEAT.md). No code to compile, no plugins to build. You edit markdown, restart the gateway, and the agent adapts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;An AI store operations agent is not about replacing human judgment — it's about making sure nothing falls through the cracks. Failed payments get caught immediately. Cancellations get analyzed before they're forgotten. Revenue summaries arrive without you asking.&lt;/p&gt;

&lt;p&gt;The three-layer architecture (webhooks + CLI + heartbeat) gives you speed, control, and reliability. The confidence-based execution model gives you automation without blind trust. And because it's all built on OpenClaw skills, the entire thing is portable, shareable, and extensible.&lt;/p&gt;

&lt;p&gt;Your store never sleeps. Now your monitoring doesn't have to either.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This agent was built for the OpenClaw + CREEM AI Agent Worker Bounty. The full source code, skills, and setup instructions are available on &lt;a href="https://github.com/santigamo/creem-openclaw-agent" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. Questions or feedback? Open an issue or reach out on X &lt;a href="https://x.com/imsantigamo" rel="noopener noreferrer"&gt;@imsantigamo&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>openclaw</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Using the Creem CLI as a Developer Power Tool with Claude Code</title>
      <dc:creator>Santi</dc:creator>
      <pubDate>Sat, 28 Mar 2026 13:19:32 +0000</pubDate>
      <link>https://dev.to/santigamo/using-the-creem-cli-as-a-developer-power-tool-with-claude-code-2861</link>
      <guid>https://dev.to/santigamo/using-the-creem-cli-as-a-developer-power-tool-with-claude-code-2861</guid>
      <description>&lt;p&gt;If you build with Creem, you know the loop: write some code, open the dashboard, check if the checkout went through, check the webhook logs, compare with your local state, go back to the code. Four tabs, three data formats, five minutes just to confirm a test purchase landed. Repeat for every change.&lt;/p&gt;

&lt;p&gt;This guide shows a different approach. You stay in the terminal. The Creem CLI provides the data, Claude Code interprets it, and your app shows the result. Everything in one place.&lt;/p&gt;

&lt;p&gt;I built a small integration to demonstrate this. The repo includes a minimal Bun + Hono app that handles checkouts and webhooks, plus a Claude Code skill that teaches the AI how to operate the Creem CLI safely. The entire workflow — verify, debug, operate — happens from the terminal.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;The integration is intentionally small. A Bun server running Hono that creates checkout sessions, receives and verifies webhook events from Creem using HMAC SHA-256, and persists local state to JSON files. The home page shows a color-coded status badge — green for access granted, red for revoked, yellow for in-progress, gray for no activity — so you can see the current state at a glance without reading JSON.&lt;/p&gt;

&lt;p&gt;The app tracks a simple state machine: &lt;code&gt;unknown → checkout-created → checkout-completed → granted → revoked&lt;/code&gt;. Every transition is driven by a webhook event. If the webhook doesn't arrive, the state doesn't change. This becomes important later.&lt;/p&gt;

&lt;p&gt;The key thing to understand is that the Creem CLI and the app are two independent views of the same data. The CLI talks directly to the Creem API. The app only learns about changes through webhooks. When they agree, everything is fine. When they don't, something broke — and the CLI can help you find out what.&lt;/p&gt;

&lt;h2&gt;
  
  
  Teaching Claude Code the Creem CLI
&lt;/h2&gt;

&lt;p&gt;Claude Code is a capable AI coding assistant, but it doesn't know how to use the Creem CLI out of the box. It doesn't know the commands, the flags, or the conventions — like the fact that Creem returns money amounts in minor units, where &lt;code&gt;500&lt;/code&gt; means &lt;code&gt;5.00 EUR&lt;/code&gt;, not &lt;code&gt;500.00&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That's why I built a skill. In Claude Code, a skill is a structured document that teaches the AI how to use a specific tool. It covers the available commands, the correct flags, safety rules, and common workflows.&lt;/p&gt;

&lt;p&gt;The Creem CLI skill includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A quick reference table for every supported command: products, customers, checkouts, subscriptions, transactions, and configuration&lt;/li&gt;
&lt;li&gt;Rules like "always use &lt;code&gt;--json&lt;/code&gt; for machine-readable output" and "never read or expose the config file at &lt;code&gt;~/.creem/config.json&lt;/code&gt;"&lt;/li&gt;
&lt;li&gt;Money amount conventions: always convert minor units before showing values to the user&lt;/li&gt;
&lt;li&gt;High-value workflows: how to create and verify a checkout, how to look up customers, how to manage subscription lifecycle&lt;/li&gt;
&lt;li&gt;Automation patterns for scripting and piping output through &lt;code&gt;jq&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The skill lives in the repo at &lt;code&gt;skills/creem-cli/SKILL.md&lt;/code&gt; and anyone can install it with one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add santigamo/creem-cli-developer-toolkit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once installed, Claude Code loads the skill automatically when it's relevant. You talk in natural language, and it translates your intent into the correct CLI commands with the right flags and safety constraints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workflow 1: Verify a purchase
&lt;/h2&gt;

&lt;p&gt;The first thing you want to know when building a payment integration is: does it work? Did the checkout go through? Did the webhook land? Does my app agree with the payment provider?&lt;/p&gt;

&lt;p&gt;Normally you'd check the Creem dashboard for the transaction, then check your server logs for the webhook, then maybe hit your debug endpoint to compare. Three different places, three different formats.&lt;/p&gt;

&lt;p&gt;With the CLI skill loaded, the conversation looks like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You:&lt;/strong&gt; "Create a test checkout for my product and give me the URL."&lt;/p&gt;

&lt;p&gt;Claude Code runs &lt;code&gt;creem checkouts create --product &amp;lt;id&amp;gt; --success-url http://localhost:3000/success --json&lt;/code&gt;, parses the response, and hands you the checkout URL. You open it, complete the sandbox purchase with a test card, and come back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You:&lt;/strong&gt; "I just completed the purchase. Can you verify the transaction went through?"&lt;/p&gt;

&lt;p&gt;Claude Code runs &lt;code&gt;creem transactions list --json&lt;/code&gt;, finds the new transaction, and explains: paid, the amount in human-readable format (converting from minor units), the associated subscription ID. No raw JSON to read.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You:&lt;/strong&gt; "Does the subscription look healthy?"&lt;/p&gt;

&lt;p&gt;Claude Code runs &lt;code&gt;creem subscriptions get &amp;lt;id&amp;gt; --json&lt;/code&gt; and confirms: active, renewal date set, everything nominal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You:&lt;/strong&gt; "Check my app's local state too — does it agree with Creem?"&lt;/p&gt;

&lt;p&gt;Claude Code hits &lt;code&gt;curl localhost:3000/api/debug/state&lt;/code&gt;, compares the local access status with what the Creem API returned, and confirms they match. The app's status badge shows green: "Access Granted."&lt;/p&gt;

&lt;p&gt;One conversation, zero dashboard tabs. Claude Code explains the results in plain English, so you don't have to parse any JSON yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workflow 2: Diagnose a state mismatch
&lt;/h2&gt;

&lt;p&gt;Verifying the happy path is useful, but the real value shows up when something breaks. Specifically: when your payment provider knows something that your app doesn't.&lt;/p&gt;

&lt;p&gt;This happens more often than you'd think. A subscription gets paused or canceled on the Creem side, but the webhook doesn't land — maybe your endpoint was down, maybe there was a network hiccup, maybe your tunnel dropped. Your app keeps showing "Access Granted" while the subscription is actually paused. Your user has access they shouldn't have, or worse, they lost access and your app doesn't know.&lt;/p&gt;

&lt;p&gt;Finding this kind of mismatch by hand means opening the Creem dashboard, finding the subscription, checking its status, then comparing with your database or local state, then checking your webhook logs to see if the event was ever delivered.&lt;/p&gt;

&lt;p&gt;Here's how it looks with the CLI:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You:&lt;/strong&gt; "Pause the subscription from my last test purchase, then compare what Creem says with what my app says. I want to know if subscription changes are propagating correctly."&lt;/p&gt;

&lt;p&gt;Claude Code runs the pause command, then gathers evidence from both sides: &lt;code&gt;creem subscriptions get &amp;lt;id&amp;gt; --json&lt;/code&gt; and &lt;code&gt;creem transactions list --json&lt;/code&gt; for the Creem state, and &lt;code&gt;curl localhost:3000/api/debug/state&lt;/code&gt; for the app state. It compares them and reports the finding.&lt;/p&gt;

&lt;p&gt;In my test, the result was clear: Creem shows the subscription as paused, but the app still says "Access Granted." The status badge on the home page is still green. The webhook never arrived.&lt;/p&gt;

&lt;p&gt;Claude Code didn't just find the mismatch — it explained why. The subscription changed in Creem, Creem tried to send a webhook, but the endpoint wasn't reachable. The local state is stale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You:&lt;/strong&gt; "What are my recovery options?"&lt;/p&gt;

&lt;p&gt;Claude Code suggests concrete steps: restore the webhook endpoint, then either replay the event if the platform supports it, or trigger another state change so the next webhook lands and syncs the state. It adapts the suggestions to what it knows about the setup.&lt;/p&gt;

&lt;p&gt;The same investigation through dashboards and logs — opening the subscription page, cross-referencing with webhook delivery logs, checking your server output — would involve a lot more clicking and context-switching. Here it was one prompt and a clear answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workflow 3: Operate the store
&lt;/h2&gt;

&lt;p&gt;The CLI isn't just for testing and debugging. Once you're comfortable with it, you can manage your Creem store without leaving the terminal.&lt;/p&gt;

&lt;p&gt;First, recovery from the previous workflow. After restoring the webhook endpoint:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You:&lt;/strong&gt; "My endpoint is healthy again. Resume that subscription and confirm the current state."&lt;/p&gt;

&lt;p&gt;Claude Code resumes the subscription, verifies the state on both sides, and confirms everything is back in sync. The app's status badge flips back to green, and the webhook event shows up in the recent events table.&lt;/p&gt;

&lt;p&gt;Then, product management:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You:&lt;/strong&gt; "I want to add a Pro Plan to my store. 19 dollars a month, recurring."&lt;/p&gt;

&lt;p&gt;Claude Code runs &lt;code&gt;creem products create&lt;/code&gt; with the right flags: &lt;code&gt;--name "Pro Plan"&lt;/code&gt;, &lt;code&gt;--price 1900&lt;/code&gt; (minor units), &lt;code&gt;--currency USD&lt;/code&gt;, &lt;code&gt;--billing-type recurring&lt;/code&gt;, &lt;code&gt;--billing-period every-month&lt;/code&gt;. One sentence from you, one command from the CLI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You:&lt;/strong&gt; "List all my products to confirm."&lt;/p&gt;

&lt;p&gt;Claude Code runs &lt;code&gt;creem products list --json&lt;/code&gt; and shows you both products — the original test product and the new Pro Plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You:&lt;/strong&gt; "Give me a summary of the current state of my store."&lt;/p&gt;

&lt;p&gt;Claude Code pulls products and subscriptions, cross-references them, and gives you a plain English overview: how many products, how many active subscriptions, current revenue state. The kind of snapshot that would normally require opening the dashboard and clicking through several pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;The pattern here isn't specific to Creem. It's what happens when a CLI tool produces structured JSON output and an AI assistant knows how to read it. The skill bridges the gap — it teaches the AI the commands, the conventions, and the guardrails. Together, they turn a series of manual dashboard checks into a conversation.&lt;/p&gt;

&lt;p&gt;If you've ever spent fifteen minutes bouncing between a payment dashboard, your server logs, and a database query just to confirm a webhook landed, this is the alternative. One terminal, one conversation, same answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;The repo is open and includes everything you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A minimal Bun + Hono app with checkout, webhook, and state tracking&lt;/li&gt;
&lt;li&gt;The Claude Code skill for the Creem CLI&lt;/li&gt;
&lt;li&gt;Setup instructions and environment configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Install the skill:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add santigamo/creem-cli-developer-toolkit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clone the repo, set up your Creem test credentials, start the app, and start talking to Claude Code. The skill handles the rest.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/santigamo/creem-cli-developer-toolkit" rel="noopener noreferrer"&gt;santigamo/creem-cli-developer-toolkit&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cli</category>
      <category>productivity</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
