Feature

Apple refund request handling for iOS apps: answer CONSUMPTION_REQUEST automatically

When a customer asks Apple for a refund, Apple sends your server a CONSUMPTION_REQUEST and gives you 12 hours to answer. RevenueDot's Refund Control answers for you. Ordered policies on customer conditions pick your refund preference, RevenueDot sends Apple the consumption data from its own records, and cards show refund rate, amounts and counts.

Free up to $10,000 a month in tracked revenue. Works with the RevenueCat SDK you already ship.

The RevenueDot Refund Control page. Cards show a 43% refund rate (3 of 7 decided requests refunded), $64.96 in refund requests and 4 requests. Four policy templates follow (first purchase date, platform, recent renewal, create your own), then ordered policies such as Renewed in the last day with Prefer full refund and Spent over $40 with Prefer no refund.
Policies are checked from the top. The first one a customer matches decides the answer.

Four policy templates

First purchase date, platform, recent renewal, or any condition the audience builder knows.

Apple's 12-hour deadline

Failed sends retry after 5 minutes, 15 minutes and then hourly, and stop 5 minutes before the deadline.

Consent first

Nothing goes to Apple until you confirm customers agreed to share consumption data.

Every store in the cards

Refund rate, amounts and counts include Google Play voids and chargebacks, Stripe refunds and Amazon refunds.

Steps

How to answer Apple refund requests automatically

Connect the App Store with the app's In-App Purchase key and turn on App Store Server Notifications version 2. RevenueDot sends the answer with the same key.

  1. 01

    Confirm consent

    Open Lifecycle, then Refund control, and tick that customers agreed to share consumption data with Apple. Apple requires the consent, and RevenueDot sends nothing until you confirm it.

  2. 02

    Add policies

    Start from First purchase date, Platform, Recent renewal or Create your own. Recent renewal covers customers who renewed or converted from a free trial in the last 24 hours.

  3. 03

    Choose a refund preference

    Pick Prefer full refund, Prefer no refund, Send consumption data only, or Do not respond for each policy and for the default policy.

  4. 04

    Order the policies

    Drag policies into order. The first policy whose conditions match the customer decides. Each card shows how many of your customers it would decide for.

  5. 05

    Save

    Select Save. The next CONSUMPTION_REQUEST is answered with these rules.

What does RevenueDot send to Apple?

For each request RevenueDot builds Apple's ConsumptionRequestV1 body from its own records and sends it with Send Consumption Information. A repeated notification for the same purchase is never answered twice.

FieldHow it is set
customerConsentedtrue, and only sent after you confirm consent
consumptionStatusSubscriptions: 3 when the period is over, 2 when the customer opened the app after buying, 1 when they never did
sampleContentProvidedtrue when the customer had a free trial of the product
accountTenureDays since the customer was first seen, in Apple's buckets
lifetimeDollarsPurchased, lifetimeDollarsRefundedThe customer's USD purchases and refunds, in Apple's buckets
playTime, userStatus0 and 1 unless your app sets the custom attributes rd_play_time_minutes or rd_user_status
refundPreferenceFrom the policy: 1 full refund, 2 no refund, 0 no preference

How do you read refund rate and requests with the API?

Apple tells you the result: REFUND when it refunds and REFUND_DECLINED when it does not. The cards show the last 28 days, and the table lists each request with the policy used and the outcome.

Refund Control APIcurl
# Refund rate, amounts and counts
curl -s "$REVENUEDOT_URL/v2/projects/$PROJECT_ID/refund_control/stats" \
  -H "Authorization: Bearer $SECRET_KEY"

# Each request, newest first, with the policy and the outcome
curl -s "$REVENUEDOT_URL/v2/projects/$PROJECT_ID/refund_requests" \
  -H "Authorization: Bearer $SECRET_KEY"

What about Google Play, Stripe and Amazon refunds?

Google Play has no consumption API. A refund or chargeback arrives as a voided purchase and there is nothing to answer. RevenueDot records it as an approved refund request, with the policy that would have applied, so the cards cover every store. Stripe and Amazon refunds are recorded the same way.

What are the limits of Refund Control?

  • Apple makes the refund decision. Your answer is information and a preference, not an instruction.
  • RevenueDot sends Send Consumption Information V1. Apple's newer V2, with a consumption percentage and prorated refunds, is not used yet.
  • Policies, previews and counts scan at most the 10,000 most recently seen customers.
  • App Store Save Outcomes in Charts is always zero until Apple's Retention Messaging API is in use.

FAQ

Refund Control: questions people ask

What is Apple's CONSUMPTION_REQUEST notification?

It is an App Store Server Notification sent when a customer asks Apple for a refund. Your server has 12 hours to answer with consumption information, such as how long the customer used the purchase and whether you prefer a refund. Apple uses the answer when it decides.

How do I respond to an Apple refund request automatically?

Turn on Refund Control in RevenueDot, confirm customer consent, and set policies. RevenueDot builds the consumption data from its records and sends it with your In-App Purchase key, with a refund preference picked by the first policy that matches the customer.

Does answering a refund request stop Apple from refunding?

No. Apple decides. Your answer gives Apple facts and a preference of full refund, no refund or none. REFUND and REFUND_DECLINED notifications then show the outcome in the cards.

Can I handle Google Play refunds the same way?

Google Play has no equivalent API, so there is nothing to answer. RevenueDot records Google voids and chargebacks as refund requests so your refund rate covers every store.

Do I need to tell customers I share data with Apple?

Yes. Apple requires customer consent to send consumption data. Make sure your terms or privacy policy say so. RevenueDot sends nothing until you tick the consent box in Refund control.

Get started

Run subscriptions without the revenue share.

Start free on RevenueDot Cloud, free up to $10,000 a month in tracked revenue, or move an existing RevenueCat app with one line of code.

Already have an account? Sign in · Prefer your own servers? Self-host free