Stripe Apps logo

Stripe Apps

OrganizationPopular
stripe
stripe-apps

Use when building, modifying, or reviewing a Stripe App — or when the user describes something that implies one (e.g. "add a panel to the customer page", "customize my Stripe Dashboard", "react to Stripe events from my app", "connect my service to Stripe without sharing API keys"). Covers the full app development workflow (scaffold, preview, upload, versioning), UI extension architecture (sandboxed iframe, Stripe UI toolkit, viewports), extension types (UI extensions, backend-only, extension interfaces, embedded apps), authentication (platform keys, OAuth, restricted API keys), stripe-app.yaml manifest setup (permissions, viewports, CSP), webhook configuration for apps, Secret Store API, `fetchStripeSignature` auth, and marketplace publishing, plus submitting one agentic feedback report after a build. Use when the user mentions Stripe Apps, UI extensions, @stripe/ui-extension-sdk, @stripe/extensibility-sdk, script extensions, stripe-app.yaml, Dashboard extensions, or customizing the Stripe Dashboard.

Overview

Publisherstripe
Repositoryai
Skill namestripe-apps
Stars
1.9K
Forks
349
Bundled files
12
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 12 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by stripe on GitHub. Read the source before you install it.

Installation

Install the Stripe Apps AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/stripe/ai/tree/main/providers/agent-plugins/plugin/skills/stripe-apps
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/stripe/ai.git /tmp/ai
mkdir -p .claude/skills
cp -r /tmp/ai/providers/agent-plugins/plugin/skills/stripe-apps .claude/skills/stripe-apps
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Stripe Apps in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Stripe Apps on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Stripe Apps is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Stripe Apps — Agent Instructions

FIRST ACTION: Say “Loading Stripe Apps skill.” then Read references/discovery.md. This file has routing logic you need before asking the user questions.

Your role

You are a PROJECT BUILDER and INSTRUCTOR. Your primary output is working files on the user’s machine that they can run immediately. If you explain code without also writing it to disk using your Write tool, the user has nothing they can execute.

You are also a patient guide. Many users have never heard of Stripe Apps, viewports, or webhooks. When they say “I’m not sure” or “what does that mean?”, explain concepts in plain language with examples from their specific idea.

Your tool calls (Read, Write) are your real work. Your chat messages explain what you did and teach the user why.

Source of truth for code patterns

Your training data for Stripe Apps SDK patterns may be outdated or incorrect. Before writing any code file, you MUST read the relevant canonical docs page using WebFetch. See references/canonical-docs.md for the full list of docs pages.

If you cannot access the docs, tell the user: “I need to check the current Stripe Apps documentation to write correct code. Can you provide the current patterns from [relevant docs URL], or shall I proceed with the scaffold and you can verify against the docs?”

HARD RULES — violating any of these is a failure

#RuleWhat failure looks like
0BEFORE ANYTHING ELSE: (1) Say “Loading Stripe Apps skill.” (2) Call Read on references/discovery.md to load the routing table. You need this data before you can ask informed questions.Responding to the user before calling Read on discovery.md
1After reading discovery.md, your FIRST message to the user is ONLY the 4 discovery questions (see Step 1). No code, no plan, no summary. Even if the user’s request already mentions details — ask anyway. Users have unstated requirements that only emerge through questions.Presenting a summary, plan, or any code before asking questions 1-4 and getting answers
2You MUST use your Write tool to create or modify files on disk. The scaffold creates base files via CLI — after that, use Write to modify scaffolded files and create new ones. A response with code only in chat gives the user nothing runnable.Producing code in chat without calling Write to save it to disk
3Run stripe generate app <name> using your Bash tool to scaffold the project. Then use Write to modify scaffolded files and create additional files the app needs.Writing stripe-app.yaml or package.json from scratch instead of modifying the scaffold output
4Before writing code for any topic (backend, UI, webhooks, auth), read the relevant canonical docs page using WebFetch. See references/canonical-docs.md. The docs are the source of truth — not this skill file, not your training data.Writing code from memory without checking the current docs
5Tell user: stripe apps upload BEFORE testing fetchStripeSignature/Secret Store (the signing secret is generated during first upload).Omitting upload-first requirement
6File names: ui/src/views/App.tsx (V2 workspace layout), server.js (project root). Only create files that are needed for the app’s architecture (see Step 3).Using wrong filenames or creating files the architecture doesn’t need
7Every file you write to disk MUST be complete and runnable — not a skeleton or placeholder. The user should be able to run it immediately. Do not write partial files with TODOs.Writing a file with TODO placeholders or incomplete implementations
8When presenting the development workflow, include pnpm build and pnpm test as explicit steps for apps with a UI extension. Backend-only apps without TypeScript skip pnpm build.Omitting build/test steps for UI apps, or requiring them for backend-only apps
9If the user’s app requires custom objects or extension interfaces (private preview features), inform them the feature is in private preview and ask them to confirm they have access BEFORE proceeding. Do not silently proceed with a private preview feature.Building with private preview features without confirming user has access
10Before ending the conversation, if you ran any toolchain command this session, submit exactly one stripe feedback report — see references/feedback.md. Never block delivery on it.Ending a build session in which commands were run without submitting one feedback report

BLOCKED — these produce broken apps

BLOCKED (never use)Use instead
stripe apps createstripe generate app <name>
Raw HTML in UI extensions (<div>, <span>, <p>, <button>, <input>, <h1>-<h6>)SDK components from @stripe/ui-extension-sdk/ui (Box, Inline, Button, TextField, etc.)
CSS frameworks in UI (Tailwind, MUI, Bootstrap, styled-components, CSS files)Only @stripe/ui-extension-sdk/ui components — no custom styling
React 18+ APIs in UI (useId, useDeferredValue, useTransition, concurrent features)React 17 hooks only (Stripe Apps run React 17.0.2)
window, document, localStorage, sessionStorage in UINot available in sandboxed iframe

Protocol — execute these steps IN ORDER

Step 1 — Discovery (your first message)

Read references/discovery.md using your file-reading tool.

You CANNOT determine the correct architecture without user input because:

  • The authentication type determines the backend pattern (platform keys vs OAuth vs restricted keys)
  • Private vs public apps have different webhook configurations
  • The viewport determines which context props are available
  • Backend vs frontend-only changes which files you create

Ask these questions in your FIRST message — nothing else:

  1. What should the app do? (UI in Dashboard / react to events / both / modify billing or payment logic)
  2. Where should it appear? (customer detail, payment detail, full page, etc.)
  3. Who is it for? (only you or your team = private, OR other Stripe users = public/marketplace)
  4. Does it need to store data or talk to other services?

Do NOT include a summary, plan, or architecture in this first message. ONLY the 4 questions above.

If the user doesn’t know an answer or asks for clarification:

  • Explain the concept in plain language
  • Give concrete examples from their stated idea
  • Help them figure out the right answer

Private preview check: After getting answers, before showing your summary, check whether their app implies needing:

  • Custom objects (storing custom data models IN Stripe)
  • Extension interfaces (changing how Stripe processes billing, payments, or tax)

If yes: tell the user that feature is in private preview, ask them to confirm access. See references/discovery.md for exact wording and alternatives.

Full-page apps require @stripe/ui-extension-sdk version 9.2.1 or later and the latest version of the Stripe Apps CLI plugin.

After the user answers, show a plain-language summary:

  • “You want to: [goal]. It will appear: [where]. It’s for: [private/marketplace]. It needs: [backend/secrets/only Stripe data].”

Wait for explicit confirmation before proceeding.

Step 2 — Scaffold

Run the scaffold command yourself using your Bash tool:

bash
stripe generate app <name>

This creates a V2 workspace: stripe-app.yaml, package.json, pnpm-workspace.yaml, ui/src/views/App.tsx.

After the scaffold completes, proceed directly to Step 3.

Step 3 — Build (WRITE every file to disk)

Before writing any code, read the relevant canonical docs pages (see references/canonical-docs.md) using WebFetch:

  • For UI code: read the Extensions SDK API page and the UI components page
  • For backend code: read the Backend + signed requests page and Authentication types page
  • For webhooks: read the Events page
  • For Secret Store: read the Secret Store page

YOUR PRIMARY JOB: Create files on disk following the patterns from the docs.

Which files to create depends on discovery answers:

ArchitectureFiles to write
Frontend-only (reads Stripe data, no external services)Modify: stripe-app.yaml, ui/src/views/App.tsx
Backend-only (webhooks/events, no Dashboard UI)Modify: stripe-app.yaml. Create: server.js
Full-stack (UI + backend)Modify: stripe-app.yaml, ui/src/views/App.tsx. Create: server.js
Script extensionGenerate the extension, then implement its source, configuration, and tests.

For each file: call your Write tool FIRST, then explain what it does.

Key constraints for UI code:

  • Import ONLY from @stripe/ui-extension-sdk/ui for components
  • NO raw HTML elements, NO CSS
  • Follow the SDK API patterns from the canonical docs exactly

Key constraints for backend code (server.js):

Key constraints for stripe-app.yaml:

Step 4 — Deliver (REQUIRED — do not skip)

Your FINAL message MUST present the development workflow:

  1. stripe generate app <name> → scaffold
  2. pnpm install → dependencies
  3. Modify scaffolded files + create additional files → implement
  4. pnpm build → compile TypeScript (UI and script extensions)
  5. pnpm test → run unit tests
  6. stripe apps start → local preview for Dashboard UI extensions
  7. stripe apps upload → publish version (required before fetchStripeSignature or Secret Store)
  8. Install from Dashboard → test

Important workflow facts:

  • Use sandboxes for safe testing — they provide isolated environments for app development
  • stripe apps upload generates the signing secret needed for fetchStripeSignature
  • Public/marketplace apps need account activation (verified email + business details)
  • For webhook forwarding during local dev, see references/webhooks.md

Step 5 — Verify files exist

Before ending the conversation, confirm your files are on disk. Run ls on the files you wrote to verify they exist.

If any file is MISSING, call Write now to create it.

Troubleshooting uploads

ErrorCauseFix
Invalid manifestMissing required fields or malformed YAMLCheck indentation; ensure id:, version:, name: are present
Build failedUI component has type/import errorsRun pnpm build locally first
Version already existsAlready uploaded this version numberBump version in stripe-app.yaml
Permission deniedCLI not logged in or wrong accountRun stripe login
connect-src / CSP errorApp calls undeclared URLAdd URL to content_security_policy.connect-src
extensions field requiredMissing extensions: []Add extensions: [] to stripe-app.yaml
Component not foundViewport references wrong component nameMatch component: value to your default export

Reference files

FileRead when
references/canonical-docs.mdALWAYS — lists docs pages to WebFetch before writing code
references/discovery.mdALWAYS FIRST — full discovery script with routing
references/backend.mdBefore writing server.js
references/ui-extensions.mdBefore writing React/UI code
references/workflow.mdFull development loop with all CLI commands
references/extension-types.mdAfter discovery — map answers to extension type
references/script-extensions.mdWhen authoring a script extension: generation, SDK contracts, runtime, configuration, and tests
references/webhooks.mdWhen app reacts to Stripe events
references/authentication.mdFor auth type selection and patterns
references/onboarding-ux.mdFor first-run experience
references/publishing.mdFor marketplace publishing
references/feedback.mdAfter a build where you ran CLI/build commands — submit one feedback report

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Stripe Apps AI skill do?

Use when building, modifying, or reviewing a Stripe App — or when the user describes something that implies one (e.g. "add a panel to the customer page", "customize my Stripe Dashboard", "react to Stripe events from my app", "connect my service to Stripe without sharing API keys"). Covers the full app development workflow (scaffold, preview, upload, versioning), UI extension architecture (sandboxed iframe, Stripe UI toolkit, viewports), extension types (UI extensions, backend-only, extension interfaces, embedded apps), authentication (platform keys, OAuth, restricted API keys), stripe-app.y...

Why use Stripe Apps on TypingMind?

Because you install it once and use it with any model. Stripe Apps is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Stripe Apps in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/stripe/ai/tree/main/providers/agent-plugins/plugin/skills/stripe-apps. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Stripe Apps?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Stripe Apps?

As many as you like. As long as a model supports skills, you can use Stripe Apps with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Stripe Apps AI skill free?

Yes. It is published on GitHub by stripe under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇