Возврат средств по Family Sharing отменяет один платёж, но может оставить пятерых других людей, которые продолжают пользоваться вашим приложением, и только ваш сервер может отключить им доступ
Возврат средств по Family Sharing отменяет один платёж, но может оставить до пяти членов семьи на ваших платных функциях. Apple отправляет REVOKE и ожидает, что ваш сервер прекратит доступ. Вот как работают возвраты по семейному доступу и во что обходится один такой возврат.

Главное
- Apple помечает каждую транзакцию, разделённую с семьёй, значением inAppOwnershipType, равным FAMILY_SHARED, а каждую прямую покупку значением PURCHASED. Это поле появляется только у непотребляемых встроенных покупок и автоматически продлеваемых подписок, двух типов продуктов, которые поддерживает Family Sharing.
- Одна покупка, доступная для семейного доступа, может дать право до шести человек, покупателю плюс пяти членам семьи, так что один платёж может создать нагрузку на шесть человек в виде вычислений, вызовов API, хранилища и выплат, которые ваш продукт тратит на предоставление услуги.
- Когда Apple возвращает деньги человеку, купившему общую покупку, она отправляет App Store Server Notification REVOKE, и отзыв доступа, включая каждую разделённую с семьёй копию, это задача вашего сервера. Apple возвращает деньги, но не прекращает ваши права за вас.
- Транзакция FAMILY_SHARED в REVOKE несёт revocationDate только тогда, когда отзыв был вызван возвратом средств покупателю. Если член семьи просто выходит из группы, тот же REVOKE приходит без revocationDate, по словам собственных инженеров Apple.
- Apple намеренно задерживает новую общую покупку примерно на один час, прежде чем она достигнет членов семьи, чтобы у покупателя было время отключить общий доступ до того, как кто-либо ещё получит доступ.
- Включение Family Sharing для встроенной покупки в App Store Connect нельзя отменить, поэтому, как только продукт становится общим, он остаётся общим, и ваша обработка возвратов должна учитывать транзакции FAMILY_SHARED с этого момента.
- Потребляемые покупки никогда не разделяются с семьёй, поэтому член семьи никогда не вызывает CONSUMPTION_REQUEST и не появляется в вашей отчётности о потреблении. Возвраты по Family Sharing всегда касаются только непотребляемых покупок и автоматически продлеваемых подписок.
Одна покупка в группе Family Sharing может передать ваше приложение шести людям. Тот, кто заплатил, один из них. Остальные пятеро ни разу не открыли кошелёк, и Apple всё равно ожидает, что ваше приложение будет работать для всех них. Это сделка, на которую вы соглашаетесь в тот момент, когда включаете Family Sharing для встроенной покупки. Именно поэтому возврат по Family Sharing это иной зверь, чем обычный. Когда покупатель получает деньги обратно, продажа отменяется для одной учётной записи, но доступ, который вы предоставили до пяти другим людям, сам собой не выключается. Ваш сервер должен это сделать, и если он был написан так, чтобы следить только за покупателем, он этого не сделает.
Вот вся картина в одном месте. Здесь разбирается, как Apple помечает общую покупку, единственное поле, которое отличает покупателя от семьи, точно когда Apple отправляет вам REVOKE и как его читать, тихая деталь, которая отделяет возврат от того, кто просто вышел из семьи, и во что на самом деле обходится общий возврат, когда вы посчитаете вычисления, уже потраченные на людей, которые вам никогда не платили.
Что раздаёт Family Sharing и скольким людям
Включите Family Sharing для продукта, и вы измените, кто ваш платящий клиент. Семейная группа в Apple может включать до шести человек, одного организатора и до пяти участников. Когда кто-либо в группе покупает продукт, доступный для семейного доступа, все в группе получают к нему доступ. Они не платят. Они не появляются в вашей выручке. Они просто оказываются в вашем приложении с действительным правом, потому что Apple выдаёт каждому из них транзакцию, указывающую на одну и ту же покупку.
Только два типа продуктов доступны для общего доступа, и потребляемые не входят в их число
Family Sharing охватывает ровно два вида встроенных покупок: непотребляемые и автоматически продлеваемые подписки. Потребляемые, продукты вроде монет и кредитов, никогда не разделяются, поэтому член семьи никогда не вызывает CONSUMPTION_REQUEST и не появляется в вашей отчётности о потреблении. Если ваше приложение продаёт только потребляемые покупки, возвраты по Family Sharing не ваша проблема. Если вы продаёте пожизненную разблокировку или повторяющийся план, то это ваша проблема.
Поле, которое отличает покупателя от получателя
Каждая транзакция, которую выдаёт Apple, несёт inAppOwnershipType. У него два значения. PURCHASED означает, что эта учётная запись оплатила продукт и может им управлять, в том числе отменить его или запросить возврат. FAMILY_SHARED означает, что эта учётная запись принадлежит члену семьи, имеющему доступ благодаря чужой покупке. Оба дают человеку право пользоваться вашим продуктом. Заплатил только один из них. Это поле есть в транзакции StoreKit, в чеке и в App Store Server API, так что вы можете читать его везде, где уже проверяете права.
| inAppOwnershipType | Кто это | Может управлять или вернуть покупку | Заплатил ли вам |
|---|---|---|---|
| PURCHASED | Учётная запись, купившая продукт | Да | Да |
| FAMILY_SHARED | Член семьи с общим доступом | Нет | Нет |
Как возврат по Family Sharing доходит до вашего сервера
Возврат за общую покупку начинается так же, как любой возврат Apple. Покупатель, единственный, кто может, просит Apple вернуть деньги. Apple решает. Если Apple одобряет, покупка покупателя отменяется, и Apple отправляет вашему серверу App Store Server Notification REVOKE. И V1, и V2 уведомления несут его. REVOKE это ваш единственный сигнал о том, что право, стоящее за ним, и каждая разделённая с семьёй копия теперь недействительны.
Не отзывайте одну транзакцию, перечитайте всю историю
Указание Apple по поводу REVOKE прямолинейно: не относитесь к нему как к одному переключателю. Когда вы получаете такое уведомление, пройдите по всей истории транзакций клиента и восстановите его права с нуля, потому что человек может иметь более одной транзакции, дающей право на тот же или другой продукт. Отзовите только транзакцию, названную в уведомлении, и вы можете либо оставить члена семьи, которому вернули деньги, с активным доступом, либо отключить того, у кого ещё есть действительное второе право. Восстанавливайте полную картину каждый раз.

Одна деталь, которая отделяет возврат от распада семьи
Вот ловушка, которая стоит командам целого дня отладки. REVOKE может означать две совершенно разные вещи для транзакции FAMILY_SHARED, и способ их различить это поле, которое иногда попросту отсутствует. Когда покупатель получает возврат, транзакция FAMILY_SHARED приходит с revocationDate. Когда член семьи просто выходит из группы, такой же REVOKE приходит вообще без revocationDate. Инженеры Apple по коммерции прямо сказали об этом на форумах для разработчиков. В любом случае вы снимаете доступ, но только тот, что с датой, является возвратом, и только возврат также отменил платёж.
Во что на самом деле обходится вам общий возврат
Проследите за деньгами, потому что именно здесь Family Sharing незаметно меняет расчёт. Обычный возврат отменяет одну продажу. Apple возвращает цену покупателю и возвращает свою комиссию, так что со стороны магазина выходит почти в ноль. Что никогда не возвращается, это то, что вы уже потратили на предоставление продукта. С Family Sharing вы потратили это не один раз. Вы потратили это на целых шесть человек. Покупатель и до пяти членов семьи каждый нагрузил ваши вычисления, вызвал ваши API, заполнил ваше хранилище и вытянул любые выплаты, которые вы финансируете, всё это на основании одного платежа.
Теперь покупатель делает возврат. Один платёж отменяется. Доступ каждого члена семьи должен закончиться в тот же момент, потому что то, что оправдывало их обслуживание, одна оплаченная покупка, исчезло. Если ваш сервер отзывает только транзакцию PURCHASED и оставляет FAMILY_SHARED активными, до пяти человек продолжают пользоваться вашими платными функциями бесплатно, а вы продолжаете платить за их обслуживание, при этом в системе не остаётся ничего, что можно было бы выставить в счёт. Это не ошибка округления. Это пятикратная стоимость предоставления той продажи, которую вы только что вернули.
| Что вы отзываете при общем возврате | Кто теряет доступ | За что вы продолжаете платить |
|---|---|---|
| Всю историю транзакций | Покупатель и все члены семьи | Ни за что, доступ заканчивается для всех |
| Только транзакцию PURCHASED | Только покупатель | До пяти членов семьи, всё ещё на ваших вычислениях, API, хранилище и выплатах |
| Ничего, потому что вы пропустили REVOKE | Никто | Покупатель и до пяти участников, все бесплатно |
Подписки делают утечку повторяющейся
Для непотребляемой покупки неотозванный член семьи это разовая потеря, которая длится, пока вы не заметите. Для автоматически продлеваемой подписки всё хуже, потому что право уже было повторяющимся. Возврат по заказу подписки должен прекратить общий доступ для всей группы, но оставленный активным член семьи сохраняет платный уровень в каждом периоде оплаты, в котором вы не закрываете ему доступ. Исправление то же самое, восстанавливать права из полной истории при каждом REVOKE, но цена пропуска этого накапливается.
Как сделать правильно и проверить это до того, как это сделает настоящий возврат
Здесь нет ничего экзотического для создания. Вся задача в том, чтобы привязывать доступ к праву, а не к покупателю, и перестраивать этот доступ при каждом REVOKE.
- Храните доступ, привязанный к транзакции и её
inAppOwnershipType, а не к одной учётной записи покупателя, чтобы транзакцияFAMILY_SHAREDдавала доступ сама по себе и могла быть отозвана сама по себе. - При любом уведомлении REVOKE перечитывайте всю историю транзакций клиента и пересчитывайте права, а не выключайте одну названную транзакцию.
- Относитесь к транзакции
FAMILY_SHAREDсrevocationDateкак к возврату и прекращайте доступ этого члена семьи. Относитесь к транзакции безrevocationDateкак к уходу из семьи и тоже прекращайте его. - Не спешите вводить в строй только что совершённую общую покупку. Apple удерживает её около одного часа, чтобы покупатель мог отказаться, поэтому учитывайте транзакцию, которую Apple действительно выдаёт, а не предоставляйте доступ по нажатию на покупку.
- Отрепетируйте это. Инструмент Testing Family Sharing от Apple позволяет смоделировать общую транзакцию, а возврат в песочнице вызывает тот же REVOKE, который получит ваш продакшен-сервер.
Сделайте это, и возврат по Family Sharing станет незначительным событием. Покупатель получает свои деньги, вся группа теряет доступ в тот же миг, а вы перестаёте платить за обслуживание людей, которые вам никогда не платили.
Частые вопросы
- Что такое inAppOwnershipType и какие у него значения?
- inAppOwnershipType это поле, которое Apple помещает в каждую транзакцию встроенной покупки, с двумя значениями: PURCHASED для учётной записи, купившей продукт, и FAMILY_SHARED для члена семьи, имеющего доступ благодаря чужой покупке. Оно появляется только у непотребляемых покупок и автоматически продлеваемых подписок, типов продуктов, которые поддерживает Family Sharing.
- Отзывает ли Apple доступ членов семьи автоматически, когда покупатель получает возврат?
- Нет. Apple отменяет платёж покупателя и отправляет вашему серверу App Store Server Notification REVOKE, но отзыв права, включая каждую разделённую с семьёй копию, это задача вашего сервера. Если вы не отреагируете на REVOKE, члены семьи сохранят доступ после возврата.
- Как отличить возврат по Family Sharing от члена семьи, выходящего из группы?
- Проверьте наличие revocationDate у транзакции FAMILY_SHARED. Когда отзыв вызван возвратом средств покупателю, транзакция несёт revocationDate. Когда член семьи просто выходит из группы, REVOKE приходит без revocationDate. Оба случая прекращают право, но только тот, что с датой, отменил платёж.
- Сколько человек могут пользоваться одной покупкой с семейным доступом?
- До шести, организатор плюс до пяти членов семьи. Таким образом, один платёж может дать право на ваш продукт шести людям, поэтому общий возврат может оставить до пяти человек на ваших платных функциях, если вы отзовёте только транзакцию покупателя.
- Могу ли я отключить Family Sharing для встроенной покупки после его включения?
- Нет. Включение Family Sharing для встроенной покупки в App Store Connect нельзя отменить. Как только продукт становится общим, он остаётся общим, поэтому ваша обработка возвратов должна учитывать транзакции FAMILY_SHARED с этого момента.
- Разделяются ли потребляемые покупки с семьёй?
- Нет. Family Sharing охватывает только непотребляемые покупки и автоматически продлеваемые подписки. Потребляемые никогда не разделяются, поэтому член семьи никогда не вызывает CONSUMPTION_REQUEST и не появляется в вашей отчётности о потреблении.
Источники и дополнительное чтение
- Apple Developer: inAppOwnershipType (App Store Server API)
- Apple Developer Tech Talks: Explore Family Sharing for In-App Purchases
- Apple Developer: Supporting Family Sharing in your app
- Apple Developer: Testing Family Sharing
- App Store Connect Help: Turn on Family Sharing for in-app purchases
- Apple Developer Forums: family sharing REVOKE server-to-server notifications
- Apple Support: How Family Sharing works
RefundHalt
Автопилот возвратов для App Store и Google Play
Читайте дальше
Обработка возвратов ломается незаметно, поэтому протестируйте возвраты за встроенные покупки в sandbox раньше, чем это сделает реальный клиент
Ваша обработка возвратов запускается только после того, как клиент уже ушёл, поэтому ошибка в ней остаётся невидимой, пока не начнёт стоить реальных денег. Оба магазина позволяют сначала запустить возврат в тестовой среде. Вот как протестировать возвраты за встроенные покупки в App Store и Google Play до того, как возврат станет реальным.
Возврат средств обходится вашему приложению дороже, чем цена, которую вы возвращаете
Возвращённая цена, это самая маленькая строка в счёте. Возврат отменяет и комиссию магазина, поэтому вы теряете свою долю, а вычисления, вызовы API, хранилище и выплаты, которые вы уже потратили, не вернуть. Возвратный платёж в Google Play после 3 августа 2026 года добавляет сверху банковскую комиссию. Вот полный счёт.