# Send-time optimization per contact: how it works

Canonical: https://brew.new/blog/send-time-optimization-per-contact
Author: Philip Sørensen
Published: 2026-10-10
Updated: 2026-10-10

Per-contact send-time optimization schedules each recipient's copy of an email for the hour that person has opened or clicked before, instead of one hour for the whole list.

"What is the best time to send a newsletter?" is a question about averages. Benchmark reports answer with one weekday mid-morning hour, averaged over millions of people who are not on your list. Your readers clear their inbox on the train at 7:00, at lunch, or after dinner. A 10:00 send suits the 10:00 readers and gets buried for everyone else.

In Brew this is **Intelligent Send**. Here is how it picks the hour, where it falls back, and how to test whether it helped.

![Chart comparing one fixed send hour with per-contact send hours spread across the day.](/images/blog/intelligent-send-hours.png)

*One fixed hour versus a send spread across each contact's past engagement hours.*

## Key takeaways

- Each recipient gets the email within 24 hours of your chosen start, at the hour they are most likely to open.
- It reads up to 200 recent opens and 100 recent clicks per contact, weights clicks, recent activity and same-weekday activity higher, and ignores machine opens such as Apple Mail Privacy Protection fetches.
- Contacts with no usable history get the email at the start time. Brew does not guess a list-wide default hour.
- It ignores time zones, cannot be combined with Gradual send, and automations do not use it yet.
- To measure it, split engaged contacts into two random halves and compare click rate, not open rate, over at least three sends.

## How it works

In the send dialog, **When to send** offers Send now, Schedule, Intelligent send and Gradual send. Choose **Intelligent send** and pick a start, now or later. The button changes to **Start Intelligent Send** or **Schedule Intelligent Send**. The [send options docs](https://docs.brew.new/create-emails/send-options) cover all four modes.

For each contact, Brew gives an AI evaluation model 24 one-hour slots, the start hour plus the next 23, and that contact's history with your brand, up to their 200 most recent opens and 100 most recent clicks. The model picks the likeliest hour, weighing three things:

1. Clicks over opens. A click means someone read far enough to act.
2. Recent over old. People change jobs, commutes and habits.
3. Same weekday and hour over the same hour on other days. Tuesday 8:00 and Saturday 8:00 are different habits.

If the chosen hour is later than the start, the email goes out about 5 minutes before it, near the top of the inbox when the person looks. If it is the start hour, it goes immediately.

## A worked example

You start an Intelligent Send on a Tuesday at 09:00 UTC. The histories below are made up. The rules are real.

**Ana** has clicked your last six emails, mostly 13:00 to 14:00 on weekdays, and opened a few at 07:30. Clicks outweigh opens, so 13:00 is the likely pick and her email goes out around 12:55.

**Ben** opens almost everything between 07:00 and 08:00. That hour has passed, but the window runs until 08:59 Wednesday, so he gets it about 22 hours after the start, just before he usually reads. People miss this. An early start does not mean early readers get it today.

**Chloe** joined last week and has never opened anything, so she gets it at 09:00.

**Dev** has twenty opens, all within seconds of delivery, at all hours. That looks like a mail client fetching content, not a person reading. Brew only counts opens and clicks it judged human, so if none of Dev's pass, he goes out at 09:00 like Chloe.

Apple's Mail Privacy Protection [downloads remote content in the background by default](https://www.apple.com/legal/privacy/data/en/mail-privacy-protection/), whether or not the person reads the email. A model fed those opens learns when Apple's servers fetch mail and schedules you for an hour when nobody is looking.

## What it does not use

No time zone or location. The hours are UTC, and the only input is timestamps of past human opens and clicks.

That is less of a gap than it sounds. A time zone is a guess at when someone is awake. An open timestamp records when they read. Someone whose profile still says New York after moving to Berlin is timed from when they read now.

It also never invents an "audience-wide best hour" for unknown contacts. With no history, Brew sends at your start. I think that is right. The start is a decision you made, and a borrowed average is no better.

No email address or other identifier goes to the model, and the model call is not billed to you.

## When planning falls back

A contact with history can still go out at the start if:

- the model does not answer within 5 seconds, or the call fails
- a very large send runs out of planning time, which is about 4 minutes per page of recipients and 20 minutes per send

These are counted separately as "could not be timed". If that number is large, know it before drawing conclusions.

## Reading the results

The send's analytics page summarises it in three lines:

- **Optimization** says the send used each contact's best hour from their opens and clicks.
- **Assignments** gives contacts timed from history, contacts sent right away, and how many of those had history but could not be timed.
- **Last delivery by** is when the final email in the window goes out.

The **contact timing** panel below lists contacts in planned order, searchable by email, each with a reason such as "Timed from their past opens and clicks" or "Right away: no opens or clicks yet".

Check Assignments first. If 85% went out right away, it was mostly a normal send with a small timed tail. Common on a young list, and not a failure.

## When to use it

Use it where a few hours either way do not change the meaning: newsletters, monthly product updates, content digests, nurture emails to an engaged segment.

Skip it when the time is the message: a webinar reminder for 14:00 today, a sale ending at midnight, an announcement tied to a press release. Use Schedule for those.

Timing will not rescue a broken email. Run the [pre-send QA checklist](/blog/pre-send-email-qa-checklist) before you pick a start.

Other things to know:

- A send has one delivery mode, so it cannot be combined with **Gradual send**.
- It works for campaign sends to an audience or a list of addresses. Automations do not use it yet.
- Pausing or holding a send can move planned times once the hold clears.

## How to test whether it helped

Intelligent Send does not hold out a control group or report lift, so run the comparison yourself, and watch for dilution. Only timed contacts can move. Split 20,000 contacts into two halves of 10,000, and say 35% of the Intelligent Send half gets timed. If timing lifts that group's click rate from 3.0% to 3.6%, a good result, the half as a whole moves from 3.0% to about 3.2%. At 10,000 per half, 0.2 points at a 3% click rate is inside normal send-to-send noise. You would conclude it does not work.

So test on contacts who can be timed:

1. Build the audience from contacts who have clicked or opened before, so most have usable history.
2. Split it in two at random, for example with a contact field you assign before the send.
3. Send the same email with the same start to both. One half uses Intelligent Send, the other Send now or Schedule.
4. Compare **click rate**. Machine opens inflate opens on both halves and hide the difference.
5. Repeat on at least three sends. One send can be swung by a subject line or a big story.

The [A/B testing guide](/blog/email-ab-testing) covers sample size, and [the metrics that matter](/blog/email-metrics-that-matter) explains why clicks are the safer signal.

## From the API, MCP or chat

It works anywhere you can send:

- **API.** `POST /v1/sends` with `smartSend: true`, plus `scheduledAt` for a later start.
- **MCP.** The `send_email` tool takes `smartSend`, so you can ask Claude or Cursor to "send it with Intelligent Send".
- **Brew chat.** Ask the agent to send with Intelligent Send and approve as usual.

Reading a send back returns a `smartSend` object with `windowEndsAt`, `assignedViaModel`, `assignedImmediately` and `modelFallbacks`, the same numbers as the Assignments line.

For the raw signal, `GET /v1/contacts/{email}?include=openProfile` returns a contact's open history as 48 half-hour UTC slots. Once a contact has at least 5 unique opens, it adds a best open time, a best send time and a `confidence` score from 0 to 1. The key needs the `emails` scope as well as `contacts`. That profile can include machine opens, and Intelligent Send does not read it. The planner uses human opens and clicks directly.

## Frequently asked questions

### Does it delay the whole send by up to a day?

No. Contacts with no history, or whose best hour is the start hour, get it at the start. Only contacts whose history points later wait, and only until that hour.

### Will it help a brand-new list?

Not at first. With no human opens or clicks on record, everyone goes out at the start. It matters after a few sends' worth of engagement.

### Does it replace picking a good start time?

No. The start is still the send time for everyone without history, and it sets the 24-hour window. Pick one you would be happy with as a normal send.

### Does it use my contacts' time zones?

No. It uses only when each person has opened and clicked before, which is better evidence than a stored time zone.
