RORK LABJP
TOOLING — Rork's developer repos keep moving: rork-xcode was updated on July 16, rork-device on July 15, and rork-plist on July 13OPUS46 — Claude Opus 4.6 is live in Rork, and Rork Max is built to assemble apps on top of Claude CodeSIM — A cloud iOS simulator runs in the browser, with one click to install on a device and two clicks to publish to the App StoreMAX — Rork Max emits pure Swift rather than React Native, reaching iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and even iMessageNATIVE — That opens up HealthKit, ARKit and LiDAR, NFC, Dynamic Island, Live Activities, 3D through Metal, and on-device inference with Core MLSEED — Rork raised a $15M seed led by Left Lane Capital, with Peak XV and a16z Speedrun joining the roundTOOLING — Rork's developer repos keep moving: rork-xcode was updated on July 16, rork-device on July 15, and rork-plist on July 13OPUS46 — Claude Opus 4.6 is live in Rork, and Rork Max is built to assemble apps on top of Claude CodeSIM — A cloud iOS simulator runs in the browser, with one click to install on a device and two clicks to publish to the App StoreMAX — Rork Max emits pure Swift rather than React Native, reaching iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and even iMessageNATIVE — That opens up HealthKit, ARKit and LiDAR, NFC, Dynamic Island, Live Activities, 3D through Metal, and on-device inference with Core MLSEED — Rork raised a $15M seed led by Left Lane Capital, with Peak XV and a16z Speedrun joining the round
Articles/Dev Tools
Dev Tools/2026-04-28Advanced

Why In-App Purchases Disappear with Family Sharing — Building Bulletproof IAP for Family Apps with Rork

Subscription revenue from Family Sharing purchases can vanish days after the sale settles. This guide shows the four refund triggers, a complete StoreKit 2 + Server Notifications V2 implementation in Rork, and a sandbox testing matrix that catches family edge cases before launch.

Family SharingAsk to BuyStoreKit 216IAP6Rork515Subscriptions15iOS109App Store79

Premium Article

A few weeks after I launched a kids' learning app with monthly subscriptions, I opened the App Store Connect revenue dashboard and noticed something off. Several monthly charges that had clearly settled the day before were quietly missing from the totals.

I assumed they were ordinary cancellations at first. But when I opened the RevenueCat dashboard, those entries were sitting in the Refunded state — and almost all of them were Family Sharing purchases.

The pattern was the same in each case. A child account triggered a purchase, the parent approved it through Ask to Buy, and then days later the parent contacted App Store support and said the charge was unfamiliar. Apple refunded the purchase at its discretion. My server had already granted the entitlement and the user had been consuming premium content in the meantime, so I only noticed when I ran the weekly aggregation report.

If you ship a subscription on iOS without understanding how Family Sharing and Ask to Buy interact with StoreKit, you will eventually hit this exact pattern. This guide walks through the four ways Family Sharing can erase revenue you thought was already in the bank, plus the implementation patterns I now ship by default in Rork-built apps to make those events safe and observable.

The reason this is worth taking seriously, even for indie developers with modest revenue, is that Family Sharing edge cases compound silently. Each individual refund or revoke is small. But when entitlement drift accumulates over months, you end up with a noticeable gap between "users I think are paying" and "users Apple says are paying." That gap distorts your retention metrics, your LTV calculations, and ultimately your decision-making about pricing and product direction. Catching the gap at design time costs a few extra hours. Catching it after eighteen months of data drift is much more painful.

"She bought it yesterday, but today it's gone" — when Family Sharing refunds happen

Family Sharing lets one parent and up to five family members share eligible in-app purchases. As a feature, it's friendly and well loved. As a developer, you have to internalize a few behaviors that don't apply to solo subscriptions.

When a child account makes a purchase, the parent's payment method is charged. The parent can later contact App Store support and request a refund for a transaction they consider unauthorized. While Family Sharing is active, every member of the family group is entitled to use the shared product, not just the buyer. And the moment any member leaves the family group, their entitlement is revoked instantly.

The implication is that "settled revenue" is not actually settled. A refund or a departure can flip a transaction days or even weeks later. If your server granted the entitlement on purchase and never reconciles afterward, your view of who's entitled to premium will drift away from Apple's view. As that drift compounds, you end up with users who are not paying customers anymore but still have premium access, while paying family members lose access at unpredictable moments.

The first time I hit this problem, my entire StoreKit test plan was a single Apple ID running through purchase flows in sandbox. Family Sharing can be reproduced in sandbox if you set it up correctly, but I had skipped that work because the receipts were coming back fine and I'd assumed receipts were proof enough. They are not.

The four triggers that erase Family Sharing IAP revenue

In production, the "disappearing revenue" scenarios I've run into fall into four buckets.

The first trigger is a parent-initiated refund after Ask to Buy. The child requests a purchase, the parent approves it, and a few days later the parent contacts App Store support saying the child purchased something they didn't intend to. Apple grants the refund at its discretion and the app receives a REFUND notification after the fact.

The second trigger is leaving the Family Sharing group. A family member leaves the family, and at that exact moment any shared subscription entitlement they had stops applying to them. The subscription itself keeps renewing for the buyer, so this is not an EXPIRED event — it surfaces as a REVOKE notification scoped to the leaving member.

The third trigger is Apple's automated refunds. After App Store policy changes or fraud-detection updates, Apple sometimes refunds purchases automatically without consulting the developer. Family-oriented apps seem to attract a higher rate of these auto-refunds, possibly because parents and minors are an over-represented refund population in Apple's dataset.

The fourth trigger is billing problems on the parent's payment method. If the parent's card expires or the bank declines, every member of the Family Sharing group connected to that subscription has their entitlement frozen at the same time. You receive DID_FAIL_TO_RENEW notifications, but to the end user it looks like "my access is gone because of someone else's card." That confusion shows up as one-star reviews unless you handle it gracefully.

If you try to handle these four triggers separately on the client, the logic fragments quickly. My personal rule of thumb is now: all Family Sharing state changes are reconciled server-side via Server Notifications V2. The StoreKit 2 client is treated as a UX layer that keeps the in-app experience fresh, and the server is the single source of truth for who's actually entitled.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
Identify the four ways Family Sharing silently strips revenue from your subscription numbers, and bake the defenses into your design before launch
Implement Family Sharing and Ask to Buy detection across StoreKit 2 on the client and App Store Server Notifications V2 on the server with production-ready code
Run the four sandbox scenarios that recreate 80% of real Family Sharing events, so you ship with the rough edges already smoothed
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

Related Articles

Dev Tools2026-05-27
Three-Layer StoreKit 2 Entitlement Sync for Rork Apps: Launch, Background Refresh, and Restore
When you wire StoreKit 2 subscriptions into a Rork-generated app, Transaction.updates alone leaves gaps. Here is the three-layer sync I run across six wallpaper apps — launch-time re-evaluation, Background App Refresh, and Restore Purchase — including measured refresh rates and the AdMob revenue I recovered.
Dev Tools2026-05-20
Rork × StoreKit 2 × App Store Server API — A Three-Layer Subscription Architecture for Indie Apps
How to combine StoreKit 2 and Apple's App Store Server API to protect subscription revenue in Rork iOS apps with three coordinated layers: client verification, server-side JWS validation, and notification reconciliation.
Business2026-06-14
Validating StoreKit 2 Subscriptions Server-Side: Granting Access Without Trusting the Device
To stop 'I paid but the feature won't unlock' and 'still usable after canceling,' you need a design that does not trust the device's verdict and settles entitlements on the server. Covers StoreKit 2 signed transactions, verification with the App Store Server API, and state sync via App Store Server Notifications V2, from real indie monetization.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →