משתמש לא מבחין בחיוב שנכשל — יום לאחר מכן הוא ננעל מחוץ לחשבון, ושימור הלקוחות יורד ב-30% בכשל הראשון. תקופת חסד נותנת 3–16 ימים לתיקון ללא אובדן גישה. אנו מיישמים מנגנון תקופת חסד במפתח מלא: מהפעלה בקונסולות ועד אימות בצד השרת, כך שהאפליקציה שלך עומדת בהנחיות App Store ו-Google Play.
כיצד תקופת החסד משפיעה על ההכנסות?
ללא תקופת חסד, כל חיוב שנכשל מאבד מנוי. גם אם הם חוזרים, החוויה השלילית מפחיתה את ה-LTV. לפי דוח RevenueCat, תקופת חסד נכונה מעלה את השימור ב-18% בממוצע, שב-9.99$ לחודש מתורגם ל-1.80$ הכנסה נוספת למשתמש בחודש. במקרה בוחן עם בסיס של 10,000 מנויים, הוספת תקופת חסד הניבה 80,000$ נוספים בשנה — שיפור של פי 2.3 בשימור לעומת נעילה מיידית. זו השפעה ישירה על השורה התחתונה ללא שינוי במחיר.
מהי תקופת חסד וכיצד להפעיל אותה?
תקופת חסד היא השלב לאחר חיוב שנכשל שבו המנוי נשאר פעיל, ו-Apple או Google ממשיכות לנסות. המשתמש רואה תוכן אך מקבל אזהרה עדינה. היא מופעלת בקונסולות הפיתוח.
iOS: הגדרה ב-App Store Connect
עבור אל App Store Connect → מנויים → בחר קבוצה → תקופת חסד. אפשרויות: 3, 6 או 16 ימים. לאחר ההפעלה, Apple שולחת אוטומטית את הסטטוס inGracePeriod ב-StoreKit. טפל בזה בצד הלקוח:
import StoreKit
func checkSubscriptionStatus(productId: String) async -> SubscriptionAccessLevel {
guard let product = try? await Product.products(for: [productId]).first,
let statuses = try? await product.subscription?.status else {
return .notSubscribed
}
for status in statuses {
switch status.state {
case .subscribed:
return .active
case .inGracePeriod:
// Списание не прошло, но grace period активен
// Показываем мягкое предупреждение, не блокируем контент
return .gracePeriod
case .inBillingRetryPeriod:
// Grace period истёк, Apple продолжает попытки списания (до 60 дней)
// Контент НЕ доступен
return .billingRetry
case .expired, .revoked:
return .notSubscribed
default:
continue
}
}
return .notSubscribed
}
enum SubscriptionAccessLevel {
case active, gracePeriod, billingRetry, notSubscribed
}הודעות App Store Server Notifications V2 משכפלות את אירוע import StoreKit func checkSubscriptionStatus(productId: String) async -> SubscriptionAccessLevel { guard let product = try? await Product.products(for: [productId]).first, let statuses = try? await product.subscription?.status else { return .notSubscribed } for status in statuses { switch status.state { case .subscribed: return .active case .inGracePeriod: // Списание не прошло, но grace period активен // Показываем мягкое предупреждение, не блокируем контент return .gracePeriod case .inBillingRetryPeriod: // Grace period истёк, Apple продолжает попытки списания (до 60 дней) // Контент НЕ доступен return .billingRetry case .expired, .revoked: return .notSubscribed default: continue } } return .notSubscribed } enum SubscriptionAccessLevel { case active, gracePeriod, billingRetry, notSubscribed } עם סיבה DID_FAIL_TO_RENEW. השרת צריך לטפל בשני הערוצים לאמינות.
Android: הגדרה ב-Google Play Console
ב-Google Play Console, בחר מוצר → מנויים → תקופת חסד. משך הזמן תלוי במחיר ובאזור: בדרך כלל 1–7 ימים. Google שולחת הודעת RTDN IN_GRACE_PERIOD:
fun handleSubscriptionNotification(notification: SubscriptionNotification) {
when (notification.notificationType) {
SubscriptionNotification.SUBSCRIPTION_IN_GRACE_PERIOD -> {
showGracePeriodWarning()
}
SubscriptionNotification.SUBSCRIPTION_EXPIRED -> {
revokeAccess()
}
}
}השרת מקבל את ההודעה דרך Pub/Sub ומעדכן את הסטטוס במסד הנתונים. הלקוח יכול לבדוק דרך SUBSCRIPTION_IN_GRACE_PERIOD ו-fun handleSubscriptionNotification(notification: SubscriptionNotification) { when (notification.notificationType) { SubscriptionNotification.SUBSCRIPTION_IN_GRACE_PERIOD -> { showGracePeriodWarning() } SubscriptionNotification.SUBSCRIPTION_EXPIRED -> { revokeAccess() } } } , אך לא מומלץ להסתמך רק על הלקוח.
מה להציג למשתמשים במהלך תקופת החסד
עיקרון מפתח: אל תחסום תוכן, אך ספק אזהרה עדינה. חומת תשלום אגרסיבית במהלך תקופת חסד היא חוויית משתמש גרועה ומפרה את סעיף 4.2 בהנחיות App Store.
// SwiftUI-баннер
if subscriptionStatus == .gracePeriod {
GracePeriodWarningBanner(
message: "Не удалось списать оплату. Обновите данные карты, чтобы сохранить доступ.",
actionTitle: "Управление подпиской",
action: {
openManageSubscriptions()
}
)
}
func openManageSubscriptions() {
Task {
try? await AppStore.showManageSubscriptions(in: windowScene)
}
}ב-Android — באנר דומה עם כפתור להפניה ל-Google Play לשינוי אמצעי התשלום.
השוואת תקופות חסד: iOS לעומת Android
| פרמטר | iOS (StoreKit 2) | Android (Google Play Billing) |
|---|---|---|
| משך זמן | 3, 6 או 16 ימים (ניתן להגדרה) | 1–7 ימים (תלוי במחיר ובאזור) |
| סטטוס לקוח | Purchase.purchaseState |
isAutoRenewing |
| סטטוס לאחר פקיעת תוקף | // SwiftUI-баннер if subscriptionStatus == .gracePeriod { GracePeriodWarningBanner( message: "Не удалось списать оплату. Обновите данные карты, чтобы сохранить доступ.", actionTitle: "Управление подпиской", action: { openManageSubscriptions() } ) } func openManageSubscriptions() { Task { try? await AppStore.showManageSubscriptions(in: windowScene) } } (עד 60 יום) |
inGracePeriod (מיידית) |
| בדיקת לקוח | SUBSCRIPTION_IN_GRACE_PERIOD |
inBillingRetryPeriod + SUBSCRIPTION_EXPIRED |
| הודעות שרת | App Store Server Notifications V2 | Real-Time Developer Notifications (RTDN) |
אימות בצד השרת: למה זה חשוב
בדיקות בצד הלקוח דרך StoreKit נוחות לממשק המשתמש, אך לא צריכות להיות מקור האמת היחיד. משתמש עשוי לפתוח את האפליקציה ימים לאחר מכן — מטמון ה-StoreKit אולי לא עודכן. השרת מקבל הודעות אמינות ומאחסן את הסטטוס בפועל.
תהליך עבודה עם App Store Server Notifications V2
- Apple שולחת בקשת POST לנקודת הקצה שלך עם סוג
Product.SubscriptionInfo.StatusוסיבהPurchase.purchaseState. - השרת מאמת את החתימה ומעדכן את השדה
isAutoRenewingבמסד הנתונים ל-DID_FAIL_TO_RENEW. - לקוח הנייד מבקש
IN_GRACE_PERIODבעת ההפעלה ומקבל את הסטטוס הנוכחי. - אם תקופת החסד פגה, Apple שולחת
subscription_status, השרת משנה את הסטטוס ל-grace_periodוחוסם גישה בבקשה הבאה.
אותו דבר עבור Android עם Real-Time Developer Notifications: /me/subscription ו-GRACE_PERIOD_EXPIRED.
טעויות יישום אופייניות
- חסימת תוכן מיידית לאחר חיוב שנכשל (התעלמות מתקופת חסד).
- אי בדיקת סטטוס
expired— תוכן פתוח או סגור בצורה שגויה. - חוסר אימות בצד השרת — משתמשים עשויים לקבל גישה ללא מנוי.
- חומת תשלום אגרסיבית מדי במהלך תקופת חסד (הפרת הנחיות).
תוצרים ותהליך הפרויקט
אנו מבטיחים פתרון במפתח מלא עם ניסיון אינטגרציה מוסמך. הנה מה שכלול:
- ביקורת על הלוגיקה הנוכחית של מנויים והגדרות קונסולת הפיתוח.
- הפעלת תקופת חסד ב-App Store Connect וב-Google Play Console.
- טיפול בסטטוס בצד הלקוח (Swift/Kotlin) עם באנרים בממשק המשתמש.
- אינטגרציה של הודעות שרת (App Store Server Notifications V2 / RTDN).
- תיעוד של תהליך העבודה המיושם.
- גישה ללוח המעקב שלנו.
- הדרכת צוות על ניהול מחזור חיי מנויים.
- 30 ימי תמיכה לאחר ההשקה.
ציר זמן לפרויקט (לחץ להרחבה)
- צד לקוח עם לוגיקת ממשק משתמש: **2–3 ימים**. - מחזור מלא עם טיפול בהודעות שרת: **4–5 ימים**. - בדיקות עומס ומעקב: **יום אחד**.העלות מחושבת באופן אישי. צור קשר להערכת פרויקט. קבל ייעוץ ממהנדס עם 10+ שנות ניסיון במנויים לנייד — מובטח שיפור שימור של 18% או החזר כספי.







