StoreKit cancellation feedback

Cancellation feedback for native StoreKit subscriptions

Use StoreKit 2 renewal state directly—without RevenueCat—to identify active subscriptions that will not renew and route trial and paid users to the right conversation.

What this workflow actually does

Apps that manage subscriptions with StoreKit should not need to adopt a separate purchase platform just to ask why a customer cancelled. Paydirt’s native integration loads configured subscription products, checks verified subscription status and renewal information, and reacts when an active subscription is set not to auto-renew.

The app supplies known product identifiers. Paydirt enriches the feedback event with StoreKit product, localized display price, currency, billing period, expiration, transaction context, and whether the introductory offer represents a free trial.

Detection and feedback stay deliberately separate from purchasing. Paydirt never changes renewal state, presents Apple’s manage-subscription sheet, or assumes a cancelled customer should receive an offer.

A strong fit for

  • StoreKit 2 subscription apps with known product IDs
  • Apps that do not use RevenueCat
  • Trial-versus-paid cancellation routing
  • Product teams that need renewal context beside raw feedback

Not designed to replace

  • Server-only detection for users who never reopen the app
  • Changing or managing App Store subscriptions
  • Apps that cannot enumerate their subscription products
  • Legacy purchase logic that cannot expose StoreKit 2 status

From trigger to exact answers

  1. 01

    Register product IDs

    The integration receives the subscription product identifiers already used by the app.

  2. 02

    Verify StoreKit state

    It checks verified transactions and renewal info for a future expiration with `willAutoRenew == false`.

  3. 03

    Classify the period

    A verified introductory free-trial offer routes to the trial form; other active periods route to paid cancellation.

  4. 04

    Refresh on foreground

    The integration checks immediately and when the app returns to the foreground, then deduplicates presentation.

Native StoreKit is built into the core SDK

No purchase adapter package is required. Pass the actual product IDs and the separate form IDs returned by setup.

Paydirt.configure(apiKey: "PUBLIC_PAYDIRT_SDK_KEY", theme: .automatic)

Paydirt.enableStoreKitIntegration(
    productIds: ["pro.monthly", "pro.yearly"],
    cancellationFormId: "PAID_CANCELLATION_FORM_ID",
    trialCancellationFormId: "TRIAL_CANCELLATION_FORM_ID"
)

What reaches Slack

  • StoreKit provider and product identifier
  • Localized display price, currency, and billing period when loaded
  • Trial or normal period classification
  • Expiration and transaction context
  • The complete exact Q/A conversation after completion

Know the limits

  • The app must open or foreground after renewal state changes; this is not a server webhook
  • StoreKit verification can fail or return incomplete product information, which should not block manual feedback
  • Family sharing, grace periods, billing retry, and revoked transactions need their StoreKit meanings preserved
  • Paydirt does not intercept or replace Apple’s subscription-management experience

Questions developers ask

Does native StoreKit support require RevenueCat?

No. StoreKit 2 cancellation detection is included in the Paydirt core and accepts the app’s product IDs directly.

How does Paydirt recognize a cancellation?

It looks for a verified active subscription that expires in the future and whose verified renewal information reports that it will not auto-renew.

Will the form appear at the moment a user taps Cancel in Apple settings?

Not necessarily. Apple owns that UI. The in-app integration detects the changed renewal state when StoreKit refreshes, typically after the user returns to the app.

Ship the smallest useful feedback loop

Install one form at a real product moment, send the completed raw conversation to one Slack channel, and verify it in the app before expanding.

Start setup