When it fires
Section titled “When it fires”A charge against a subscription’s payment method has been approved by the gateway. Today this fires for manually-retried transactions that succeed; once Topiic emits gateway-driven recurring charges, this same event type will cover those too.
Pair this with payment.failed — every charge attempt fires exactly one of the two.
Headers
Section titled “Headers”Same envelope as other events: Topiic-Event-Id, Topiic-Idempotency-Key, Topiic-Signature. See Verifying signatures.
{ "id": "8c1f4a37-…", "type": "payment.succeeded", "createdAt": "2026-07-01T03:00:12.802Z", "data": { "transactionId": "4d8c2a14-7b3d-4e9c-8d6f-1a2b3c4d5e6f", "originalTransactionId": "1f9e8d7c-6b5a-4e3d-2c1b-0a9f8e7d6c5b", "subscriptionId": "3c4d5e6f-7a8b-9c0d-1e2f-3a4b5c6d7e8f", "memberId": "1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d", "amount": 49.50, "currency": "AUD", "status": "Approved", "declineCode": null, "occurredAt": "2026-07-01T03:00:12.000Z" }}data fields
Section titled “data fields”| Field | Type | Notes |
|---|---|---|
transactionId | UUID | The Topiic Transaction id for this charge attempt. Unique per attempt. |
originalTransactionId | UUID | null | The original transaction this is a retry of, if any. Null for first attempts. |
subscriptionId | UUID | null | The Subscription the charge belongs to. Null for one-off charges. |
memberId | UUID | The Topiic Member id. |
amount | decimal | Charge amount (positive). |
currency | string | ISO-4217 code (usually "AUD"). |
status | string | Always "Approved". |
declineCode | string | null | Always null for successful charges. |
occurredAt | ISO-8601 UTC | When the gateway confirmed the charge. |
What to do on receipt
Section titled “What to do on receipt”- Verify the signature, dedupe on
event.id. - Find the customer on your side via
memberId. - Update your billing history / receipt log — record
transactionId,amount,occurredAt. - Optionally trigger a “payment received” email or push notification.
- If the customer was previously in dunning (a prior
payment.failed), reinstate full access. - Return 2xx within 10 seconds.