This page describes how to use push notifications with the Reseller API.
Overview
The Reseller API uses the Pub/Sub API to deliver push notifications about Google Workspace subscription events . For example, you can set up push notifications to be notified when customer subscription statuses change.
Prerequisites
- Enable the Pub/Sub API for your Google Cloud project.
- Grant Pub/Sub IAM roles to your service account on your
Cloud project. Granting the
roles/pubsub.editorrole is recommended, but you can use more specific Pub/Sub permissions .
Create a topic
To create a topic, register with the Reseller API using the resellernotify.register
method. This method takes a service account email address as a parameter.
Only service accounts authorized by this method can subscribe to your topic.
POST https://reseller.googleapis.com/apps/reseller/v1/resellernotify/register
{
"serviceAccountEmailAddress": "reseller@reseller-project.iam.gserviceaccount.com"
}
A successful response returns an HTTP 200
status code and a JSON response
containing your Pub/Sub topic name.
Example response:
{
"topicName"
:
"projects/partner-watch/topics/C0abcdefg"
}
To authorize more service accounts, call resellernotify.register
again.
Revoke access for a service account
The Reseller API can unregister service accounts using the resellernotify.unregister
endpoint:
POST https://reseller.googleapis.com/apps/reseller/v1/resellernotify/unregister
{
"serviceAccountEmailAddress": "reseller@reseller-project.iam.gserviceaccount.com"
}
Subscribe to a topic
After creating the Pub/Sub topic, set up how your application consumes change events. Choose one of the following:
- Push subscription: You supply an HTTP
POSTcallback. Pub/Sub uses this callback to notify your application about new events. - Pull subscription: Your application periodically makes an HTTP call to get queued changes.
Example request to subscribe to a topic:
PUT https://pubsub.googleapis.com/v1/projects/ PROJECT
/subscriptions/ SUBSCRIPTION_NAME
{
"topic": " TOPIC_NAME
"
// Only needed for push configurations
"pushConfig": {
"pushEndpoint": " PUSH_NOTIFICATION_ENDPOINT
"
},
}
Replace the following:
-
PROJECT: Your Google Cloud project. -
SUBSCRIPTION_NAME: An identifying name for your subscription. -
TOPIC_NAME: The Pub/Sub topic you previously created. -
PUSH_NOTIFICATION_ENDPOINT: Your push notification handler endpoint.
A successful response returns an HTTP 200
status code. Example response:
{
"name"
:
"projects/ PROJECT
/subscriptions/ SUBSCRIPTION_NAME
"
,
"topic"
:
" TOPIC_NAME
"
,
"pushConfig"
:
{
"pushEndpoint"
:
" PUSH_NOTIFICATION_ENDPOINT
"
},
"ackDeadlineSeconds"
:
10
}
Notification formats
The following is an example Pub/Sub notification. The message data is a base64-encoded JSON string.
{
"message"
:
{
"attributes"
:
{},
"data"
:
"eyJza3VfaWQiOiAiR29vZ2xlLUFwcHMtVW5saW1pdGVkIiwgImV2ZW50X3R5cGUiOiAiU1VCU0NSSVBUSU9OX0NBTkNFTExFRCIsICJjdXN0b21lcl9kb21haW5fbmFtZSI6ICJkb21haW4uY29tIiwgInN1YnNjcmlwdGlvbl9pZCI6ICIxMjM0NTY3IiwgImN1c3RvbWVyX2lkIjogIkMwYWJjZGVmIiwgIm1lc3NhZ2VfaWQiOiAiODY3NTMwOSIsICJwdWJsaXNoX3RpbWUiOiB7InNlY29uZHMiOiAxNDU3NzMxODQ2LCAibmFub3MiOiAzNDkwMDAwMDB9LCAicmVzZWxsZXJfY3VzdG9tZXJfaWQiOiAiQzByZXNlbGxlciJ9"
,
"message_id"
:
1234567891012131
},
"subscription"
:
"projects/ PROJECT
/subscriptions/ SUBSCRIPTION_NAME
"
}
Example message.data
object after decoding:
{
"customer_id"
:
"C0abcdef"
,
"customer_domain_name"
:
"domain.com"
,
"event_type"
:
"SUBSCRIPTION_CANCELLED"
,
"sku_id"
:
"Google-Apps-Unlimited"
,
"subscription_id"
:
"1234567"
,
// Optional fields dependent on event_type
"subscription_suspension_reasons"
:
[],
"subscription_cancellation_reason"
:
"REASON"
}
Event types
Possible event types:
-
NEW_SUBSCRIPTION_CREATED: A new subscription was created. -
SUBSCRIPTION_TRIAL_ENDED: Trial ended for a subscription. -
PRICE_PLAN_SWITCHED: Customer converted from a flexible plan to an annual plan. This event isn't triggered if the customer converts from an annual plan to a flexible plan as part of a renewal. -
COMMITMENT_CHANGED: Annual commitment was increased or decreased. -
SUBSCRIPTION_RENEWED: An annual subscription was renewed. -
SUBSCRIPTION_SUSPENDED: Subscription is suspended. Seesubscription_suspension_reasons. -
SUBSCRIPTION_SUSPENSION_REVOKED: Suspension was revoked. -
SUBSCRIPTION_CANCELLED: Subscription was canceled. Seesubscription_cancellation_reason. Can also detect transfers. -
SUBSCRIPTION_CONVERTED: Subscription was converted. Example cases:- Convert direct subscription to reseller subscription.
- Convert paid subscription to grace offer.
- Convert online subscription to offline subscription.
-
SUBSCRIPTION_UPGRADE: Subscription SKU was upgraded. Example: Google Workspace Business Starter to Business Standard. -
SUBSCRIPTION_DOWNGRADE: Subscription SKU was downgraded. Example: Google Workspace Business Standard to Business Starter. -
LICENSE_ASSIGNMENT_CHANGED: License was assigned or revoked. Use to track seat count changes for Flexible subscriptions.
Subscription cancellation reasons
The cancellation reason is populated when event_type
is SUBSCRIPTION_CANCELLED
. Possible reasons:
-
TRANSFERRED_OUT: The customer transferred to direct billing or another reseller. -
PURCHASE_OF_SUBSUMING_SKU: The customer upgraded to a SKU that overrides another. Example: A customer with Google Workspace Business Starter and Vault upgrades to Business Plus, which includes Vault. -
RESELLER_INITIATED: The reseller canceled the subscription. -
OTHER: The subscription was canceled for another reason.
Subscription suspension reasons
The suspension reason is populated when event_type
is SUBSCRIPTION_SUSPENDED
. Possible reasons:
-
PENDING_TOS_ACCEPTANCE: The customer hasn't accepted the Google Workspace Resold Terms of Service. -
RENEWAL_WITH_TYPE_CANCEL: The customer's commitment ended and service was canceled. -
RESELLER_INITIATED: The reseller manually suspended the subscription. -
TRIAL_ENDED: The customer's trial expired without a non-trial plan selection. -
OTHER: The customer is suspended for an internal Google reason, such as abuse.
Pub/Sub limitations
Push notification ordering isn't always sequential. Messages might be delivered
multiple times or not at all. We recommend using reseller.subscriptions.get
on changed subscriptions to pull the current
state.

