# Create a geozone

Create a geozone to define where your campaign triggers and what happens when a user enters that area: a push message, a Customer Journey event, or both.

Go to **Campaigns → Geo campaigns**. Click **Create geozone** to start.

<img src="/push-notifications-geo-based-push-1.webp" alt="Geo campaigns Get Started screen with map view and Create geozone action in the Pushwoosh control panel."/>

## Set the campaign name and aggregated statistics

In the **Campaign name** field, enter a label up to 64 characters. Keep it short and recognizable, for example, `Spring sale at downtown shops`.

Optionally, select an existing campaign in the **Aggregated statistics** field. Geo campaign pushes will then be counted together with other touchpoints in that campaign's [aggregated messages statistics](/product/statistics-and-analytics/aggregated-messages/).

<img src="/push-notifications-geo-based-push-2.webp" alt="Geozone form section with Campaign name and Aggregated statistics fields."/>

## Choose entry actions

In the **Entry actions** section, turn on any combination of these actions. Keep at least one turned on, and give each event-based action a different event name when more than one is on.

<Aside type="note" title="Existing geozones">
If you created a geozone before this feature launched, it keeps **Send push** on and every event-based action off. Open and save the geozone to change that combination.

A geozone configured through the API with an action's duration set to 0 seconds also shows that action as off in the form.
</Aside>

Use this comparison to decide which actions to turn on:

| Action | Choose it when | Example campaign | Pairs well with |
|---|---|---|---|
| [**Send push**](#send-push) | You want people to see a message the moment they arrive, no journey needed | "20% off today" push the moment a shopper walks into the store | **Fire dwell event**, so you can also flag people who stuck around, for a later follow-up message |
| [**Fire event**](#fire-event) | You want to kick off a longer automated flow (several messages over time), not just one push | `PW_GeozoneEntered` starts a Journey: welcome message → wait 1 day → loyalty-card reminder | **Fire exit event**, so the Journey only ends once you're sure the person actually left |
| [**Fire exit event**](#fire-exit-event) | You want to know for sure the person left. That confirmation can arrive late, which is good for a follow-up sent well after the visit | `PW_GeozoneExited` triggers a "How was your visit?" survey once the visit is confirmed over | **Fire event**, so the same Journey that welcomed them on entry also wraps up properly when they leave |
| [**Fire dwell event**](#fire-dwell-event) | You only care about people who actually spent time there, not people who just walked past | `PW_GeozoneDwell` (Time inside = 15 min) flags "genuinely interested" visitors for a follow-up email | **Assume exit after silence**, so you get both signals in your CRM without ever messaging the person during the visit |
| [**Assume exit after silence**](#assume-exit-after-silence) | Your location tracking often loses signal (venues, backgrounded apps), so a confirmed exit isn't reliable. This fires anyway, on a timer | `PW_GeozoneExitedByTimeout` (Silence = 2 hours) closes out visits at a stadium with weak signal | **Fire dwell event**, so you can close out the visit reliably and still know if they actually engaged while there |

### Send push

Sends the push notification you configure in [Compose the push message](#compose-the-push-message) below. For example, a device entering the zone at 10:00 AM receives the push right away, as long as cooldown allows delivery. Turn it off if you only want an event-based action. The message settings disappear and you don't need to fill them in.

<img src="/push-notifications-geo-based-push-entry-send-push.webp" alt="Send push toggle enabled in the Entry actions section of the geozone form."/>

### Fire event

Fires a [custom event](/product/audience-data-and-segmentation/events/custom-events/) when the device enters the zone. Use it as a [Trigger-based entry](/product/customer-journey/journey-elements/entry-elements/trigger-based-entry/) into a Customer Journey. For example, a device entering the zone at 2:00 PM fires `PW_GeozoneEntered` at 2:00 PM. Entry and event happen at the same moment.

1. Turn on **Fire event**.
2. Set the **Event name**. Leave it empty to use the system default event `PW_GeozoneEntered`, or enter your own name (up to 128 characters).

The event carries six attributes: `geozone_code`, `geozone_name`, `lat`, `lng`, `range`, and `distance`. If the geozone is assigned to a cluster, it also carries `cluster_code` and `cluster_name`.

<img src="/push-notifications-geo-based-push-entry-fire-event.webp" alt="Fire event toggle enabled with the Event name field and event attributes shown below it."/>

<Aside type="note">
The event appears in the Customer Journey entry-element picker as soon as you save the geozone, before any device has entered the zone.
</Aside>

### Fire exit event

This event doesn't fire the moment someone leaves the zone. The device detects the exit first. It then reports the exit the next time it contacts Pushwoosh: a periodic background check-in that sends the device's location, not a live, constant connection.

How soon that contact happens depends on the device's OS and background settings, not on Pushwoosh, so the delay between the actual exit and the event can range from a few seconds to several hours. For example, a device that leaves at 3:00 PM but doesn't contact Pushwoosh again until 3:45 PM fires the event at 3:45 PM, not 3:00 PM.

Cooldown gates entry actions, not this one. If a device enters, exits, and re-enters the same geozone within one cooldown window, the repeat entry is suppressed, but each real exit still fires its own event, so you can end up with more exit events than gated entries for the same string of visits.

1. Turn on **Fire exit event**.
2. Set the **Exit event name**. Leave it empty to use the system default event `PW_GeozoneExited`, or enter your own name.

<img src="/push-notifications-geo-based-push-entry-fire-exit-event.webp" alt="Fire exit event toggle enabled with the Exit event name field and event attributes shown below it."/>

### Fire dwell event

Fires a custom event once the device has stayed inside the zone for the duration you set in **Time inside**, counted from entry.

<Aside type="note" title="How the dwell timer works">
Unlike **Fire exit event**, this action does not wait for the device to contact Pushwoosh. Pushwoosh starts a timer when the device enters the zone and fires the event when **Time inside** elapses, even if the device sends no further location updates in between.

- **Fires once per stay:** a new timer starts only after the device leaves and enters again.
- **No contact required:** a device that goes silent right after entering still triggers the event on schedule.

For example, with **Time inside** set to 10 minutes, a device that enters at 1:00 PM fires the dwell event at 1:10 PM, even if it has no contact with Pushwoosh in between.
</Aside>

1. Turn on **Fire dwell event**.
2. Set **Time inside** to a value from 1 to 1440 minutes.
3. Set the **Dwell event name**. Leave it empty to use the system default event `PW_GeozoneDwell`, or enter your own name.

<img src="/push-notifications-geo-based-push-entry-fire-dwell-event.webp" alt="Fire dwell event toggle enabled with the Time inside and Dwell event name fields shown below it."/>

### Assume exit after silence

Fires a custom event once a device, last confirmed inside the zone, goes quiet (stops sending location updates to Pushwoosh) for the duration set in **Silence before assuming**.

<Aside type="note" title="Confirmed exit vs assumed exit">
Unlike **Fire exit event**, this action does not wait for the device to report it left the zone. It fires when the device stays silent for the full **Silence before assuming** duration, even if no location update ever shows it outside.

These two actions answer different questions:

- **Fire exit event:** the device sent a location update from outside the zone.
- **Assume exit after silence:** Pushwoosh treats the visit as over because the device stopped sending updates.

Build a separate Customer Journey trigger for each. If you combine them into one trigger, it fires on either signal and you cannot tell a real exit from a device that simply stopped reporting.

For example, with **Silence before assuming** set to 30 minutes, a device last seen inside the zone at 4:00 PM fires the assumed-exit event at 4:30 PM if it stays silent that whole time.
</Aside>

1. Turn on **Assume exit after silence**.
2. Set **Silence before assuming** to a value from 5 to 1440 minutes.
3. Set the **Assumed exit event name**. Leave it empty to use the system default event `PW_GeozoneExitedByTimeout`, or enter your own name.

<img src="/push-notifications-geo-based-push-entry-assume-exit.webp" alt="Assume exit after silence toggle enabled with the Silence before assuming and Assumed exit event name fields shown below it."/>

<Aside type="note">
Exit, dwell, and assumed-exit events carry one extra attribute beyond the six listed above: `dwell_seconds`, the time the device spent inside the zone from entry to the event.

- **Fire exit event** also carries `distance`, since it comes from an actual location update.
- **Fire dwell event** and **Assume exit after silence** don't carry `distance`. Both fire from a server timer, not a location update.
</Aside>

## Compose the push message

With **Send push** turned on, choose how to compose the notification:

- **Write a message**: enter the push text directly in the form (up to 1024 characters). Use this option for a quick one-time message in a single geozone.
- **Use an existing preset**: pick a saved [preset](/product/content/push-presets/) for full templating with title, deep link, custom sound, and platform-specific payloads.

<img src="/push-notifications-geo-based-push-3.webp" alt="Geo campaign creation form showing campaign name, push message settings, and iOS sound and inbox options."/>

Configure optional message settings:

- **Play default sound on iOS**: uses the system push sound on iOS devices.
- **Save to inbox**: keeps the push in the device's in-app inbox after delivery, so the user can come back to it later. When enabled, set **Inbox expire** (1–365 days) and optionally an **Inbox icon URL**. [Learn more](/product/messaging-channels/message-inbox/mobile-message-inbox/#choosing-which-messages-to-save-to-inbox).

## Set the trigger location

Choose a shape for the trigger location:

- **Circle**: search for an address, paste raw coordinates into the search bar, or click anywhere on the map to drop a marker. Drag the handle on the circle to set the **Range**. Range can be set between 50 m and 100 km. Default is 200 m.

<img src="/push-notifications-geo-based-push-5.webp" alt="Trigger location set to Circle mode with an address search result and a range circle drawn around a New York location."/>

- **Polygon**: click the map to drop corners, one at a time, tracing the outline of the area, for example a mall floor plan or a venue perimeter. Drag a corner to move it, right-click a corner to delete it. A polygon needs 3 to 100 distinct corners. You don't need to close the shape by clicking the first corner again.

<img src="/push-notifications-geo-based-push-polygon-1.webp" alt="Trigger location set to Polygon mode with a five-corner shape drawn around a city block, corner count and the derived monitoring circle shown below the map."/>

<Aside type="note" title="Devices monitor a circle, even for a polygon shape">
A phone can only monitor a circle, not a polygon shape. When you draw a polygon, Pushwoosh calculates a circle that fully contains it, centered on the shape with a radius reaching its farthest corner (minimum 50 m). The device wakes up and reports its location as soon as it enters that circle.

The push itself doesn't fire yet at that point. It only fires once the server confirms the device is actually inside the polygon you drew. That's why a push can wake the device earlier than it reaches your shape, but it's still only delivered once the user has actually entered the area.
</Aside>

You can switch the shape when editing a saved geozone:

- To convert a polygon geozone to a circle, select **Circle** and set a center and range as usual.
- To convert a circle geozone to a polygon, select **Polygon** and draw new corners.
- Clearing all corners of a polygon (**Clear shape**) also reverts it to a circle.

## Choose a cluster and cooldown

A cooldown is a silent period after a push is sent. For a standalone geozone, the same device won't receive another notification from it until the cooldown expires, even if it exits and re-enters. If the geozone belongs to a cluster, the cooldown applies to the whole cluster instead: the device stays silent for every geozone in that cluster, not just the one that sent the push.

In the **Cooldown** field, choose one of three modes:

| Mode | How cooldown is set | Behavior |
|---|---|---|
| **Standalone** | Set days, hours, and minutes directly for this geozone. Minimum is 1 minute. Maximum is 41 days. | Cooldown applies to this geozone only. |
| **Use existing cluster** | Apply the cooldown from an existing [cluster](/product/messaging-channels/push-notifications/geo-campaigns/clusters/). | The cluster cooldown overrides this geozone's own cooldown. |
| **New cluster** | Create a new cluster and set its cooldown. See [Create a cluster](/product/messaging-channels/push-notifications/geo-campaigns/clusters/). | The cluster cooldown overrides this geozone's own cooldown. |

<img src="/push-notifications-geo-based-push-6.webp" alt="Cooldown mode dropdown showing Standalone, Use existing cluster, and New cluster options in Geo campaigns."/>

## Schedule when the campaign can fire

The **Campaign schedule** section limits when entry actions can fire. A push or entry event runs only if the geozone is active at that moment and cooldown allows delivery.

### Limit the campaign to a date range

These fields are optional. Set them when you want the whole campaign to run within a specific date range, for example a holiday promo from September 10 through October 23, or a limited-time store opening.

- **Runs from:** the first day the geozone can fire.
- **Runs until:** the last day the geozone can fire.

<Aside type="note">
- **Both dates are inclusive.** The geozone keeps firing through the end of the **Runs until** day.
- **Weekly schedule.** The date range works together with the daily mode below, not instead of it.
- **Time zone.** **Runs from**, **Runs until**, and weekly hours all use the schedule's time zone, set from your browser's time zone the moment you save the geozone. Save from the time zone you want the campaign to follow, especially if your team works across regions. A brand-new **Always active** geozone has no schedule time zone yet, so its dates are evaluated in UTC until you edit and save it at least once.
</Aside>

<img src="/push-notifications-geo-based-push-schedule-date-range.webp" alt="Campaign schedule Runs from and Runs until fields set to September 10, 2026 and October 23, 2026."/>

### Choose how the geozone runs

Select **Always active** to run around the clock, or **On selected days and hours** to restrict firing to specific time windows per day of the week.

#### Always active

The campaign fires 24/7. No further schedule configuration is needed.

<img src="/push-notifications-geo-based-push-schedule-always-active.webp" alt="Campaign schedule section with Always active mode selected and Runs from and Runs until set to Any date."/>

#### On selected days and hours

The campaign only fires inside the windows you set here:

1. Turn on each weekday you want the campaign to fire on.
2. Set a start and end time for that day.

<img src="/push-notifications-geo-based-push-7.webp" alt="Campaign schedule set to On selected days and hours with Any date range and Monday through Friday 09:00 to 18:00."/>

<Aside type="note">
The control panel supports a single time window per day. If a geozone was configured via API with multiple windows per day, editing the schedule in the form is unavailable. Click **Save** to keep the existing schedule unchanged. To modify it, use the API.
</Aside>

Click **Save** to finish, regardless of which mode you chose. The geozone is enabled immediately. If you set a schedule, pushes fire only during the configured windows.

### Which actions follow the schedule

- **Send push**, **Fire event**, and other actions that fire when a device enters the zone run only during an active schedule window and when cooldown allows delivery.
- **Fire exit event**, **Fire dwell event**, and **Assume exit after silence** follow the visit, not the schedule. If a device entered while the schedule was active, these actions can still fire after the daily window closes.