Webhooks
Send in-app subscription and purchase events to your server with webhooks
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. Webhook events are delivered within 20 to 120 seconds of the event occurring. Please consider using checkPermission method of Qonversion SDK to get real-time subscription status on the client-side.
1. Set up the webhook URL
- Navigate to the Integrations section in your Qonversion account and select Webhooks.
- Register your URL and Qonversion will send a request
- Press the "Add new integration" or "Save" button. If the endpoint server returns a 200 response code, the integration is activated.

2. Request format
Qonversion sends POST request to webhook URL every time an event occurs. The request header contains Authorization-Token Value as Basic authorization field. Use that to protect your server from unwanted requests.
Request Header:
Authorization: Basic {Header Authorization-Token}
Accept: application/json
Request Body:
{
"event_name": "trial_converted",
"user_id": "3YjIDEUDaf_5g4IdWw6zcMlLgfg_YQp2",
"custom_user_id": "",
"identity_id": "",
"advertiser_id": "9FD1767D-8B48-45BD-A2F4-1C08B08E56F2",
"time": 1600000000,
"created_at": 1600000000,
"product_id": "com.myapp.subs.9.99.trial",
"revenue": {
"value": 7.99,
"value_usd": 9.99,
"currency": "EUR",
"is_proceed": 0,
"proceeds_rate": 70
},
"price": {
"value": 7.99,
"value_usd": 9.99,
"currency": "EUR"
},
"transaction": {
"transaction_id": 500000601234560,
"original_transaction_id": 500000601234560,
"expires": 1600259200,
"grace_period_expires": null
},
"properties": {
"_q_email": "[email protected]"
},
"device_id": "0E66565D-4F3A-E366-B3D4-B5DDAC6BBE2E",
"app_version" => "2.1.4",
"sdk_version" => "3.1.0",
"environment": "production",
"platform": "iOS",
"ip": "10.0.0.1",
"old_product_id": "com.myapp.subs.4.99.trial",
"new_product_id": "com.myapp.subs.9.99.trial",
}
Column | Required | Description |
---|---|---|
event_name | yes | Event name provided in the integration config. See the details on the events tracked here |
user_id | yes | Unique user identifier assigned by Qonversion |
custom_user_id | yes | Unique user identifier that you can set with Qonversion SDK methods: User Identifiers |
identity_id | yes | Unique user ID for the authenticated users that you can set using identify method of the Qonversion SDK |
advertiser_id | yes | IDFA or AAID |
time | yes | The time an app store changed a subscription status or a time Qonversion detected the change in the UNIX epoch time format in seconds. Read more about events time here |
created_at | yes | The time Qonversion generated the event |
product_id | yes | App Store or Google Play Store product identifier |
revenue | yes | Dictionary with transaction revenue details. Only events with value filled |
price | yes | Dictionary containing the price details of the product |
transaction | yes | Dictionary with store transaction IDs and expiration timestamp |
properties | yes | User properties provided by SDK. Read more about user properties here |
device_id | yes | identifierForVendor or Settings Secure Android ID |
app_version | no | Application version |
sdk_version | no | Qonversion SDK version |
environment | yes | "production" or "sandbox" |
platform | yes | "iOS" or "Android" |
ip | yes | Application device IP address |
old_product_id | no | Previous product (for product change events) |
new_product_id | no | New product (for product change events) |
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
Column | Required | Description |
---|---|---|
value | yes | Value in user's currency |
value_usd | yes | Value in USD |
currency | yes | Three-letter ISO currency code |
is_proceed | yes | 1 – if value and value_usd are net excluding app stores' commission;0 - if values are before deducting app stores commission; |
proceeds_rate | yes | 70 or 85; Proceeds rate that developer receives after deducting app stores commission. |
Price
Column | Required | Description |
---|---|---|
value | yes | Value in user's currency |
value_usd | yes | Value in USD |
currency | yes | Three-letter ISO currency code |
Transaction
Column | Required | Description |
---|---|---|
transaction_id | yes | Transaction_id from App Store (e.g. 521456677817903) or Play Store (e.g. GPA.4563-9870-7648-87395) |
original_transaction_id | yes | Transaction_id from App Store (e.g. 521456677817903) or Play Store (e.g. GPA.4563-9870-7648-87395) |
expires | yes | Expire timestamp for purchase, prolong or product change events, event timestamp for refund or upgrade events. |
grace_period_expires | yes | Grace period expiration timestamp. This field returns the timestamp for the grace period expiration. |
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 Downgraded, Subscription Product Changed events, we're sending a newertransaction_id
.
Retries between Qonversion and Destination Server
Qonversion increases the delivery rate to your server with retries. Retries happen automatically if your server is not responding. This substantially improves the data delivery rate.
Qonversion retries failed destination calls for 24 hours with an increased delay after each attempt. Retries have the following schedule:
Attempt | Delay |
---|---|
1 | Immediately |
2 | 5 minutes |
3 | 4 hours |
4 | 8 hours |
5 | 24 hours |
Updated 4 months ago