Understand the rate limits, messaging tiers, template restrictions, and conversation windows that govern the WhatsApp Business API so you can plan your integration accordingly.
WhatsApp distinguishes between two fundamental message types. The type determines when you can send a message, what content is allowed, and how it is billed.
| Type | Initiated By | Window | Approval | Use Case |
|---|---|---|---|---|
| Session Message | User | 24-hour window | Not required | Free-form replies to user messages |
| Template Message | Business | Anytime | Pre-approved by Meta | Notifications, alerts, re-engagement |
Note: Session messages are sometimes called "user-initiated messages" and template messages are called "business-initiated messages" in Meta's documentation. Both terms are used interchangeably.
Your WhatsApp Business Account (WABA) is assigned a messaging tier that determines how many unique users you can send business-initiated (template) messages to within a rolling 24-hour period. This limit applies per phone number.
| Tier | Unique Users / 24h | Upgrade Requirement |
|---|---|---|
| Tier 1 | 1,000 | Send 500 messages to 500 unique users in 7 days |
| Tier 2 | 10,000 | Send 5,000 messages to 5,000 unique users in 7 days |
| Tier 3 | 100,000 | Send 50,000 messages to 50,000 unique users in 7 days |
| Tier 4 | Unlimited | Maximum tier -- no further upgrades |
Tier upgrades happen automatically when you meet the volume requirement while maintaining a high or medium quality rating. Downgrades can occur if your quality rating drops to low due to user complaints or blocks.
Warning: If your quality rating reaches "Flagged" status, your messaging tier may be frozen or reduced. You will not be able to upgrade until your quality rating improves back to medium or high.
Message templates must be submitted for approval before use. Meta reviews each template against their commerce and messaging policies.
| Constraint | Limit |
|---|---|
| Maximum templates per WABA | 250 |
| Template name length | 512 characters |
| Template body length | 1,024 characters |
| Header parameters | 1 |
| Body parameters | No fixed limit (practical max ~20) |
| Buttons per template | Up to 10 (quick reply or CTA) |
Each template has an individual quality rating (high, medium, or low) based on recipient feedback. Templates that receive too many blocks or "report spam" actions will be paused automatically by Meta.
APPROVED -> Template is active and can be sent PAUSED -> Too many negative signals; sending is temporarily disabled DISABLED -> Permanently rejected; must create a new template IN_REVIEW -> Awaiting Meta approval (typically < 24 hours) REJECTED -> Did not pass policy review; edit and resubmit
Tip: You can check template quality and status via the IntelliPortal dashboard or by calling the GET /v1/templates endpoint.
When a user sends your business a message, a 24-hour conversation window opens. During this window you can reply with free-form session messages without needing a pre-approved template. The window resets every time the user sends a new message.
User sends message -> 24h window OPENS
|
|-- Business sends session (free-form, no approval needed)
|-- Business sends session (still within 24h)
|
+-- 24 hours elapse -> Window CLOSES
|
+-- Business must use -> Template message (pre-approved)
template to re-engage| Scenario | Message Type Allowed | Window Status |
|---|---|---|
| User just messaged you | Session or Template | Open (24h from last user message) |
| Within 24h, user is active | Session or Template | Open (resets on each user message) |
| 24h passed, no user message | Template only | Closed |
| Business sends template | Template only | Opens a new 24h window on delivery |
Important: Attempting to send a session message outside the 24-hour window will return a 131026 error code. Use the Error Codes reference for details.
The WhatsApp Business API enforces per-second throughput limits on message sending. These limits apply at the phone number level and vary by message type.
| Message Type | Rate Limit | Scope |
|---|---|---|
| Template messages | 80 msg/sec | Per phone number |
| Session messages | 250 msg/sec | Per phone number |
| Media uploads | 60 req/sec | Per WABA |
| Phone number registration | 10 req/min | Per WABA |
Your phone number's quality rating directly affects your effective throughput. If the quality rating drops, Meta may reduce your sending rate below the standard limits.
| Quality Rating | Effect on Rate Limits |
|---|---|
| High (Green) | Full rate limits apply |
| Medium (Yellow) | May be reduced; tier upgrades paused |
| Low (Red) | Significantly throttled; tier may be downgraded |
When you exceed the per-second rate limit, the API returns a 429 status code. Implement exponential backoff with jitter to retry gracefully.
async function sendWithRetry(payload, maxRetries = 5) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
const res = await fetch("https://api.intelliportal.io/v1/messages/send", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.INTELLI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify(payload),
});
if (res.status !== 429) return res;
const retryAfter = parseInt(res.headers.get("Retry-After") ?? "1");
const jitter = Math.random() * 1000;
const delay = retryAfter * 1000 * Math.pow(2, attempt) + jitter;
console.log(`Rate limited. Retrying in ${Math.round(delay / 1000)}s`);
await new Promise((r) => setTimeout(r, delay));
}
throw new Error("Max retries exceeded");
}Follow these guidelines to maintain a healthy quality rating, avoid throttling, and ensure reliable message delivery.
Need help? If you are hitting limits unexpectedly or need a tier upgrade review, contact the IntelliPortal support team through the dashboard or reach out at support@intelliportal.io.