---
title: "Preset groups — domains, IP ranges, app packages"
description: "Build reusable domain, IP-range and app-package lists in the admin area, then target a whole list with one rule — with the real upload, deduplication and propagation behaviour."
type: "howto"
audience: [network-manager, admin]
keywords: [preset domains, preset IP ranges, preset app packages, upload list, deduplication, targeting groups, DMCA]
ui_path: "Admin → Targeting presets → Preset domain group management / Preset IP ranges group management / Preset application package group management"
---

Fetch the complete documentation index at: https://epom.com/ad-server/docs/llms.txt. Use this file to discover all available pages before exploring further. Append .md to any documentation page URL to get its markdown version.

# Preset groups — domains, IP ranges, app packages

When a rule needs hundreds of values — a domain blocklist, a data-centre IP list, an app
allowlist — adding them one at a time is impractical. A **preset group** is a named list an
administrator maintains once in the admin area; any advertiser, campaign, banner, site, zone or
placement then targets the whole list with a single **Preset Domains**, **Preset IP Ranges** or
**Preset App Packages** rule.

A rule stores only a **reference** to the group, not a copy of its contents, so editing the list
changes what every rule that points at it does. That propagation is not instant: the ad servers
reload preset groups on a ten-minute cycle, and one way of emptying a group does not propagate at
all — see *Corner cases* before you rely on either.

## Who this is for

- **Maintaining groups** — administrators only. Each of the three admin pages is gated by an
  admin-area permission of the same name, assigned per admin role in
  **Admin → Users & access → Admin roles & permissions**; without it the page is missing from the
  nav and returns HTTP 403. Account users never reach the admin area.
- **Using groups in targeting** — an account user picks a group from the **Preset Domains**,
  **Preset IP Ranges** or **Preset App Packages** dimension of a Targeting or Pre-targeting card.
  Most of those dimensions are off for the default account roles, so expect to ask for the one you
  need; see [Per-role notes](#per-role-notes).

## Prerequisites

- An administrator account, to create or edit groups — the group pages are in the admin area.
- At least one group already saved, before anyone can reference it in a rule — the picker in the
  Targeting card lists exactly what exists and nothing else.
- **Targeting** (or **Pre-targeting**) switched on for the entity you want to add the rule to.
- For bulk import: a plain-text or CSV file, one value per line. Lines are read as CSV with a
  comma delimiter and **only the first column is used**, so `example.com,notes,2026` imports
  `example.com`.

## Steps — create and fill a group

1. Go to **Admin → Targeting presets → Preset domain group management** (or the *Preset IP ranges*
   / *Preset application package* variant — all three pages behave identically apart from the
   entry shape).
2. Create the group: press **Add** above the grid, enter a **Title**, then **Save**. A *Done* toast
   appears and the page reloads with the group's id in the URL, which is what makes the entries
   grid below appear. The title is all account users see in the targeting picker — never the
   entries — so name it for what it is: "Data-centre IPs", "Gambling domains".
   ![Preset domain group edit page: Title, entries toolbar and the domains grid, with the admin nav visible](https://epom.com/docs-images/ad-server/presets/preset-group-edit.webp)
3. Add entries one at a time: type the value in the field next to **Add** and press **Add**
   (Enter submits too). IP-range groups have a **From** and a **To** field instead of one value.
   ![Preset IP ranges group edit page with the From and To entry fields and a two-column ranges grid](https://epom.com/docs-images/ad-server/presets/preset-ip-range-entries.webp)
4. Or import in bulk — this is a **two-step** control, not a single button:
   1. Pick the file: click the **Click to upload** dropzone, or drag the file onto it. The
      dropzone then shows the file name and an ✕ to unpick it. The file dialog filters to
      `.txt` and `.csv`.
   2. Press **Upload**. An *Uploaded N record(s)* toast reports how many rows were actually
      written; any lines that failed validation come back in a second toast as
      `Invalid resource <value>`.
5. Manage what is there:
   - **Search** filters the grid server-side as you type (domain and app-package groups only).
   - Tick rows and press **Delete** — it asks *Delete N record(s)?* first.
   - **Clear** empties the whole group after confirming *Remove all entries?*.
   - The pager below the grid pages through long lists; entries cannot be edited in place, so
     correcting a value means deleting it and adding it again.
6. **Move a whole group to another network with Export and Import.** On the list page select one
   group row and press **Export** — the server sends that group's entries as a CSV it names after
   the group. On the destination network press **Import** and pick the file. The import always
   creates a *new* group, titled after the file name with its extension dropped; it never merges
   into a group that is already there, and it refuses a file whose name matches an existing group
   ("A group named X already exists") — rename the file to bring in a second copy. A file that
   cannot be read is reported on the file field, and nothing is created.

## Steps — use a group in targeting

1. Open the entity's **Targeting** card (or **Pre-targeting** on site, zone and placement) and make
   sure its switch is on.
2. In the dimension list on the left, under the **Presets** heading, choose **Preset Domains**,
   **Preset IP Ranges** or **Preset App Packages**.
3. Pick a group from the dropdown. It is a searchable **single-select**: one rule references
   exactly one group, and **Include** and **Exclude** stay disabled until you pick one.
   ![Preset Domains selected in the Targeting card with the group picker](https://epom.com/docs-images/ad-server/presets/preset-in-targeting.webp)
4. Click **Include** or **Exclude**. The saved rule appears on the right as a chip labelled with
   the group's title.
5. To reference several groups, add one rule per group. Multiple Include rules of the same
   dimension are OR-ed at serve time — traffic matching any one of the groups passes.

## Options and fields

### The three group kinds

| Group kind | Admin page | Entry shape | A valid entry is… |
|---|---|---|---|
| Preset domains | Preset domain group management | One domain per line (`news.example.com`) | A syntactically valid domain name, **or** a public suffix from the Mozilla Public Suffix List (so `com` and `co.uk` are accepted as whole-TLD entries). Stored value max 128 characters. |
| Preset IP ranges | Preset IP ranges group management | `from-to` per line (`10.0.0.1-10.0.0.255`); the manual form has separate **From** and **To** fields | Two addresses separated by a hyphen, both valid, `from` ≤ `to`. IPv4 and IPv6 both work. **CIDR is not accepted** — `10.0.0.0/24` fails, write it as a from–to pair. A line with anything other than exactly one hyphen is rejected. |
| Preset app packages | Preset application package group management | One bundle id per line (`com.example.app`) | A dotted Java-identifier-style name: each dot-separated segment must start with a letter, `_` or `$` and contain only letters, digits, `_` or `$`. Hyphens and spaces are rejected. Stored value max 128 characters. |

### Entries toolbar

| Control | What it does | Notes |
|---|---|---|
| **Search** | Server-side "contains" filter on the entry value | Domain and app-package groups only; the IP-ranges grid has none |
| Value field / **From** + **To** | The value to add manually | One field for domains and packages, a pair for IP ranges |
| **Add** | Adds one entry | Disabled until the field(s) are filled; Enter submits |
| **Click to upload** | Picks a file for bulk import — click or drag & drop | Only stages the file; nothing is imported yet |
| **Upload** | Imports the staged file | Disabled until a file is staged. **Appends** — never replaces |
| **Delete** | Removes the ticked rows | Disabled with nothing selected; confirms first |
| **Clear** | Removes every entry in the group | Disabled on an empty group; confirms first. See the corner case below — this one does not reach ad serving |
| Refresh / pager | Re-reads the grid; pages through entries | Default page size 25 |

### What an entry matches at serve time

| Kind | Compared against | Matching rule |
|---|---|---|
| Preset domains | The request's referrer domain, taken in turn from the `rd` parameter, the `Referer` header, the request-URL parameter, the request URL itself and the `Origin` parameter | Case-insensitive, and matches on **label suffixes**: an entry `example.com` also matches `news.example.com` and `a.b.example.com`. An entry that is a bare TLD (`com`) therefore matches every `.com` domain |
| Preset IP ranges | The client IP address | Inclusive of both bounds; overlapping ranges in one group are merged; IPv4 and IPv6 |
| Preset app packages | The app bundle id on the request | Case-insensitive, and matches on **dotted prefixes**: an entry `com.example` also matches `com.example.app` and `com.example.app.free` |

## Corner cases and gotchas

> **Corner case:** changes take up to ten minutes to affect delivery. The ad servers pick up
> changed preset groups every 10 minutes by default. Add a domain and check the log a minute later
> and you will see the old behaviour — that is the refresh delay, not a lost save.

> **Corner case:** **Export** stays disabled until exactly one group row is selected — it exports
> the entries of the selected group, not the list of groups.

> **Corner case — duplicates are dropped quietly.** Values already in the group, and repeats
> within the file, are both skipped: the entries are collected into a set before they are written,
> so the *Uploaded N record(s)* toast counts only what was actually added. The server does return a
> `skipped_duplicates` count alongside it, but the page does not display it — a total lower than the
> line count of your file is the only signal you get. Re-uploading the same file is therefore safe.

> **Corner case — to stop a preset rule, delete the rule, not the group's contents.** Emptying a
> group with **Clear** does not stop the ad servers enforcing the entries it held. To stop a preset
> rule taking effect, delete the *rule* on the entity.

> **Corner case:** an **empty group never matches anything** — including a brand-new group you have
> not filled yet. An Include rule on an empty group therefore blocks all delivery for that entity
> on that dimension, while an Exclude rule on one quietly excludes nothing. Fill the group before
> you point rules at it.

> **Corner case:** uploads **append**. There is no "replace the list" upload — to swap a list out,
> **Clear** first (accepting the propagation problem above) or delete the group and build a new one.

> **Corner case — deduplication is exact-string, and case is where it leaks.** Within one file,
> repeated identical lines collapse; against the group, values already stored are skipped. Both
> comparisons are case-sensitive, but a group cannot hold two values that differ only in case —
> so uploading `Example.com` into a group that already holds `example.com` fails instead of being
> skipped. Normalise case in your source file.

> **Corner case:** the *Uploaded N record(s)* toast counts only what was written. Duplicates that
> were skipped are not reported anywhere in the UI, so a file of 500 domains landing on an existing
> group can legitimately report `Uploaded 3 record(s)`.

> **Corner case:** invalid lines never abort an upload. The valid remainder is saved and each bad
> line comes back as `Invalid resource <value>` in a separate toast. Read that toast on a large
> import — it is the only place the rejections are shown.

> **Corner case:** adding a value manually that the group already holds reports *Done* and adds
> nothing — no duplicate row, and no message telling you it was already there. Search for the value
> first if you need to know.

> **Corner case — the Google DMCA import replaces the group.** On the domain page only, a file
> named exactly `google-websearch-copyright-removals.zip` is parsed as Google's copyright-removals
> export instead of a plain list: it reads `google-websearch-copyright-removals/domains.csv` from
> inside the archive, **deletes every existing entry in the group**, and then imports only the
> domains with at least **100** URLs removed. Point it at a dedicated group. Because the file
> dialog filters to `.txt`/`.csv`, drag the `.zip` onto the dropzone rather than clicking it.

> **Corner case:** deleting a group does **not** delete the rules that reference it. Those rules
> survive with a dangling reference — the chip in the Targeting card renders as `-`, an Include
> rule then never matches (the entity stops serving on that dimension) and an Exclude rule stops
> excluding. Find and remove the rules yourself before deleting a group.

> **Corner case:** a preset dimension your role cannot use is simply not listed — there is no
> greyed-out entry. If **Preset Domains** is missing, have your role checked. Once a dimension is
> listed, its picker shows every group of that kind, so an empty picker means no group exists yet.

> **Corner case:** nothing stops two groups sharing a title, and the targeting picker shows only
> titles. Two groups called "Blocklist" are indistinguishable to the account user choosing one.

## Over the API

Group CRUD, entry add and delete, and the file uploads exist for all three kinds under
`/rest-api/preset-domain/…`, `/rest-api/preset-app-package/…` and `/rest-api/preset-ip-ranges/…` —
the verbs, parameters and curl examples are in
[Targeting, capping and limits over the API](https://epom.com/ad-server/docs/api/targeting-capping-limits.md). The
domain and IP-range endpoints check the *Preset Domains Group* permission, and the app-package
endpoints check *Preset App Packages Group*. Neither is one of the three admin-area page
permissions above, so an API client needs them granted separately.

## Per-role notes

- **Advertiser** — **Preset IP Ranges** and **Preset App Packages** are in your Targeting card;
  **Preset Domains** is not.
- **Network manager** — the preset dimensions are off on both sides as shipped; ask your
  administrator for the one you need.
- **Publisher** — no Pre-targeting card, so no preset dimension on the supply side.
- **Shared-entity viewer** — on a **Can View** share, saved preset rules are read-only.

## Related

- [Targeting and pre-targeting overview](https://epom.com/ad-server/docs/guides/targeting.md)
- [Add, edit, and remove targeting rules](https://epom.com/ad-server/docs/guides/targeting/add-targeting.md)
- [Targeting dimension reference](https://epom.com/ad-server/docs/reference/targeting-dimensions.md)
- [Brand-safety controls](https://epom.com/ad-server/docs/use-cases/brand-safety-controls.md)