> AI agents: this is one page from PostHog's docs. Full index of Markdown docs for LLMs: https://posthog.com/llms.txt # Frequency cap Canonical URL: https://posthog.com/docs/workflows/frequency-cap > **Cloud region:** This page uses US Cloud hosts. For an EU Cloud project, use `https://eu.posthog.com` instead of `https://app.posthog.com` (app host for links). ## On this page - [Set the cap](#set-the-cap) - [What counts toward the cap](#what-counts-toward-the-cap) - [Messages over the cap](#messages-over-the-cap) - [Holding messages over the cap](#holding-messages-over-the-cap) - [Related](#related) The frequency cap limits how many marketing messages one person gets in a rolling number of days. It counts email, SMS, and push messages from all workflows and broadcasts together. With a cap of 2 messages in 7 days, a person who got 2 marketing messages gets no more until the older of the two is 7 days old. ## Set the cap Set the cap in PostHog under **Workflows** > **Messaging** > [**Settings**](https://app.posthog.com/workflows/settings): - **Messages per person**: The most marketing messages one person can get in the window, from 1 to 1,000. - **Within this many days**: The length of the window, from 1 to 30 days. - **Hold capped messages for up to (hours)**: Optional. How long a message over the cap waits for a free slot, from 1 to 168 hours. See [holding messages over the cap](#holding-messages-over-the-cap). Leave the first two fields empty to turn the cap off. You can also set the cap and the hold time in the **Sending rules** step when you first set up Workflows. ## What counts toward the cap - Transactional messages are never capped, and they don't count toward a person's cap. - An email isn't capped, and doesn't count toward the cap, when you turn on **Skip the frequency cap** on its workflow step, or **Send even if people reached your frequency cap** on a broadcast. Use this for emails people need on time, such as a welcome email. Opt-outs still apply. - A message counts when PostHog sends it. A message that PostHog skips for an [opt-out or a suppression](https://posthog.com/docs/workflows/opt-outs.md) doesn't use up the cap. - A workflow run without a person isn't capped, for example a run that an event without a person profile triggered. - Test sends aren't capped. ## Messages over the cap By default, PostHog skips a message over the cap and doesn't send it later. The workflow moves on to the next step. The workflow's logs show the skip, and its metrics count the message as **Frequency capped**. To keep these messages instead, set a [hold time](#holding-messages-over-the-cap). ## Holding messages over the cap When you set a hold time, a message over the cap waits instead. The workflow run stays on that step, and PostHog tries the send again when one of the person's earlier messages leaves the window. If no slot opens before the hold ends, PostHog skips the message and the workflow moves on. Later steps, including delays, start only after the held message sends or is skipped. When more than one message waits for the same person, each free slot sends one of them. The others keep waiting for the next free slot. Held messages don't send in a fixed order. A hold helps most when it is close to the window length. With a cap of 1 message in 7 days and a 24-hour hold, a held message only sends if the person's last message is more than 6 days old. ## Related - [Opt-outs and suppression](https://posthog.com/docs/workflows/opt-outs.md): the other checks PostHog runs before a send - [Sending reputation and allowance](https://posthog.com/docs/workflows/sending-reputation.md): the project-wide hourly and daily email limits - [Transactional emails](https://posthog.com/docs/workflows/transactional-emails.md): messages that the cap doesn't apply to