Start with the payment path that already causes support pain. SendPromptly adds two signals to your existing webhook handler. You do not need to proxy your payment provider, replace your webhook stack, or adopt a generic event platform.
Prerequisites
- Active SendPromptly account — start a 14-day trial
- An existing Stripe or Shopify webhook handler in your app
- A dedicated repair endpoint you control (used only for reprocess callbacks)
Step 1 — Create a project
In app.sendpromptly.com, create a project. Generate an API key and store the plaintext sk_... value server-side only. The dashboard shows it once.
Configure your repair callback URL. This is the endpoint SendPromptly will POST to when you trigger a reprocess from the incident console.
Step 2 — Choose one event to instrument first
Start with one event type:
Stripe:
checkout.session.completed— for access unlock failuresinvoice.paid— for credit grants or other paid-but-not-applied effects
Shopify:
orders/paid— for access or fulfillment effects after Shopify purchase
Do not try to instrument every event at once. One flow first, then expand.
Step 3 — Signal acceptance
After your webhook handler verifies the signature and durably accepts the work (for example, enqueues a job), signal SendPromptly:
| |
Stripe example:
| |
Shopify example:
| |
Send this signal before your job queue runs the business effect — not after. A successful call returns 202 Accepted with event_id, timeout_at, and accepted: true.
Supported effect_type values: access_unlock, credit_grant, seat_update, subscription_state_apply, access_revocation, credit_deduction.
Step 4 — Signal the outcome
After your app attempts the business effect, report the outcome. For success:
| |
For failure:
| |
If no outcome arrives within the configured timeout (default 30 minutes), SendPromptly opens an incident automatically. You can override the timeout per event using "timeout_minutes" in the receipt payload — useful for time-sensitive revocation flows.
Send the outcome to:
| |
Step 5 — Implement your repair endpoint
SendPromptly POSTs a signed callback to your repair endpoint when you trigger a reprocess from the incident console. Verify the signature before processing.
Signature headers:
| |
The signature is HMAC-SHA256 over timestamp + "." + nonce + "." + raw_body using your project’s signing secret. Reject callbacks with a timestamp older than 5 minutes. Your repair endpoint must be idempotent — it will receive the same replay_id on retries.
Callback payload:
| |
After running your repair logic, report the outcome with the replay_id included:
| |
Step 6 — Test the integration
- Send a test event via your payment provider’s test dashboard
- Confirm your app sends the acceptance signal — check the SendPromptly console
- Force a failure outcome to trigger an incident
- Confirm the email alert arrives
- Click Reprocess from the incident console
- Confirm your repair endpoint receives the signed callback
- Send a success outcome
- Confirm the incident resolves
Use the Integration Test screen in the console for pre-filled curl commands scoped to your project.
Language examples
Node.js:
| |
PHP (Laravel):
| |
Python:
| |
What not to instrument first
- Every event type at once — instrument one, validate it, then expand
- Every adjacent billing edge case — the highest-risk paths are
invoice.paid,checkout.session.completed, andorders/paid - Generic webhook logging — that is not what SendPromptly does
Related
- How the recovery workflow works — full workflow walkthrough
- What SendPromptly catches — failure types and fit guide
- Pricing — Starter at $29/month, 14-day trial