You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- Stripe ads webhook lifecycle sync shipped at `POST /api/stripe/webhooks`
70
+
- Stripe ads webhook lifecycle sync shipped at `POST /api/stripe/webhooks/platform`
61
71
- Sponsored rendering shipped for sidebar and in-grid results cards
62
72
- Legal updates shipped for advertising subscriptions/moderation in terms + policy pages
63
73
-[x] DONE — Members community surfaces shipped:
@@ -101,7 +111,7 @@
101
111
- Member privacy decision: public member read paths only select safe fields (`id`, `username`, `name`, `bio`, `image`, verification flags, timestamps); email is never exposed.
102
112
- Migration prerequisite: local/dev must run latest Drizzle migrations before app runtime (`bun run migrate`) so lifecycle columns like `template.status` exist.
103
113
- Current gap snapshot:
104
-
-Checkout/purchase routes + Stripe webhook purchase creation are still pending.
114
+
-Purchase checkout + connect-webhook completion are shipped; `GET /api/purchases` and `GET /api/purchases/[templateSlug]` are still pending.
105
115
- Review routes are still pending.
106
116
- Dedicated `/api/members` and `/api/members/[username]` endpoints are still pending (public pages currently read server-side directly).
107
117
- Automated tests for lifecycle/read/blob/payment flows are still pending.
@@ -388,19 +398,27 @@ No shareable pre-signed blob download URL is returned to client.
388
398
### 6.2 Purchase Flow
389
399
390
400
```
391
-
1. Buyer clicks "Buy" on template page
392
-
2. Determine sale_type:
393
-
- If URL has ?ref={sellerUsername} → sale_type = "direct"
401
+
1. Buyer clicks purchase CTA on template detail page.
402
+
2. Client calls POST /api/purchases/checkout with body { templateSlug, ref? }.
@@ -749,8 +788,8 @@ For MVP, admin features are **API-only** (no admin UI). Admins use API calls or
749
788
|`customer.subscription.deleted`| End campaign and stop visibility. |
750
789
|`invoice.payment_failed`| Record failure state for observability; do not hide ad immediately. |
751
790
752
-
All webhooks are verified via `stripe.webhooks.constructEvent()` with signing secret.
753
-
Webhook event IDs are persisted for idempotency in `stripe_webhook_event`.
791
+
Webhook signatures are verified via `stripe.webhooks.constructEvent()` with `STRIPE_PLATFORM_WEBHOOK_SECRET`.
792
+
Platform webhook event IDs are persisted for idempotency in `stripe_webhook_event`.
754
793
755
794
---
756
795
@@ -771,6 +810,7 @@ Webhook event IDs are persisted for idempotency in `stripe_webhook_event`.
771
810
13.**Versioning:** each version is immutable and unique per template; new version must increment by exactly `+1` (integer versioning).
772
811
14.**Download tracking:**`download_count` increments only after private blob fetch begins successfully.
773
812
15.**Soft delete:** deletion sets lifecycle status to `deleted`; data is retained.
813
+
16.**Paid command gate:** on template detail pages, paid-template command copy is allowed only for owner/admin/completed-purchase users; ineligible users see sign-in or purchase CTA.
Claws.supply is a marketplace for OpenClaw templates. Builders can discover production-ready agent setups faster, sellers can publish and monetize their templates, and buyers can purchase and deploy proven configurations. Template creation is CLI-first through the `claws-supply` package.
0 commit comments