Skip to content
Back to skills

Stripe Connect

ASecurity

Scaffolds a Stripe Connect marketplace integration (Express + Direct charges + subscriptions embedded) in Supabase + React/Flutter projects. Generates US-SPONSORSHIP with 12 UCs in the project's spec backend, backend Edge Functions + SQL migrations with RLS, frontend templates with Payment Element/Sheet + Apple/Google Pay + Express Checkout, Stitch designs (if VEG configured), stripe-safety-guard hook, events catalog, and wires the official Stripe MCP. Use when the user says "stripe connect",...

  • 16 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added June 1, 2026
developmentpythongobashsqlreactvuenodeexpressfastapitesting

Works with

  • claude code
  • terminal
  • cli
  • api
  • mcp

Security analysis

A100/100

Pro scans all 20 files and shows the line behind each finding

Scanned June 1, 2026

npx -y skills add EmbedBuild/specbox-engine --skill stripe-connect --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Stripe Connect?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Stripe Connect
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/embedbuild-stripe-connect/badge)](https://www.skillsdirectory.com/skills/embedbuild-stripe-connect)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: stripe-connect
description: >
  Scaffolds a Stripe Connect marketplace integration (Express + Direct charges +
  subscriptions embedded) in Supabase + React/Flutter projects. Generates
  US-SPONSORSHIP with 12 UCs in the project's spec backend, backend Edge
  Functions + SQL migrations with RLS, frontend templates with Payment
  Element/Sheet + Apple/Google Pay + Express Checkout, Stitch designs (if VEG
  configured), stripe-safety-guard hook, events catalog, and wires the official
  Stripe MCP. Use when the user says "stripe connect", "marketplace billing",
  "integrar pagos marketplace", "implementar pagos stripe", "monta pagos
  marketplace". v1 scope: Supabase only, Connect Express only, Direct charges
  only, subscriptions only.
context: direct
allowed-tools: Read, Grep, Glob, Bash(*), Write, Edit, mcp__specbox-engine__*, mcp__stitch__*
---

# /stripe-connect — Marketplace Connect integration scaffolder

Genera en un solo comando la integración de Stripe Connect marketplace para un proyecto SpecBox: 12 UCs en el backlog + templates backend Supabase + templates frontend React/Flutter + diseños Stitch (si VEG) + hook de seguridad + docs parametrizadas + Stripe MCP cableado.

La skill **NO envuelve la API de Stripe**. Orquesta piezas existentes (SDK oficial, Stripe MCP oficial, Stripe CLI, pipeline spec-driven, Stitch MCP) con opinión fuerte: **Connect Express + Direct charges + subscriptions embedded-only**.

## Uso

```
/stripe-connect
```

Sin argumentos. La skill detecta todo del proyecto y pregunta solo lo imprescindible.

## Alcance v1 (opinionado)

| Dimensión | Decisión |
|-----------|----------|
| Backend | **Supabase únicamente** (Neon/Firestore/FastAPI → v2 si hay demanda real) |
| Frontend | React 19 o Flutter 3.38+ (Web + Mobile) |
| Account type | Stripe Connect Express |
| Charge model | Direct charges (no Destination, no Separate) |
| Subscriptions | Sí (es el modelo core) |
| Checkout UX | Embedded-only: Payment Element (React) + Payment Sheet (Flutter) |
| Apple/Google Pay | Default on |
| Customer Portal | Fuera (Direct charges → Customer vive en connected account) |
| Marketplace de referencia | Fan suscribe a seller con fee dinámico vía `application_fee_percent` |

Si tu caso no encaja con esto, sal de la skill y usa `infra/stripe/patterns.md` manualmente, o espera a `/stripe` (SaaS vanilla) en v2.

---

## Paso 0 — Preflight: detectar entorno del proyecto

### 0.1 Validar que estamos en un proyecto SpecBox onboardeado

```bash
test -f .claude/settings.local.json || test -f .claude/settings.json || {
  echo "ERROR: Este directorio no parece un proyecto SpecBox. Ejecuta 'onboard_project' primero."
  exit 1
}
```

### 0.2 Detectar stack frontend

```bash
# React
if [ -f package.json ] && grep -q '"react"' package.json; then STACK="react"; fi

# Flutter
if [ -f pubspec.yaml ] && grep -q "flutter:" pubspec.yaml; then
  # Distinguir Web vs Mobile por platforms
  if [ -d ios ] || [ -d android ]; then STACK="flutter-mobile"; else STACK="flutter-web"; fi
fi
```

Si no detecta ni React ni Flutter → abortar con mensaje: *"v1 solo soporta React o Flutter. Otros stacks no están cubiertos."*

### 0.3 Detectar backend Supabase (obligatorio en v1)

```bash
test -d supabase && test -f supabase/config.toml || {
  echo "ERROR: v1 de /stripe-connect requiere Supabase CLI inicializado."
  echo "Ejecuta 'supabase init' antes de continuar, o espera a v2 para otros backends."
  exit 0
}
```

Si Supabase no está inicializado → salir con exit 0 (no es error del engine, es prerequisito del proyecto). AC-02.

### 0.4 Detectar spec backend activo (Trello / Plane / FreeForm)

Leer `.claude/settings.local.json`:
- `trello.boardId` → Trello
- `plane.defaultProject` → Plane
- Sin ninguno → FreeForm en `doc/tracking/`

### 0.5 Detectar presencia de VEG

```bash
test -d doc/veg && test -f doc/design/brand-kit.md && VEG_PRESENT=true || VEG_PRESENT=false
```

Si VEG está presente, la skill generará diseños Stitch en Paso 7. Si no, skip limpio con aviso.

### 0.6 Resumen al usuario

```
Detectado:
  Stack frontend: {STACK}
  Backend: Supabase ✓
  Spec backend: {Trello|Plane|FreeForm}
  VEG: {Sí (arquetipo X) | No — se saltará Stitch}
```

---

## Paso 1 — Pregunta mínima al usuario (AC-03)

Solo 2 preguntas obligatorias:

1. **Confirmar stack detectado** (`y/n`). Si `n`, salir — el dev debe corregir el proyecto antes de volver.
2. **Fee default en porcentaje** para sellers estándar: número entre 1 y 50. Se usará como `DEFAULT_APPLICATION_FEE_PERCENT` en el template de env vars y como default cuando `riders.fee_percent IS NULL`.

No hay más preguntas. El usuario puede ajustar todo lo demás editando los templates generados.

---

## Paso 2 — Mostrar plan de archivos a crear + confirmación (AC-04)

Antes de escribir nada, mostrar lista completa de archivos que se crearán/modificarán, agrupados por categoría:

```
Voy a crear:
  Backend Supabase (9 archivos):
    supabase/functions/create-rider-account-link/index.ts
    supabase/functions/create-fan-subscription/index.ts
    supabase/functions/cancel-fan-subscription/index.ts
    supabase/functions/create-rider-dashboard-link/index.ts
    supabase/functions/stripe-webhook/index.ts
    supabase/migrations/NNN_riders_stripe_account.sql
    supabase/migrations/NNN_sponsorships.sql
    supabase/migrations/NNN_stripe_processed_events.sql
    supabase/migrations/NNN_rls_policies.sql

  Frontend {react|flutter} (N archivos):
    ...

  Documentación (5 archivos):
    infra/stripe/README.md
    infra/stripe/connect-setup.md
    infra/stripe/apple-google-pay-setup.md  (solo Flutter)
    doc/design/billing/events-catalog.md
    doc/design/billing/test-scenarios.md

  Tests de aceptación (12 archivos):
    tests/acceptance/sponsorship/UC-301.feature
    ... UC-312.feature

  Hook de seguridad:
    .claude/hooks/stripe-safety-guard.mjs
    .claude/settings.json (modificado: añade PreToolUse entry)

  MCP externo:
    .claude/settings.local.json (modificado: añade Stripe MCP oficial)

  Spec backend:
    {N} US-SPONSORSHIP + 12 UCs con ACs generados

Total: ~30 archivos nuevos + 2 modificados.
¿Continuar? (s/n)
```

Si `n` → abortar sin escribir nada. Si `s` → proceder.

---

## Paso 3 — Crear US-SPONSORSHIP + 12 UCs en spec backend (AC-05..AC-08)

Usar tools del MCP SpecBox según backend detectado:

```
spec = {
  "us": [{
    "id": "US-SPONSORSHIP",
    "name": "Integración de pagos marketplace con Stripe Connect",
    "description": "Marketplace con fans suscribiendo a sellers vía Stripe Connect Express + Direct charges + application_fee_percent dinámico. Generado por /stripe-connect v5.25.0.",
    "hours": 90,
    "ucs": [
      {"id": "UC-301", "name": "Onboarding de seller (piloto) vía Account Link Express", "actor": "Seller", "hours": 6, ...},
      {"id": "UC-302", "name": "Retorno post-onboarding: activación de perfil", "actor": "Sistema", "hours": 4, ...},
      ... (12 UCs totales)
    ]
  }]
}
```

Cada UC con **mínimo 3 ACs** redactados para pasar el Definition Quality Gate (score ≥ 1.5/2.0). Los AC templates viven en `templates/tests/UC-NNN.feature` y se generan en Paso 10, pero los títulos/descripciones de los ACs se escriben en el spec backend aquí.

### 3.1 Fallback si el spec backend está offline (AC-08)

Try/catch sobre la llamada MCP. Si falla:
```
⚠ Spec backend {Trello|Plane} no responde. Guardando como FreeForm local en doc/tracking/.
```
Llamar `set_auth_token(backend_type="freeform", root_path="doc/tracking")` y reintentar `import_spec`.

---

## Paso 4 — Escribir templates backend Supabase (AC-09..AC-13)

Copiar y parametrizar desde `.claude/skills/stripe-connect/templates/supabase/`:

### 4.1 Edge Functions

5 funciones copiadas a `supabase/functions/` del proyecto:
- `create-rider-account-link/index.ts`
- `create-fan-subscription/index.ts` — usa `application_fee_percent` dinámico desde `riders.fee_percent` (fallback env `DEFAULT_APPLICATION_FEE_PERCENT={fee_default}`), `payment_behavior: 'default_incomplete'`, expansión `pending_setup_intent`
- `cancel-fan-subscription/index.ts`
- `create-rider-dashboard-link/index.ts`
- `stripe-webhook/index.ts` — verificación firma con `constructEventAsync`, routing platform vs connect por header, idempotencia con tabla `stripe_processed_events`

Placeholders a sustituir: `{project_name}`, `{fee_default}`.

### 4.2 Migraciones SQL

4 migraciones copiadas a `supabase/migrations/` con timestamp prefix:
- `NNN_riders_stripe_account.sql` — columnas `stripe_account_id`, `fee_percent NULL`, `onboarding_status`
- `NNN_sponsorships.sql` — tabla completa
- `NNN_stripe_processed_events.sql` — idempotencia
- `NNN_rls_policies.sql` — RLS sobre sponsorships + riders

Todas con `CREATE ... IF NOT EXISTS` para idempotencia (AC-13).

### 4.3 Verificación

```bash
# Opcional: intentar aplicar migraciones localmente si supabase está corriendo
if supabase status 2>/dev/null | grep -q "API URL"; then
  echo "Aplicando migraciones a Supabase local..."
  supabase db push --local && echo "✓ Migraciones aplicadas" || echo "⚠ Revisa los logs de Supabase"
fi
```

---

## Paso 5 — Escribir templates frontend (AC-14..AC-21)

Según `STACK` detectado en Paso 0:

### 5.1 Si STACK=react

Copiar desde `templates/react/` a `src/billing/` del proyecto:
- `stripe-provider.tsx` — `<Elements>` con `appearance` parametrizada
- `sponsor-rider-form.tsx` — `<PaymentElement>` + `<ExpressCheckoutElement>`
- `use-sponsorship.ts` — hook estado loading/success/error/requires_action
- `rider-onboarding-button.tsx`

**Brand Kit integration (AC-16)**:
```bash
if [ -f doc/design/brand-kit.md ]; then
  # Extraer colorPrimary, fontFamily, borderRadius del brand-kit
  # Sustituir en stripe-provider.tsx
else
  # Dejar valores neutros + comentario TODO
fi
```

Mergear dependencias en `package.json` del proyecto (no reemplazar):
```json
{ "@stripe/stripe-js": "^3", "@stripe/react-stripe-js": "^2" }
```

### 5.2 Si STACK=flutter-web o flutter-mobile

Copiar desde `templates/flutter/` a `lib/billing/` del proyecto:
- `stripe_service.dart` — init + Apple Pay + Google Pay con `merchantCountryCode: 'ES'` default
- `sponsor_rider_controller.dart` — detectar si proyecto usa Riverpod o BLoC (`grep -l "flutter_bloc\|flutter_riverpod" pubspec.yaml`) y generar la variante correspondiente
- `apple_pay_button.dart` + `google_pay_button.dart`
- `rider_onboarding_launcher.dart`
- `api_interceptor.dart` — añade `Stripe-Account` header

Mergear deps en `pubspec.yaml`:
```yaml
dependencies:
  flutter_stripe: ^10.0.0
  url_launcher: ^6.0.0
```

**Apple Pay + Google Pay default on** (AC-20): los templates no tienen TODOs — vienen activos. El dev puede desactivarlos comentando manualmente si quiere.

---

## Paso 6 — Instalar hook `stripe-safety-guard` (AC-26..AC-29)

### 6.1 Copiar hook al proyecto

```bash
cp .claude/skills/stripe-connect/templates/hooks/stripe-safety-guard.mjs \
   {PROJECT_ROOT}/.claude/hooks/stripe-safety-guard.mjs
```

### 6.2 Registrar en `.claude/settings.json` del proyecto

Añadir (merge no-destructivo) bajo `hooks.PreToolUse`:
```json
{
  "matcher": "Write|Edit",
  "hooks": [{
    "type": "command",
    "command": "node .claude/hooks/stripe-safety-guard.mjs"
  }]
}
```

El hook bloquea con exit 2:
1. `sk_live_*` en código (no en `.env*` ni `.md`)
2. Handler webhook sin `constructEvent`/`constructEventAsync`
3. Edge Function que procesa eventos sin consultar `stripe_processed_events`
4. Import de `redirectToCheckout` o `ui_mode: 'hosted'`
5. URL de Payment Link `https://buy.stripe.com/`

Escape hatch: `// stripe-safety-guard:ignore` en la línea previa al patrón.

---

## Paso 7 — Generar diseños Stitch si VEG presente (AC-22..AC-25)

Si `VEG_PRESENT=false` → skip con mensaje:
```
⚠ No se detectó VEG en el proyecto. Saltando generación de diseños Stitch.
  Ejecuta /visual-setup antes de /stripe-connect para diseños coherentes con tu brand.
```

Si `VEG_PRESENT=true`:

### 7.1 Leer arquetipo VEG activo

```bash
ARCHETYPE=$(grep "^archetype:" doc/veg/*.md | head -1 | awk '{print $2}')
# Ejemplo: Corporate | Startup | Creative | Consumer | Gen-Z | Gobierno
```

### 7.2 Invocar Stitch 6 veces

Prompts pre-armados en `templates/stitch-prompts/{screen}.txt`, adaptados por arquetipo:

1. `rider-onboarding` — pantalla piloto con CTA Account Link + warning autónomo
2. `rider-public-profile` — perfil piloto con 3 planes (10/15/20€)
3. `sponsor-modal` — **contenedor del Payment Element/Sheet embebido**, NO redirect a Stripe
4. `sponsorship-success` — confirmación inline
5. `fan-subscriptions` — gestión de suscripciones del fan
6. `rider-dashboard` — MRR, sponsors, Express Dashboard link

Para cada pantalla:
```
mcp__stitch__generate_screen_from_text(
  projectId: "{stitch_project_id}",
  prompt: "{prompt_adaptado_arquetipo}",
  deviceType: "DESKTOP",
  modelId: "GEMINI_3_PRO"
)
```

Guardar HTMLs en `doc/design/sponsorship/{screen}.html` y registrar prompts en `doc/design/sponsorship/stitch_prompts.md`.

**Regla obligatoria en prompts (AC-25)**: nunca pedir "botón que redirige a Stripe Checkout". Siempre: *"contenedor modal que aloja el Payment Element de Stripe embedded, con header precio/plan, form interno, footer Powered by Stripe"*.

### 7.3 Fallback si Stitch falla

```
⚠ Stitch no respondió a tiempo. Generando PENDING_DESIGNS.md con los 6 prompts.
   Puedes re-ejecutar manualmente con: mcp__stitch__generate_screen_from_text(...)
```

---

## Paso 8 — Escribir documentación parametrizada (AC-30..AC-33)

Copiar desde `templates/docs/` al proyecto:

- `infra/stripe/README.md` — checklist 4-6 pasos: envvars exactas (`STRIPE_SECRET_KEY`, `STRIPE_WEBHOOK_SECRET_PLATFORM`, `STRIPE_WEBHOOK_SECRET_CONNECT`, `STRIPE_PUBLISHABLE_KEY`, `DEFAULT_APPLICATION_FEE_PERCENT={fee_default}`), comando `stripe listen --forward-to`, activación Connect en dashboard
- `infra/stripe/connect-setup.md` — pasos específicos de Connect: branding Express onboarding, test sellers por país
- `infra/stripe/apple-google-pay-setup.md` — solo si STACK=flutter-*: Merchant ID Apple, domain verification, entitlements iOS, manifest Android
- `doc/design/billing/events-catalog.md` — 10 eventos críticos v1 con: trigger, endpoint plataforma vs Connect, acción backend, fila DB modificada
- `doc/design/billing/test-scenarios.md` — bloques `stripe trigger` + test clocks por UC

---

## Paso 9 — Cablear Stripe MCP oficial (AC-34..AC-36)

### 9.1 Leer `.claude/settings.local.json` del proyecto (o crearlo si no existe)

```bash
if [ ! -f .claude/settings.local.json ]; then
  echo '{"permissions":{"allow":[]},"mcpServers":{}}' > .claude/settings.local.json
fi
```

### 9.2 Merge no-destructivo del fragmento

Leer `settings.local.json`, mergear la clave `mcpServers.stripe` desde `templates/settings.local.json.fragment.json` **sin tocar el resto**:

```json
{
  "mcpServers": {
    "stripe": {
      "url": "https://mcp.stripe.com/v1",
      "transport": "http",
      "env": { "STRIPE_API_KEY": "${STRIPE_SECRET_KEY}" }
    }
  }
}
```

Usar `jq` para el merge (está disponible por defecto en macOS/Linux):
```bash
jq -s '.[0] * .[1]' .claude/settings.local.json templates/settings.local.json.fragment.json > .claude/settings.local.json.tmp \
  && mv .claude/settings.local.json.tmp .claude/settings.local.json
```

Aviso al usuario:
```
✓ Stripe MCP oficial cableado. En una nueva sesión de Claude Code, las tools
  mcp__stripe__* estarán disponibles. Ejemplo: "Crea en Stripe los Products
  Básico/Pro con Prices 10/15/20€ en modo test".
```

---

## Paso 9.5 — Inyectar secrets en Supabase Edge Functions (opcional, via specbox-supabase MCP)

**Objetivo**: eliminar la acción manual de copiar los 4 secrets al dashboard de
Supabase. Requiere que el MCP `specbox-supabase` esté registrado en el entorno
del usuario (ver `packages/specbox-supabase-mcp/README.md`).

### 9.5.1 Detectar disponibilidad del MCP

Intentar una llamada trivial a `mcp__specbox-supabase__list_edge_secrets_tool`
con un `supabase_access_token` y `project_ref` del `.claude/settings.local.json`
del proyecto. Si:

- La tool no existe en el entorno → **degradar a flujo manual** (Paso 11 listará
  los 4 secrets para copy-paste en el dashboard, como hoy).
- La tool existe pero retorna `error.code == "E_INVALID_TOKEN"` → pedir al
  usuario un PAT válido y reintentar. Link: <https://supabase.com/dashboard/account/tokens>.
- La tool existe y responde `success=true` → continuar a 9.5.2.

### 9.5.2 Invocar `set_edge_secret`

```python
mcp__specbox-supabase__set_edge_secret_tool({
  supabase_access_token: env.SUPABASE_ACCESS_TOKEN,
  project_ref: settings.supabase.project_ref,
  secrets: {
    STRIPE_SECRET_KEY:              env.STRIPE_SECRET_KEY,
    STRIPE_WEBHOOK_SECRET_PLATFORM: env.STRIPE_WEBHOOK_SECRET_PLATFORM,
    STRIPE_WEBHOOK_SECRET_CONNECT:  env.STRIPE_WEBHOOK_SECRET_CONNECT,
    DEFAULT_APPLICATION_FEE_PERCENT: "20"
  },
  project_hint: "{proyecto}"
})
```

Si `success=false`:
- `E_INVALID_INPUT` → revisar formato del PAT (`sbp_*`) y `project_ref` (20
  chars lowercase).
- `E_PROJECT_NOT_FOUND` → verificar que el `project_ref` pertenece al PAT del
  usuario.
- Cualquier otro → abortar e instruir al usuario a inyectar manualmente.

### 9.5.3 Confirmar con `list_edge_secrets`

```python
mcp__specbox-supabase__list_edge_secrets_tool({
  supabase_access_token: env.SUPABASE_ACCESS_TOKEN,
  project_ref: settings.supabase.project_ref,
  expected_names: ["STRIPE_SECRET_KEY", "STRIPE_WEBHOOK_SECRET_PLATFORM",
                   "STRIPE_WEBHOOK_SECRET_CONNECT", "DEFAULT_APPLICATION_FEE_PERCENT"]
})
```

Si `data.missing_names == []` → registrar en Engram y continuar al Paso 10.

Aviso al usuario:
```
✓ Secrets Supabase inyectados automáticamente vía specbox-supabase MCP:
  STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET_PLATFORM,
  STRIPE_WEBHOOK_SECRET_CONNECT, DEFAULT_APPLICATION_FEE_PERCENT
```

### 9.5.4 Fallback (MCP no disponible)

Mostrar el bloque manual de siempre y continuar sin abortar:
```
⚠ specbox-supabase MCP no detectado. Copia estos 4 secrets manualmente en:
  dashboard.supabase.com/project/{project_ref}/settings/functions

  STRIPE_SECRET_KEY                = <from .env>
  STRIPE_WEBHOOK_SECRET_PLATFORM   = <from stripe listen output>
  STRIPE_WEBHOOK_SECRET_CONNECT    = <from stripe listen output>
  DEFAULT_APPLICATION_FEE_PERCENT  = 20

  Para automatizarlo en ejecuciones futuras: ver
  packages/specbox-supabase-mcp/README.md
```

---

## Paso 10 — Generar Gherkin `.feature` de aceptación (AC-37..AC-40)

Copiar 12 `.feature` desde `templates/tests/` a `tests/acceptance/sponsorship/` del proyecto:

```
tests/acceptance/sponsorship/
├── UC-301.feature   # Onboarding seller Account Link
├── UC-302.feature   # Retorno onboarding
├── UC-303.feature   # Piloto incompleto oculto
├── UC-304.feature   # Fan elige plan
├── UC-305.feature   # Suscripción con Payment Element/Sheet + fee dinámico
├── UC-306.feature   # Webhook firma + idempotencia (usa stripe trigger --replay)
├── UC-307.feature   # Sync DB sponsorships
├── UC-308.feature   # Payment failed retry
├── UC-309.feature   # Fan cancela
├── UC-310.feature   # Rider dashboard
├── UC-311.feature   # Admin dashboard + export
└── UC-312.feature   # Apple/Google Pay / Express Checkout
```

Cada `.feature` en español, con mínimo 1 flujo feliz + 1 escenario negativo, y comandos `stripe trigger` listos para ejecutar (AC-38, AC-39).

---

## Paso 11 — Resumen final + siguiente paso

Al terminar todos los pasos:

```
✓ /stripe-connect completado.

Creado:
  - US-SPONSORSHIP + 12 UCs en {spec_backend}
  - {N} archivos backend Supabase
  - {N} archivos frontend {react|flutter}
  - {6|0} diseños Stitch en doc/design/sponsorship/
  - Hook stripe-safety-guard instalado
  - Stripe MCP oficial cableado
  - {12} tests Gherkin de aceptación

Siguientes pasos (en orden):

1. Activa Connect en dashboard.stripe.com/test/connect (1 click — irreducible).

2. Aplica migraciones:
   supabase db push

3. Arranca el relay de webhooks (otra terminal):
   stripe listen --forward-to http://localhost:54321/functions/v1/stripe-webhook

4. Ejecuta /plan UC-301 para empezar por el onboarding del seller.

{if specbox-supabase MCP disponible (ver Paso 9.5):
   Los 4 secrets ya fueron inyectados automáticamente en Supabase.
 else:
   5. Copia los 4 secrets (STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET_PLATFORM,
      STRIPE_WEBHOOK_SECRET_CONNECT, DEFAULT_APPLICATION_FEE_PERCENT) al
      dashboard de Supabase manualmente, como indica el Paso 9.5.4.}

Advertencia fiscal (España):
  Los sellers necesitan estar dados de alta como autónomos o disponer de
  sociedad para recibir Direct charges. Tu skill UC-301 ya incluye este
  warning en el flujo de onboarding.
```

---

## Paso 12 — Telemetría + Engram (opcional)

Registrar ejecución exitosa:
```bash
# Telemetría fire-and-forget (si el engine MCP está configurado)
node .claude/hooks/mcp-report.mjs stripe-connect-executed '{"stack":"{STACK}","veg":{VEG_PRESENT}}'
```

Si `mcp__plugin_engram_engram__mem_save` disponible, guardar observación:
```
mem_save(
  title="stripe-connect executed",
  type="config",
  content="**What**: /stripe-connect ejecutado sobre proyecto {project}. **Stack**: {STACK}. **Fee default**: {fee_default}%. **VEG**: {VEG_PRESENT}."
)
```

---

## Comportamiento en errores

| Situación | Acción |
|-----------|--------|
| Supabase no inicializado | Exit 0, mensaje al usuario, no escribir nada |
| Stack no detectado (ni React ni Flutter) | Exit 0, mensaje, no escribir nada |
| Spec backend offline | Fallback automático a FreeForm local, avisar al usuario |
| Stitch timeout | Generar PENDING_DESIGNS.md con prompts, continuar sin bloquear |
| `.claude/settings.local.json` inexistente | Crearlo mínimo y continuar |
| Migración SQL falla al aplicar | NO revertir archivos ya escritos, avisar al usuario con el error y sugerir `supabase db reset` manual |
| Usuario responde `n` en Paso 2 | Abortar sin escribir nada |
| Hook `stripe-safety-guard` ya presente | Detectar y avisar; no sobreescribir sin confirmación |

---

## Fuera de alcance v1 (explícito)

- Otros backends (Neon, Firestore, FastAPI) → v2
- SaaS vanilla sin Connect → `/stripe` hermana en v2
- Checkout hosted / Payment Links → nunca (embedded-only por diseño)
- Customer Portal de Stripe → no aplica con Direct charges
- Account types Standard o Custom → solo Express en v1
- Charge models Destination o Separate → solo Direct en v1
- Refunds, disputes, proration, multi-currency, Stripe Tax → se añaden UC por UC cuando aparezcan en proyecto real
- React Native → no está en SpecBox
- Connect embedded onboarding en Flutter → no existe limpio, Account Link redirect es la única ruta

## Advertencias legales/fiscales

La skill **no es asesoramiento legal**. El caso piloto asume España + sellers autónomos. Si operas en otra jurisdicción o con sellers sin alta fiscal:
- Consulta asesor antes de lanzar
- El UC-301 del proyecto consumidor debe mostrar warning explícito antes del Account Link

## Referencias

- PRD: `doc/prds/stripe_connect_skill_prd.md` (engine SpecBox)
- Plan técnico: `doc/plans/stripe_connect_skill_plan.md`
- Stripe Docs: [Connect](https://docs.stripe.com/connect) · [Direct charges](https://docs.stripe.com/connect/direct-charges) · [Subscriptions embedded](https://docs.stripe.com/billing/subscriptions/build-subscriptions) · [Webhooks](https://docs.stripe.com/webhooks) · [Testing](https://docs.stripe.com/testing) · [Test clocks](https://docs.stripe.com/billing/testing/test-clocks)
- Stripe MCP oficial: [mcp.stripe.com](https://mcp.stripe.com/v1)

Files in this skill

  • SKILL.md23.4 KB
  • templates/docs/apple-google-pay-setup.md3.3 KB
  • templates/docs/connect-setup.md3.3 KB
  • templates/docs/events-catalog.md6.7 KB
  • templates/docs/infra-stripe-README.md5.2 KB
  • templates/docs/test-scenarios.md6.5 KB
  • templates/flutter/api_interceptor.dart1.8 KB
  • templates/flutter/apple_pay_button.dart1.4 KB
  • templates/flutter/google_pay_button.dart984 B
  • templates/flutter/pubspec.fragment.yaml415 B
  • templates/flutter/rider_onboarding_launcher.dart3.6 KB
  • templates/flutter/sponsor_rider_controller.dart4.2 KB
  • templates/flutter/stripe_service.dart3.7 KB
  • templates/hooks/stripe-safety-guard.mjs10.3 KB
  • templates/react/package.json.fragment.json305 B
  • templates/react/rider-onboarding-button.tsx3.9 KB
  • templates/react/sponsor-rider-form.tsx3.7 KB
  • templates/react/stripe-provider.tsx2.9 KB
  • templates/react/use-sponsorship.ts3.3 KB
  • templates/settings.local.json.fragment.json480 B

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.