Home/Help Center/Send-time optimisation

Broadcasts

Send-Time Optimisation for WhatsApp Broadcasts

Message each contact at the hour they have historically been active on WhatsApp, computed from their own reply history, without delaying anyone past your campaign's window.

By Chirag Darji · Updated 27 Aug 2026 · 8 min read

On this page
  1. Before you start
  2. Steps
  3. What you will see
  4. How is a contact's "best hour" actually computed?
  5. Settings and options
  6. Why is inbound message history used instead of read receipts?
  7. Troubleshooting
  8. Does this feature ever conflict with A/B testing or a holdout group?
  9. Related reading
WhatsApp broadcast campaign report in VGraple CRM with delivered, read and replied stats per contact

Send-time optimisation stamps each recipient of a broadcast with their own individual send time, based on the hour of day they have historically sent the most inbound messages, instead of sending your whole audience at the exact moment you click send. This article explains how the underlying heuristic works, what happens for contacts with no history, and how it interacts with the campaign's own pacing window.

Send-time optimisation

  1. 1Reach the Schedule step of the composer
  2. 2Set your pacing window
  3. 3Turn on "Send at each contact's best
  4. 4Finish the rest of the Schedule step
  5. 5Understand what happens once the campaign fires
The steps on this page, in order.

Before you start

  • This is a checkbox on the Schedule step of any broadcast; no separate setup is required beforehand.
  • It works best on an audience with real conversation history in VGraple CRM. A brand-new audience (fresh CSV import, no prior conversations) falls back to the default hour for every contact, which still works, but has nothing individual to optimize yet.
  • Decide your campaign's overall pacing window first, since send-time optimisation operates inside it, not instead of it.

Steps

  1. Reach the Schedule step of the composer. Build your audience and message as normal, then move to the third step.

New broadcast composer in VGraple CRM: audience selection with segment, tag and CSV options and a live recipient count

  1. Set your pacing window. Choose how the campaign is paced (as fast as the number allows, or spread over 1, 4, 8 or 24 hours). This window is the outer boundary send-time optimisation works inside.

  2. Turn on "Send at each contact's best hour." This checkbox appears alongside the other Schedule-step timing options. Its helper text explains: "Uses the hour each contact has historically replied in. Nobody is delayed past the pacing window above."

  3. Finish the rest of the Schedule step and send. No further configuration is needed; the system computes each recipient's send time automatically once the campaign starts.

  4. Understand what happens once the campaign fires. At the moment sending begins, every pending recipient is stamped with a computed send time based on their preferred hour, then the send loop only picks up recipients whose stamped time has arrived, batch by batch, until the campaign completes.

What you will see

Recipients of a send-time-optimized campaign do not all move to "sent" at once, even on a fast connection; they are released in waves as each recipient's computed hour arrives, visible on the campaign detail page as the funnel fills in gradually rather than jumping straight to a high sent count. This is expected and by design, not a sign of a slow or stuck campaign. The delivery funnel and per-recipient table work exactly the same as any other campaign once each message actually sends.

How is a contact's "best hour" actually computed?

A nightly job looks at the last 90 days of inbound messages across your organization and, for each contact, finds which hour of the day carries the most messages from them, requiring at least 3 observations before trusting the result. A contact with fewer than 3 inbound messages in that window, or none at all, falls back to a default send hour (11 AM) rather than being treated as having a "known" preference that is really just noise from one or two data points.

This is deliberately a heuristic and not a predictive model. The honest version of this feature at typical business message volumes is "message people at the hour they have actually been awake and responsive before," computed directly from their own behavior, rather than a black-box score nobody on the team could explain if a customer asked why they got a message at that particular hour. When the campaign starts, each recipient's stamped send time is calculated forward from the current moment: if their preferred hour is later today, they wait until then; if it has already passed for today, the delay is capped at the campaign's own pacing window rather than pushing them to tomorrow, so nobody misses the campaign entirely because of the hour they usually reply.

Example

A salon's contact base includes a mix of working professionals who reply to WhatsApp mostly around lunchtime and retirees who reply mid-morning. A festive offer broadcast with send-time optimisation on reaches the lunchtime group around 1 PM and the mid-morning group around 10 AM, both inside the same overall campaign window, rather than everyone receiving it at whatever moment the salon happened to press send.

Settings and options

SettingWhat it doesDefault
Send at each contact's best hourStamps each recipient with their own computed send time within the campaign windowOff
Preferred hour recalculationNightly job recomputes each contact's preferred hour from their last 90 days of inbound messagesAutomatic, no configuration
Minimum observationsInbound messages required before a contact gets an individual preferred hour3
Default hourUsed for contacts without enough history11 AM
Pacing windowThe outer bound send-time optimisation cannot move a send pastSet separately on the Schedule step

Why is inbound message history used instead of read receipts?

Choosing which signal to trust matters here: a read receipt can fire in a batch the moment someone unlocks their phone after hours away from it, which says nothing about when they were actually alert and receptive, only when their phone happened to sync. An inbound message a contact sent is a much stronger signal specifically because it means they had the phone in hand and made an active choice to type something to your business at that hour, which is a genuinely different, more reliable statement about when that person tends to be engaged than a passive delivery receipt could ever provide. This is also why the computation requires at least 3 separate inbound messages before trusting an hour for a given contact: a single message sent at 2 AM because of one unusual night does not make 2 AM that person's real pattern, and the minimum-observation threshold exists precisely to avoid mistaking noise from one or two data points for a genuine preference.

Troubleshooting

SymptomLikely causeFix
Campaign is sending very slowly compared to a normal broadcastRecipients are being released at their individually computed hours, spread across the pacing window, which is expected with this option onNot an error; check the funnel is still progressing, or turn the option off for future campaigns that need to land all at once
Most recipients seem to send at the same default hourMany contacts in the audience have little or no inbound message history yetExpected for a newly imported or low-engagement list; the feature has more to work with as real conversations build up
A recipient received the message immediately despite having a "best hour" later in the dayTheir computed hour had already passed relative to the campaign start, so the delay was capped at the pacing window instead of waiting until tomorrowExpected behavior; nobody is ever delayed past the campaign's own window
Preferred hours do not seem to reflect recent behavior changesThe nightly recompute job runs on a schedule, not instantly after every new messageWait for the next nightly run; the hour updates automatically over time as new activity accumulates

Does this feature ever conflict with A/B testing or a holdout group?

No, all three can run on the same campaign without interfering with each other, because they operate on different layers of the send. Send-time optimisation only changes when a recipient's message goes out within the campaign's window; it never changes what they receive or whether they receive it at all. A/B testing decides which of two versions a recipient gets, independent of timing, and a holdout deliberately withholds a slice of the audience from receiving anything, also independent of timing. A campaign can validly combine all three: two versions being tested, each recipient sent at their own best hour, with a small holdout group receiving neither version, and each mechanism does its own job without needing to know the other two exist.

Combine send-time optimisation with A/B testing a broadcast to test both message and timing together, and review quiet hours and the marketing frequency cap for the org-wide timing rules that apply on top of any per-contact optimisation.

Frequently asked questions

How does VGraple CRM know a contact's best hour to send?
It looks at that contact's own inbound message history over the last 90 days and finds the hour of day carrying the most messages from them. An inbound message means their phone was in hand and they chose to engage, which is a stronger signal than when a message was merely marked read.
What happens for a contact with no message history?
They get a sensible default hour (11 AM) rather than being skipped or delayed indefinitely. Send-time optimisation only changes behavior for contacts with enough history to say something real about them.
Can send-time optimisation delay someone past when I wanted the campaign to finish?
No. It can only move a send later within the campaign's own pacing window, never earlier than the campaign start and never later than the window you set. A contact whose best hour has already passed by the time the campaign starts still receives the message on schedule rather than waiting a full day.
Is this a machine-learning model?
No, deliberately. It is a heuristic, the hour with the most inbound messages from that specific contact, which is transparent and explainable rather than an opaque model nobody on the team could describe to a customer.
How often is a contact's preferred hour recalculated?
A nightly job recomputes it from recent activity, so a contact's preferred hour can shift over time as their real behavior changes, rather than being fixed once from an old snapshot.
Does this work alongside "use each recipient's local time"?
Yes, they solve different problems and can both be turned on. Local time adjusts for time zone using the contact's phone country; send-time optimisation additionally adjusts for that specific contact's own historical activity pattern within their day.

Run your WhatsApp on VGraple CRM

Free forever plan, official Meta WhatsApp Business API, set up in 15 minutes. No card needed.