Skip to main content
Qonversion validates user receipts with app stores and sends subscription events to your HTTP endpoints. Keep in mind events delivery time when using webhooks to manage subscriber statuses on your back-end. Most events reach your endpoint within seconds, usually within a minute. The exact latency depends on store-side notification timing, your server’s response time, and any retries. For real-time subscription status on the client-side, use the checkEntitlements method of the Qonversion SDK.

1. Set up the webhook URL

  1. Navigate to the Integrations section in your Qonversion account and select Webhooks. Enter an Integration Name, choose the platform, and click Continue.
  2. Register your URL and Qonversion will send a request
  3. Settings save automatically as you enter them. If the endpoint server returns a 200 response code, the integration is activated.

Sandbox webhook URL

The Webhooks integration form also exposes a separate Sandbox Webhook URL field. Production-environment events are delivered to the main URL; sandbox-environment events (environment: "sandbox") are delivered to the Sandbox URL when it is set. If you receive sandbox events but leave the Sandbox URL empty, Qonversion does not deliver them, and they are not retried.

2. Request format

Qonversion sends POST request to webhook URL every time an event occurs. The request includes an Authorization header of the form Basic <token>, where <token> is the Header Authorization-Token Value you configured in the Webhooks integration settings - it is sent as-is, not base64-encoded as in standard HTTP Basic auth. Use it to protect your server from unwanted requests.

SSL certificate

Remember, maintaining secure connections is essential for the integrity and reliability of your application’s communication.Ensure the SSL certificate used is not expired and your server’s CA bundle is up-to-date to recognize the latest root CAs.
Request Header:
Request Body:
billing_plan_type and commitment are present only for Apple 12-month-commitment subscriptions, available on iOS 26.4 and later. Such a subscription’s period stays yearly while it is billed in twelve monthly installments, so revenue and price on this event hold the monthly installment, not the yearly amount. The monthly amounts alone give no hint that the subscription is yearly — billing_plan_type and commitment are the only way to tell an installment apart from an ordinary monthly subscription. Commitment plans billed other than in monthly installments are not currently reported.

Revenue and price fields

There are 3 fields that contain transaction details:
  • The revenue field contains a dictionary with details depending on your integration setting Send sales as proceed.
  • The price field always contains a gross price that is charged to a user.
  • The transaction field contains params of the transaction related to the event.

Revenue

Price

Transaction

For the Billing Issue, Trial Canceled, Subscription Canceled, Subscription Upgraded events, the transaction_id field will be the same as for the previous related event. For the Subscription Renewed, Subscription Product Changed events, we’re sending a newer transaction_id.

Apple Ads attribution fields

Your app must first collect Apple Ads attribution with the Qonversion SDK by calling collectAppleSearchAdsAttribution() — see Collect Apple Ads attribution; an Apple Ads account connection is not needed for this. Events of attributed users then carry the asa_attribution object, which reflects the most recent Apple response that attributed the user (a later attribution=false answer does not remove it). Keys whose value is empty or missing are left out rather than sent as null. The data in the table below can be found in the asa_attribution field.
Every key inside asa_attribution is optional: a key is left out whenever Apple’s value is empty or missing, so check for presence before reading it. Learn more about fields from Apple AdServices documentation.

Retries between Qonversion and Destination Server

Qonversion increases the delivery rate to your server with retries. Retries happen automatically when your server times out, is unreachable, or returns a non-2xx status — except 401, 403 and 404, which are treated as permanent and are not retried. This substantially improves the data delivery rate. After the initial attempt fails, Qonversion schedules up to five retries spread over roughly 24 hours; if the last one fails too, the event is not delivered. You can review delivery attempts from the last 7 days in the Delivery Log tab of the Webhooks integration. Retries have the following schedule (delay measured from the previous attempt): Because a retry re-sends the event that already failed, your endpoint can receive the same event more than once — for example when your server processed a request but the response never reached us. Every attempt carries the same id, and so does a delivery you trigger yourself with the Resend action in the dashboard Delivery Log. Treat id as the idempotency key: record the ones this endpoint has already handled and ignore a repeat, scoping that record per integration, because a second Webhooks integration on the same app receives its own copy of the event under the same id.
Tenjin Refund Keeper