
> For the complete machine-readable documentation index, see [llms.txt](https://apidocs.chargebee.com/llms.txt).

## Processing Omnichannel Webhooks

When selling subscriptions across platforms such as the Apple App Store, Google Play Store, or the web, it's essential to track subscription changes in your backend. This ensures accurate provisioning of content and timely communication with end users.

Billing platforms use webhook notifications or events to communicate subscription state changes to external systems. However, each platform manages subscription states and events differently, adding complexity to handling these events.

Chargebee's Omnichannel events simplify this process by providing a unified event representation. This allows you to integrate as though you are working with a single billing system while Chargebee handles platform-specific complexities for you.

Events from various billing platforms are consumed by Chargebee through the webhook notification URL configured in each respective platform.

**Note:**

-   To learn how to configure the Chargebee webhook notification URL for the Apple App Store, click [here](https://www.chargebee.com/docs/2.0/omnichannel-app-store.html#create-an-omnichannel-subscription-for-in-app-purchases_set-up-notification-url-in-app-store-connect-for-subscription-state-sync-with-chargebee).
-   To learn how to configure Google Play notifications / app ID setup, see [Connect Google Play to Chargebee](https://www.chargebee.com/docs/billing/2.0/mobile-subscriptions/omnichannel-play-store#connect-google-app-to-chargebee-to-generate-unique-app-id-and-notifications-url).

**Identifier tip (`id_at_source`):**

-   Parent `omnichannel_subscription` / `omnichannel_one_time_order`: Apple **Transaction ID**; Google **purchase token** (token can change; Chargebee updates to the latest).
-   Nested / standalone `omnichannel_transaction`: Apple **Transaction ID**; Google **Order ID** (`GPA.…`).

#### Chargebee event for recording a purchase

When a purchase is recorded in Chargebee using the [Record a Purchase](/docs/api/recorded_purchases#record_a_purchase) API, Chargebee initiates a background job to process that purchase. Upon successful completion of this job, Chargebee returns one of the following events (subscription or one-time order):

Chargebee Event

Description

[`omnichannel_subscription_created`](/docs/api/events/webhook/omnichannel_subscription_created) / [`omnichannel_subscription_imported`](/docs/api/events/webhook/omnichannel_subscription_imported)

`omnichannel_subscription_created` is triggered when an omnichannel subscription is successfully created in Chargebee. If there are any transactions (purchases or renewals) recorded after the initial transaction, Chargebee emits `omnichannel_subscription_imported` instead of `omnichannel_subscription_created`. In that scenario, the `imported` omnichannel subscription resource includes only two transactions: the `initial_purchase_transaction` and the most recent transaction.

**Note:**

-   To get the details of the item for which the subscription was purchased, refer to the [`omnichannel_subscription`](/docs/api/omnichannel_subscriptions) resource.
-   To get the details of the transaction that happened at the source, refer to the [`omnichannel_transaction`](/docs/api/omnichannel_transactions) resource.
-   Chargebee may also emit [`omnichannel_transaction_created`](/docs/api/events/webhook/omnichannel_transaction_created) when the associated transaction row is recorded.

[`omnichannel_one_time_order_created`](/docs/api/events/webhook/omnichannel_one_time_order_created)

Triggered when an omnichannel one-time order is successfully created from [Record a Purchase](/docs/api/recorded_purchases#record_a_purchase). The event content includes the `omnichannel_one_time_order` and associated `omnichannel_transaction`. Check `recorded_purchase.linked_omnichannel_one_time_orders` when polling the job.

Chargebee may also emit [`omnichannel_transaction_created`](/docs/api/events/webhook/omnichannel_transaction_created) for the purchase transaction.

[`record_purchase_failed`](/docs/api/events/webhook/record_purchase_failed)

Triggered when recording a purchase fails to create an omnichannel subscription **or** one-time order in Chargebee. The [`status`](/docs/api/recorded_purchases#recorded_purchase_status) of the recorded purchase changes to `failed`, and the error details are available in the [`error_detail`](/docs/api/recorded_purchases#recorded_purchase_error_detail) field.

#### Mapping of Apple App Store notifications to Chargebee events

The table below outlines various scenarios in which the Apple App Store triggers notifications or events. It details the types and sub-types of these notifications and the corresponding omnichannel subscription events triggered by Chargebee.

**Important**

-   Here is the link to [Apple's v2 notifications](https://developer.apple.com/documentation/appstoreservernotifications/app_store_server_notifications_v2).
-   Apple has deprecated [v1](https://developer.apple.com/documentation/appstoreservernotifications/notification_type#3694879) notification types, and these are not supported by the omnichannel solution.
-   Chargebee will process a transaction's events only if they are [recorded](/docs/api/recorded_purchases#record_a_purchase) with Chargebee. Otherwise, incoming events will be marked as `ignored`, even if we support those event types.
-   Notification types and sub-types not listed in the table are currently ignored by Chargebee. Support for these will be included in future releases.

Notification Type

Subtype

Chargebee's Response

`DID_RENEW`

**Scenario:** When a subscription item successfully auto-renews.

**Description:** The `current_term_start` and `current_term_end` attributes of the [`omnichannel_subscription_item`](/docs/api/omnichannel_subscriptions#omnichannel_subscription_omnichannel_subscription_items) resource in the event content indicates the new term after the renewal.

**Subscription item status:** `active`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_renewed`](/docs/api/events/webhook/omnichannel_subscription_item_renewed)

`DOWNGRADE`

**Scenario:** When a subscription item successfully auto-renews with a different product ID.

**Description:** The `item_id_at_source` attribute of the [`omnichannel_subscription_item`](/docs/api/omnichannel_subscriptions#omnichannel_subscription_omnichannel_subscription_items) resource in the event content specifies the ID of the item at the source that the customer downgraded to. The `current_term_start` and `current_term_end` attributes indicate the new term after the renewal.

**Subscription item status:** `active`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_downgraded`](/docs/api/events/webhook/omnichannel_subscription_item_downgraded) [`omnichannel_subscription_item_renewed`](/docs/api/events/webhook/omnichannel_subscription_item_renewed)

`BILLING_RECOVERY`

**Scenario:** When the subscription that is in the `in_dunning` or `in_grace_period` state has been successfully renewed.

**Description:** A subscription that is in the `in_dunning` or `in_grace_period` state has been successfully renewed during the billing retry period. The omnichannel subscription status is changed from `in_dunning` or `in_grace_period` to `active`. As a result, the subscriber should regain access to the content.

**Subscription item status:** `active`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_renewed`](/docs/api/events/webhook/omnichannel_subscription_item_renewed) [`omnichannel_subscription_item_recovered`](/docs/api/events/webhook/omnichannel_subscription_item_recovered)

`SUBSCRIBED`

`RESUBSCRIBE`

**Scenario:** When a customer resubscribes to any subscription item from the same subscription group as their expired subscription.

**Description:** The `current_term_start` and `current_term_end` attributes of the [`omnichannel_subscription_item`](/docs/api/omnichannel_subscriptions#omnichannel_subscription_omnichannel_subscription_items) resource in the event content indicates the new term of the resubscribed item. The `item_id_at_source` attribute specifies the ID of the item at the source that the customer subscribed to.

**Subscription item status:** `active`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_resubscribed`](/docs/api/events/webhook/omnichannel_subscription_item_resubscribed)

`DID_CHANGE_RENEWAL_PREF`

`UPGRADE`

**Scenario:** When a customer upgrades to a subscription item that has [a higher level](https://developer.apple.com/app-store/subscriptions/#ranking) than the currently subscribed item from the same subscription group.

**Description:** The `item_id_at_source` attribute of the [`omnichannel_subscription_item`](/docs/api/omnichannel_subscriptions#omnichannel_subscription_omnichannel_subscription_items) resource in the event content specifies the ID of the item at the source that the customer upgraded to. The `current_term_start` and `current_term_end` attributes indicate the new term after the upgrade.

**Subscription item status:** `active`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_upgraded`](/docs/api/events/webhook/omnichannel_subscription_item_upgraded)

`DOWNGRADE`

**Scenario:** When a customer downgrades to a subscription item that has [a lower level](https://developer.apple.com/app-store/subscriptions/#ranking) than the currently subscribed item from the same subscription group.

**Description:** The subscription is scheduled for change with `change_type` as "downgrade" at the `scheduled_at` of [`omnichannel_subscription_item_scheduled_change`](/docs/api/omnichannel_subscription_item_scheduled_change) and the `item_id_at_source` in scheduled\_state specifies the item ID at source the customer will downgrade to.

The `has_scheduled_changes` attributes in the [`omnichannel_subscription_items`](/docs/api/omnichannel_subscription_items) is set to true.

**Subscription item status:** `active`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_change_scheduled`](/docs/api/events/webhook/omnichannel_subscription_item_change_scheduled)

**Scenario:** When a customer reverts to the previous subscription, effectively canceling their downgrade.

**Description:** The subscription scheduled for change is removed. The ID of the [`omnichannel_subscription_item_scheduled_change`](/docs/api/omnichannel_subscription_item_scheduled_change) identifies the change that has been removed.

**Subscription item status:** `active`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_scheduled_change_removed`](/docs/api/events/webhook/omnichannel_subscription_item_scheduled_change_removed)

`DID_FAIL_TO_RENEW`

`GRACE_PERIOD`

**Scenario:** When a subscription item fails to renew due to a billing issue, the subscription enters into a grace period.

**Description:** An item's subscription has failed to renew due to a billing issue, and the subscription is in the grace period. The grace period is decided based on the [configuration in the App Store](https://developer.apple.com/help/app-store-connect/manage-subscriptions/enable-billing-grace-period-for-auto-renewable-subscriptions) for a maximum of 28 days. Continue to provide service through the grace period while billing is retried.

**Subscription item status:** `in_grace_period`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_grace_period_started`](/docs/api/events/webhook/omnichannel_subscription_item_grace_period_started)

**Scenario:** When a subscription item fails to renew due to a billing issue, the subscription enters a billing retry period.

**Description:** An item's subscription has failed to renew due to a billing issue, and the subscription is in a dunning period. The App Store continues to retry billing for 60 days, or until the customer resolves their billing issue or cancels their subscription, whichever comes first. You can stop providing the subscription service upon receiving this notification.

**Subscription item status:** `in_dunning`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_dunning_started`](/docs/api/events/webhook/omnichannel_subscription_item_dunning_started)

`GRACE_PERIOD_EXPIRED`

**Scenario:** When the grace period of the subscription item expires, and the subscription continues in billing retry.

**Description:** The grace period of an item's subscription is over and billing retry is still attempted. Upon receiving this notification, the omnichannel subscription state is changed from `in_grace_period` to `in_dunning`. You can stop providing the subscription service upon receiving this notification.

The App Store continues to retry billing for the remaining days after the grace period, up to a maximum of 60 days, or until the customer resolves their billing issue or cancels their subscription, whichever comes first.

**Subscription item status:** `in_dunning`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_grace_period_expired`](/docs/api/events/webhook/omnichannel_subscription_item_grace_period_expired) [`omnichannel_subscription_item_dunning_started`](/docs/api/events/webhook/omnichannel_subscription_item_dunning_started)

`EXPIRED`

`VOLUNTARY`

**Scenario:** When the subscription of an item expires because the customer chooses to cancel it.

**Description:** The `cancelled_at` and `cancellation_reason` attributes of the [`omnichannel_subscription_item`](/docs/api/omnichannel_subscriptions#omnichannel_subscription_omnichannel_subscription_items) resource in the event content indicates when the subscription for an item was cancelled and the reason for the cancellation, respectively. In this case, the cancellation reason is `customer_cancelled`.

**Subscription item status:** `cancelled`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_cancelled`](/docs/api/events/webhook/omnichannel_subscription_item_cancelled)

`PRICE_INCREASE`

**Scenario:** When the subscription for an item expires if the customer does not consent to a price increase for the subscribed item that requires their approval.

**Description:** The `cancelled_at` and `cancellation_reason` attributes of the [`omnichannel_subscription_item`](/docs/api/omnichannel_subscriptions#omnichannel_subscription_omnichannel_subscription_items) resource in the event content indicates when the subscription for an item was cancelled and the reason for the cancellation, respectively. In this case, the cancellation reason is `customer_did_not_consent_to_price_increase`.

**Subscription item status:** `cancelled`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_cancelled`](/docs/api/events/webhook/omnichannel_subscription_item_cancelled)

`PRODUCT_NOT_FOR_SALE`

**Scenario:** When the subscription for an item expires if the developer removes the associated subscription item from sale, causing the renewal to fail.

**Description:** The `expired_at` and `expiration_reason` attributes of the [`omnichannel_subscription_item`](/docs/api/omnichannel_subscriptions#omnichannel_subscription_omnichannel_subscription_items) resource in the event content indicates when the subscription for an item has expired and the reason for its expiration, respectively. In this case, the expiration reason is `product_not_available`.

**Subscription item status:** `expired`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_expired`](/docs/api/events/webhook/omnichannel_subscription_item_expired)

`BILLING_RETRY`

**Scenario:** When the subscription for an item expires if the billing retry period ends without successfully recovering the subscription.

**Description:** The `expired_at` and `expiration_reason` attributes of the [`omnichannel_subscription_item`](/docs/api/omnichannel_subscriptions#omnichannel_subscription_omnichannel_subscription_items) resource in the event content indicates when the subscription for an item has expired and the reason for its expiration, respectively. In this case, the expiration reason is `billing_error`.

**Subscription item status:** `expired`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_expired`](/docs/api/events/webhook/omnichannel_subscription_item_expired)

**Scenario:** When a subscription to an item expires without any specific reason.

**Description:** The `expired_at` and `expiration_reason` attributes of the [`omnichannel_subscription_item`](/docs/api/omnichannel_subscriptions#omnichannel_subscription_omnichannel_subscription_items) resource in the event content indicates when the subscription for an item has expired and the reason for its expiration, respectively. In this case, the expiration reason is `other`.

**Subscription item status:** `expired`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_expired`](/docs/api/events/webhook/omnichannel_subscription_item_expired)

`DID_CHANGE_RENEWAL_STATUS`

`AUTO_RENEW_DISABLED`

**Scenario:** When a customer cancels a subscription item (disables auto-renew).

**Description:** The subscription item is scheduled to cancel at `current_term_end` and does not auto-renew. Chargebee emits [`omnichannel_subscription_item_cancellation_scheduled`](/docs/api/events/webhook/omnichannel_subscription_item_cancellation_scheduled) for this notification subtype.

**Subscription item status:** `active`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_cancellation_scheduled`](/docs/api/events/webhook/omnichannel_subscription_item_cancellation_scheduled)

`AUTO_RENEW_ENABLED`

**Scenario:** When a customer resubscribes (re-enables auto-renew) after canceling a subscription item.

**Description:** The scheduled cancellation is removed for the subscription item and it auto-renews at `current_term_end`.

**Subscription item status:** `active`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_scheduled_cancellation_removed`](/docs/api/events/webhook/omnichannel_subscription_item_scheduled_cancellation_removed)

`REFUND`

**Scenario:** When a subscription item is refunded.

**Description:** The [`cancelled_at`](/docs/api/omnichannel_subscription_items#omnichannel_subscription_item_cancelled_at) and [`cancellation_reason`](/docs/api/omnichannel_subscription_items#omnichannel_subscription_item_cancellation_reason) attributes of the `omnichannel_subscription_item` resource in the event content indicate when the subscription item was revoked and the reason for the revocation. Typical `cancellation_reason` values are `refunded_due_to_app_issue` or `refunded_for_other_reason` (and related revoke contexts may use `merchant_revoked`).

For one-time product refunds, Chargebee may emit [`omnichannel_one_time_order_item_cancelled`](/docs/api/events/webhook/omnichannel_one_time_order_item_cancelled) instead of (or in addition to) subscription item cancel events, depending on the recorded purchase type.

**Subscription item status:** `cancelled`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_cancelled`](/docs/api/events/webhook/omnichannel_subscription_item_cancelled)

`REFUND_REVERSED`

**Scenario:** When a refund for a subscription item is reversed.

**Description:** The refund for the subscription item is reversed. The subscription item becomes `active`, and the [`auto_renew_status`](/docs/api/omnichannel_subscription_items#omnichannel_subscription_item_auto_renew_status) is set to `on`.

**Subscription item status:** `active`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_reactivated`](/docs/api/events/webhook/omnichannel_subscription_item_reactivated)

#### Mapping of Google Play Store notifications to Chargebee events

The table below outlines various scenarios in which the Google Play Store triggers notifications or events. It details the types of these notifications and the corresponding omnichannel subscription events triggered by Chargebee.

**Important**

-   Here is the link to [Google's Real Time Developer Notifications](https://developer.android.com/google/play/billing/rtdn-reference#sub).
-   Chargebee will process the events associated with a subscription purchase only if they are [recorded](/docs/api/recorded_purchases#record_a_purchase) with Chargebee. Otherwise, incoming events will be marked as ignored, even if we support those event types.
-   Chargebee currently ignores notification types not listed in the following table. Support for these will be included in future releases.
-   While changing the subscription, Google provides multiple [replacement modes](https://developer.android.com/google/play/billing/subscriptions#replacement-modes). Currently, Chargebee only handles `CHARGE_PRORATED_PRICE` and `DEFERRED` modes.

Notification Type

Chargebee's Response

`SUBSCRIPTION_RENEWED`

**Scenario:** When a subscription item successfully auto-renews.

**Description:** The `current_term_start` and `current_term_end` attributes of the `omnichannel_subscription_item` resource in the event content indicates the new term after the renewal.

**Subscription item status:** `active`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_renewed`](/docs/api/events/webhook/omnichannel_subscription_item_renewed)

**Scenario:** When a paused subscription item successfully auto-renews.

**Description:** The `current_term_start` and `current_term_end` attributes of the `omnichannel_subscription_item` resource in the event content indicate the new term after the renewal.

**Subscription item status:** `active`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_resumed`](/docs/api/events/webhook/omnichannel_subscription_item_resumed)

**Scenario:** When a subscription item successfully auto-renews with a different product ID

**Description:** The `id_at_source` attribute of the `omnichannel_subscription` resource will be changed to specify the latest purchase token associated with the subscription change. The `item_id_at_source` attribute of the `omnichannel_subscription_item` resource in the event content specifies the ID of the item at the source that the customer upgraded/downgraded to. The `current_term_start` and `current_term_end` attributes indicate the new term after the renewal.

**Subscription item status:** `active`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_changed`](/docs/api/events/webhook/omnichannel_subscription_item_changed) [`omnichannel_subscription_item_renewed`](/docs/api/events/webhook/omnichannel_subscription_item_renewed)

`SUBSCRIPTION_RECOVERED`

**Scenario:** When a subscription item resumes from a paused state.

**Description:** The `omnichannel_subscription_item` resource `status` changes from `paused` to `active` and its billing term is updated.

**Subscription item status:** `active`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_resumed`](/docs/api/events/webhook/omnichannel_subscription_item_resumed)

**Scenario:** When a subscription item recovers from an account hold, and the `omnichannel_subscription_item` resource `status` is `in_dunning`.

**Subscription item status:** Since the subscription item has renewed successfully, the `omnichannel_subscription_item` resource `status` changes to `active`, and its billing term is updated.

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_renewed`](/docs/api/events/webhook/omnichannel_subscription_item_renewed) [`omnichannel_subscription_item_recovered`](/docs/api/events/webhook/omnichannel_subscription_item_recovered)

`SUBSCRIPTION_PURCHASED`

**Scenario:** When a customer changes the subscription from the currently subscribed item to a different item with the `CHARGE_PRORATED_PRICE` replacement mode.

**Description:** When the replacement mode is `CHARGE_PRORATED_PRICE`, the subscription change is applied immediately. The `id_at_source` attribute of the `omnichannel_subscription` resource will be changed to specify the latest purchase token associated with the subscription change. The `current_term_start` and `current_term_end` attributes of the `omnichannel_subscription_item` resource in the event content indicate the new term of the new item. The `item_id_at_source` attribute specifies the ID of the item at the source that the customer subscribed to.

**Subscription item status:** `active`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_changed`](/docs/api/events/webhook/omnichannel_subscription_item_changed)

**Scenario:** When a customer changes the subscription from the currently subscribed item to a different item with the `DEFERRED` replacement mode.

**Description:** When the replacement mode is `DEFERRED`, the subscription change is scheduled to be applied at the end of the current term. The `has_scheduled_changes` attribute of the `omnichannel_subscription_item` resource in the event content indicates the scheduled changes. The [`omnichannel_subscription_item_scheduled_change`](/docs/api/omnichannel_subscription_item_scheduled_changes) resource contains the details of the change (`scheduled_at`, `change_type`, and `scheduled_state.item_id_at_source`). Confirm whether `change_type` is always `downgrade` for every deferred product change or only for true downgrades.

**Subscription item status:** `active`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_change_scheduled`](/docs/api/events/webhook/omnichannel_subscription_item_change_scheduled)

`SUBSCRIPTION_CANCELED`

**Scenario:** When a customer cancels a subscription item.

**Description:** The subscription item is scheduled to cancel at `current_term_end` and does not auto-renew. The [`auto_renew_status`](/docs/api/omnichannel_subscription_items#omnichannel_subscription_item_auto_renew_status) attribute is set to `off`, indicating the subscription item will not renew at term end. Chargebee emits [`omnichannel_subscription_item_cancellation_scheduled`](/docs/api/events/webhook/omnichannel_subscription_item_cancellation_scheduled) for this Google notification.

**Subscription item status:** The `status` of the subscription item is `active` till the end of the term, only after which it gets `cancelled`.

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_cancellation_scheduled`](/docs/api/events/webhook/omnichannel_subscription_item_cancellation_scheduled)

`SUBSCRIPTION_EXPIRED`

**Scenario:** When the subscription of an item expires because the customer chooses to cancel it.

**Description:** The `cancelled_at` and `cancellation_reason` attributes of the `omnichannel_subscription_item` resource in the event content indicates when the subscription for an item was cancelled and the reason for the cancellation, respectively. In this case, the cancellation reason is `customer_cancelled`.

**Subscription item status:** `cancelled`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_cancelled`](/docs/api/events/webhook/omnichannel_subscription_item_cancelled)

**Scenario:** When the subscription of an item expires because the developer has revoked the access.

**Description:** The cancelled\_at and `cancellation_reason` attributes of the `omnichannel_subscription_item` resource in the event content indicates when the subscription for an item was cancelled and the reason for the cancellation, respectively. In this case, the cancellation reason is `merchant_revoked`.

**Subscription item status:** `cancelled`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_cancelled`](/docs/api/events/webhook/omnichannel_subscription_item_cancelled)

`SUBSCRIPTION_PAUSED`

**Scenario:** When the customer pauses the subscription to an item.

**Description:** The `resumes_at` attribute indicates when the subscription will resume.

**Subscription item status:** `paused`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_paused`](/docs/api/events/webhook/omnichannel_subscription_item_paused)

`SUBSCRIPTION_IN_GRACE_PERIOD`

**Scenario:** When a subscription item fails to renew due to a billing issue, the subscription enters into a grace period.

**Description:** The grace period is defined based on your [Play Store configuration](https://support.google.com/googleplay/android-developer/answer/12154973?hl=en). During this time, billing retries continue, and service should remain active.

The `grace_period_expires_at` attribute indicates when the grace period ends.

**Subscription item status:** `in_grace_period`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_grace_period_started`](/docs/api/events/webhook/omnichannel_subscription_item_grace_period_started)

`SUBSCRIPTION_ON_HOLD`

**Scenario:** When a subscription item is placed on hold.

**Description:** The subscription has entered an account hold period due to unresolved payment issues.

**Subscription item status:** `in_dunning`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_dunning_started`](/docs/api/events/webhook/omnichannel_subscription_item_dunning_started)

**Scenario:** When a subscription item is placed on hold, and the subscription item status is `in_grace_period`.

**Description:** If the payment issue isn't resolved after the grace period ends, the subscription enters an account hold period.

**Subscription item status:** `in_dunning`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_dunning_started`](/docs/api/events/webhook/omnichannel_subscription_item_dunning_started) [`omnichannel_subscription_item_grace_period_expired`](/docs/api/events/webhook/omnichannel_subscription_item_grace_period_expired)

`SUBSCRIPTION_REVOKED`

**Scenario:** When a subscription item is revoked.

**Description:** A subscription can be revoked for multiple reasons, including your backend revoking the subscription by using the [Google Play Billing](https://developers.google.com/android-publisher/api-ref/rest/v3/purchases.subscriptionsv2/revoke) API or the purchase being charged back. The [`cancellation_reason`](/docs/api/omnichannel_subscription_items#omnichannel_subscription_item_cancellation_reason) is typically `merchant_revoked`.

**Subscription item status:** `cancelled`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_cancelled`](/docs/api/events/webhook/omnichannel_subscription_item_cancelled)

`SUBSCRIPTION_RESTARTED`

**Scenario:** When a subscription that was previously canceled but had not yet reached its expiration date is restored by your customer.

**Description:** The cancellation is revoked, allowing the subscription to continue uninterrupted. It will automatically renew at the end of the current billing term.

**Subscription item status:** `active`

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_scheduled_cancellation_removed`](/docs/api/events/webhook/omnichannel_subscription_item_scheduled_cancellation_removed)

`SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED`

**Scenario:** When a customer schedules a pause (or changes a scheduled pause) for a subscription item, rather than pausing immediately.

**Description:** Chargebee records a scheduled pause. The `omnichannel_subscription_item` may show `has_scheduled_changes` = `true`, and the [`omnichannel_subscription_item_scheduled_change`](/docs/api/omnichannel_subscription_item_scheduled_changes) resource may use `change_type` = `pause` (confirm mapping for your site). Immediate pauses are represented by `SUBSCRIPTION_PAUSED` instead.

**Subscription item status:** Remains the current in-term status (typically `active`) until the pause takes effect.

**Chargebee webhooks triggered:** [`omnichannel_subscription_item_pause_scheduled`](/docs/api/events/webhook/omnichannel_subscription_item_pause_scheduled)