---
title: "Post Signup Setup Intent"
method: POST
path: "/v2/signup/pending/{pending_id}/setup-intent"
---

# Post Signup Setup Intent

`POST /v2/signup/pending/{pending_id}/setup-intent`

Step 3 (mount): create a Stripe SetupIntent for the pending row and
return the `clientSecret` the frontend uses to mount Stripe's
PaymentElement. The `pending_user_id` is stamped into the SetupIntent's
metadata so the Phase 11 webhook can correlate Stripe events back to the
User.

Only pending rows can advance — active/abandoned/cancelled rows would
create orphan SetupIntents on retry. The Stripe SDK call is wrapped in
`asyncio.to_thread` (it's sync; we don't want to block the event loop).

## Path parameters

- `pending_id` string, required

## Response `200`

Successful Response

- CreateSetupIntentResponse
  - `clientSecret` string, required
  - `setupIntentId` string, required

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.net/loyalty/apis/loyaltydog.md) · [All operations](https://skmtc.net/loyalty/apis/loyaltydog/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/loyalty/loyaltydog/revisions/42b7b22af2b6/schema)
