Vendor Message Classification and Quota Management Best Practices
Android vendor channels generally classify notification messages and apply different reminder styles, total push quotas, per-device receiving limits, and QPS limits to different message types. Properly using message classification and quota strategies can improve the delivery rate of important messages and prevent operation messages from consuming key resources or being restricted by vendors.
This document is for developers using JPush with Xiaomi, Huawei, Honor, OPPO, vivo, Meizu, FCM, ASUS, HarmonyOS, and other channels. It helps you understand message classification, quota deduction, delivery strategies, and troubleshooting.
Core Principles
- Determine the business type first, then choose vendor classification fields. Do not set system-message fields only because you want a higher delivery rate.
- For user-related messages that users need to know in time, apply for important-message classifications according to vendor rules.
- For content recommendations, campaigns, platform announcements, and similar messages, use operation or marketing message classifications and configure frequency control.
- When sending by API, prioritize
options.classificationto identify the message type and avoid conflicts between vendor fields. - For vendors such as Xiaomi and OPPO that support
skip_quota, do not treat it as a way to bypass vendor limits. It only controls whether Jiguang-side quota judgment and deduction are skipped; vendor limits still apply. - Before forcing vendor-channel delivery, confirm that the vendor quota is sufficient. Otherwise, a quota-insufficient error may be returned directly.
Classification Quick Reference
| Vendor | Important / Service Messages | Ordinary / Operation Messages | Key Configuration |
|---|---|---|---|
| Xiaomi | Private messages | Public messages / default channel | options.classification=1; every private message must include both third_party_channel.xiaomi.channel_id and mi_template_id, plus mi_template_param when the template contains variables |
| Huawei | Service and communication messages | Information and marketing messages | options.classification=1, third_party_channel.huawei.importance, third_party_channel.huawei.category |
| Honor | Service and communication messages | Information and marketing messages | options.classification=1, third_party_channel.honor.importance |
| OPPO | Private / service and communication messages | Public / operation messages | third_party_channel.oppo.channel_id, category, notify_level; combine with skip_quota when needed |
| vivo | System messages; Account and Assets, Schedule and To-dos, Device Information, Orders and Logistics, and Subscription Reminders can use template messages | Operation messages | options.classification=1; for template messages, set third_party_channel.vivo.vivo_push_type=4 and vivo_template_id, plus vivo_template_param when the template contains variables |
| Meizu | Limited by business subscription and vendor rules | Limited by business subscription and vendor rules | Pay attention to business rate limits, subscription tag count, and device activity limits |
Note: This table maps vendor classification concepts for easier understanding. Actual values and application methods must follow vendor official rules, the Jiguang vendor message classification guide, and your app review results.
API Field Priority
options.classification
options.classification is the core field used by Jiguang to adapt Android vendor message classification:
0: operation message, default value.1: system message.- This field has the highest priority and overrides some vendor subfields, such as
options.third_party_channel.vivo.classificationandoptions.third_party_channel.honor.importance. - Jiguang does not judge or calibrate the message type specified by developers. Make sure the value matches the actual business content.
Vendor Subfields
Different vendors may require additional subfields:
channel_id: notification classification or notification channel identifier for Xiaomi, Huawei, OPPO, and other vendors.importance: smart notification classification for Huawei and Honor.category: message scenario identifier for Huawei, vivo, OPPO, and other vendors.notify_level: OPPO notification reminder level. It usually needs to be used together withcategory.mi_template_id/mi_template_param: Xiaomi private-message template delivery. Every private message must includemi_template_id. If the template contains variables, providemi_template_paramas a JSON string; for a template without variables, pass the string"{}"ornull. JPush automatically splits a multi-target push into individual MiChannel vendor requests.vivo_push_type: Specifies a special vivo push type. Set it to4for a template message.vivo_template_id/vivo_template_param: vivo template message delivery. Setvivo_template_idto an approved template ID. If the template contains variables, providevivo_template_paramas a JSONObject with key-value pairs matching the template variables.push_mode: vivo formal push or test push identifier.skip_quota: currently effective only for Xiaomi and OPPO. It indicates whether Jiguang-side quota judgment and deduction are skipped.
Quota and QPS Management
Jiguang Platform Limits
Non-VIP apps support vendor channels, but each push request has an upper limit on the number of users that can use vendor channels. Requests that exceed the vendor-channel quota do not necessarily mean the message cannot be delivered. Jiguang switches to the Jiguang channel according to device status and available strategies.
If your business has higher requirements for offline delivery rate, real-time delivery, or large-scale push, evaluate VIP service for more stable vendor-channel resources.
Vendor System Limits
Each vendor has its own quota and QPS limits:
- When vendor quota is exceeded, Jiguang tries to deliver through the Jiguang channel.
- When vendor QPS is exceeded, Jiguang slows down delivery according to vendor limits to reduce message loss caused by QPS limits.
- Vendor system limits cannot be bypassed. Even VIP users must follow vendor rules.
Operation Message Limits
Operation messages are usually subject to per-device daily receiving limits. Xiaomi public messages, OPPO public messages, vivo operation messages, and Huawei/Honor information and marketing messages all need to be controlled according to vendor rules.
vivo devices receive operation messages from 7:00 to 23:00 each day. Operation messages sent outside this window return vivo error code 10071 and are not delivered. System messages are not subject to this delivery window.
Recommendations:
- Enable the vendor operation message strategy in the console and configure the per-user daily operation message limit.
- The vendor operation message limit should be less than or equal to Jiguang's per-device push frequency limit.
- For marketing messages, use tags, user properties, segmentation, scheduling, and frequency control instead of occupying important-message classifications.
Recommended Configuration Flow
- Sort business message types and distinguish important messages from operation messages.
- Apply for important-message classifications, private-message channels, self-classification permissions, channels, or templates according to vendor requirements.
- Complete vendor channel SDK integration on the client and ensure that the corresponding notification channel, channel, or category has been created or approved. vivo subscription reminders additionally require client authorization for the subscription channel.
- Configure vendor parameters, vendor operation message strategies, and necessary frequency control rules in the console.
- When sending by API, set
options.classificationand add corresponding vendor fields. - Select the
third_party_channeldelivery strategy according to the business goal. - Continuously monitor through push records, statistics APIs, callback APIs, and vendor quota queries.
API Example
The following example shows where to configure fields for an important order-status notification. Actual vendor field values must follow your application results.
{
"platform": "android",
"audience": {
"registration_id": ["1104a89792xxxxxx"]
},
"notification": {
"android": {
"alert": "Your order has shipped",
"title": "Order status update",
"channel_id": "order_status"
}
},
"options": {
"classification": 1,
"third_party_channel": {
"xiaomi": {
"distribution": "ospush",
"channel_id": "your_xiaomi_private_channel_id",
"mi_template_id": "your_xiaomi_template_id",
"mi_template_param": "{\"order_no\":\"202607280001\"}"
},
"huawei": {
"distribution": "secondary_push",
"importance": "NORMAL",
"category": "TRAVEL"
},
"honor": {
"distribution": "secondary_push",
"importance": "NORMAL"
},
"oppo": {
"distribution": "secondary_push",
"channel_id": "your_oppo_private_channel_id",
"category": "ORDER",
"notify_level": 16
},
"vivo": {
"distribution": "ospush",
"category": "TODO",
"vivo_push_type": 4,
"vivo_template_id": "your_vivo_template_id",
"vivo_template_param": {
"order_no": "202607280001"
}
}
}
}
}
vivo Template Message Configuration
- The following five system-message categories can apply for and use message templates according to vivo rules: Account and Assets, Schedule and To-dos, Device Information, Orders and Logistics, and Subscription Reminders.
- For API delivery, set
options.classification=1andoptions.third_party_channel.vivo.vivo_push_type=4, and provide an approvedvivo_template_id. If the template contains variables, also providevivo_template_paramvalues that match those variables. - vivo subscription reminders require both client authorization for the subscription channel and server-side template configuration. Completing only one of these steps does not complete the integration.
- A vivo vendor template ID is different from a JPush console push template ID. Do not use them interchangeably.
- vivo message template rules apply to new apps starting October 31, 2026, and are scheduled to apply to all apps starting April 1, 2027. Complete template approval and integration testing in advance.
For complete requirements, see the vivo Message Classification Usage Guide and the vivo template message requirements in the Push API documentation.
Common Misunderstandings
Misunderstanding 1: Setting All Messages as System Messages
System messages, private messages, and service and communication messages usually have clear scenario boundaries. Setting marketing, campaign, or content recommendation messages as system messages may cause vendor review failures, channel restrictions, or reduced future push stability.
Misunderstanding 2: Passing Only classification Without Applying for Vendor Classification
classification is an important field for Jiguang-side vendor classification adaptation, but some vendors also require channels, self-classification permissions, templates, or categories to be applied for in advance. Without vendor-side configuration, pushes may still fail or be classified as ordinary messages.
Misunderstanding 3: Treating skip_quota as Bypassing Vendor Limits
skip_quota only indicates whether Jiguang-side quota judgment and deduction are skipped, and currently only applies to Xiaomi and OPPO. Vendor quota, QPS, and per-device quantity limits still exist.
Misunderstanding 4: Forcing ospush Without Checking Quota
ospush forces delivery through the vendor channel. If the specified vendor quota is insufficient, the push request may fail with a vendor-quota-insufficient error. For large-scale pushes, query quota first or use a safer delivery strategy.
Misunderstanding 5: Sending Test Messages Without Test Identifiers
Some vendors provide dedicated parameters for test messages. For example, vivo push_mode=1 means test push, while Jiguang test_model means test-mode push to test devices. They have different meanings and should be selected according to the scenario.
Misunderstanding 6: Configuring Only the Server-Side Template for vivo Subscription Reminders
vivo subscription reminders require both client authorization for the subscription channel and server-side template configuration. The client should process the channel status returned by the subscription authorization API, and the server should then deliver messages using an approved template ID.
Troubleshooting Recommendations
When the delivery rate of important messages is abnormal or vendor errors are returned, troubleshoot in this order:
- Check whether the vendor channel is integrated successfully and whether the vendor token is obtained normally.
- Check whether the message content matches the scenario requirements for system messages, private messages, or service messages.
- Check whether
options.classificationmatches each vendor subfield. - Check whether vendor channels, templates, self-classification permissions, and categories have been approved.
- For a vivo template message, check
vivo_push_type,vivo_template_id, and whether template variables match. For a subscription reminder, also check the client authorization result. - Check whether vendor quota, per-device daily quantity limits, or QPS limits are triggered. If a vivo operation message returns
10071, check whether it was sent outside 7:00–23:00. - Check whether
distribution,distribution_fcm, anddistribution_customizematch the message type. - Review push records, statistics APIs, callback APIs, and vendor backend quota data.
Recommended Configuration Checklist
Before sending, confirm the following:
- Important messages and operation messages have been distinguished.
- Vendor classification application and client notification channel configuration are complete.
- The API request sets an accurate
options.classification. - Vendor fields such as
channel_id,importance,category,notify_level, and template fields comply with vendor rules. - vivo template messages set
vivo_push_type=4and use an approved template ID. Client authorization is complete for subscription reminders. - Operation messages have per-user frequency control and vendor operation message strategy configured.
- Vendor quota and QPS are understood before large-scale push.
- Quota is confirmed before forcing vendor-channel delivery.
- Push records, statistics, and callbacks are integrated for continuous troubleshooting.