Search Documentation
Search for a documentation page...
Subscribers API
REST API endpoints for newsletter subscriber management.
List Subscribers
Returns a paginated subscriber list with per-subscriber purchase stats (orderCount, totalSpent, lastOrderAt) for audience segmentation. The sensitive unsubscribe token is never returned.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
limit | number | 50 | Subscribers per page (1-100) |
offset | number | 0 | Subscribers to skip |
status | string | all | Filter by status: all, active, unsubscribed, or bounced. active leaves out both unsubscribed and paused addresses |
query | string | – | Search by email or name |
group | string | – | Only subscribers in this subscriber group (group UUID) |
Response
Each subscriber also carries groups: the subscriber groups it belongs to, as { id, name } objects (an empty array when it is in none).
Paused Addresses
An address is paused when mail can no longer reach it: it hard-bounced, or the person reported a campaign as spam. Campaigns and back-in-stock notifications skip a paused address until a merchant reactivates it from the dashboard. This is separate from unsubscribed, which is the person's own choice.
| Field | Type | Description |
|---|---|---|
suppressedAt | string | null | When the address was paused (ISO 8601), or null if mail can still reach it |
suppressedReason | string | null | Why it was paused: bounce or complaint |
suppressedDetail | string | null | The receiving mail server's own words, when available (e.g. "550 5.1.1 user unknown") |
Pass status=bounced to list only paused addresses:
Create Subscriber
Adds an email address to the store's subscriber list. If the email is already subscribed, returns a 200 with { status: "already_subscribed" } instead of creating a duplicate.
When double opt-in is enabled in your store's newsletter settings (settings.newsletter.doubleOptIn), new subscribers are created with pending: true and receive a confirmation email. The welcome offer is only triggered after the subscriber confirms. If the email already exists and is still pending, the confirmation email is re-sent (at most once per day).
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
email | string | Yes | Subscriber email address |
name | string | No | Subscriber display name |
placement | string | No | Storefront form or page that drove the signup, max 120 chars (e.g. "footer", "hero-banner") |
locale | string | No | The storefront language the form was in, e.g. pl-PL. Must be the store's default or an enabled language (400 otherwise). The confirmation, welcome and reminder emails and the confirm/unsubscribe pages render in it; signing up again in another language updates it |
groupIds | string[] | No | Subscriber groups to add the signup to (max 20). An address that is already subscribed is added to them too; this call never takes anyone out of a group. An id that is not a group of this store returns 400 with unknownGroupIds |
Response (201)
The welcomeOffer.status field indicates whether a welcome email was triggered for this subscriber:
| Status | Description |
|---|---|
"queued" | A welcome offer is configured and the welcome email (with a discount code, or without one in mode "none") has been queued for delivery |
"pending_confirmation" | Double opt-in is enabled; the welcome offer will fire after the subscriber confirms |
"off" | No welcome offer is configured for this store |
Already Subscribed (200)
Import Subscribers
Bulk-adds subscribers – the programmatic equivalent of the dashboard CSV import. Up to 1000 subscribers per request. The mode field controls handling of emails that already exist.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
subscribers | array | Yes | Subscribers to import (1-1000) |
subscribers[].email | string | Yes | Subscriber email address |
subscribers[].name | string | No | Subscriber display name |
subscribers[].location | string | No | Free-text location |
subscribers[].groups | string[] | No | Group names to put this subscriber in (max 20), matched ignoring case. A name that doesn't exist yet creates the group |
mode | string | No | How to handle existing emails: skip (default) or update (refresh name/location) |
groupIds | string[] | No | Existing group ids to add every subscriber in the request to (max 20). An id that is not a group of this store returns 400 with unknownGroupIds |
Group memberships are added for newly imported subscribers and, in update mode, for ones that already existed. In skip mode an existing subscriber's groups are left alone. Import never removes anyone from a group.
Response (200)
groupsCreated is how many groups the request's groups names created.
A 403 is returned with { error, limit, count } when the subscriber limit for your plan is reached.
Update Subscriber
Edits one subscriber. Send at least one field.
| Field | Type | Description |
|---|---|---|
name | string | null | Display name. null or "" clears it |
location | string | null | Free-text location. null or "" clears it |
placement | string | null | Where the signup came from. null or "" clears it |
unsubscribed | boolean | true opts the subscriber out, false puts them back on the list. Only set it when the person asked. Not allowed for back-in-stock watchers (409) |
groupIds | string[] | The subscriber's groups as the complete list: groups left out are removed, [] removes every group. Omit it to leave groups unchanged. An id that is not a group of this store returns 400 with unknownGroupIds |
Returns the updated subscriber, including groups. To add or remove one group for many subscribers at once, use the group members endpoints instead.
Delete Subscriber
Unsubscribes an email address.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
email | string | Yes | Email to unsubscribe |
Response
Subscriber Groups
Groups are labels a merchant puts on subscribers, such as VIP or Wholesale. A subscriber can be in any number of groups, and a newsletter can send to some groups and leave others out with groupFilter. Group names are unique per store, ignoring case.
A group object:
| Field | Type | Description |
|---|---|---|
memberCount | number | Every subscriber in the group |
activeCount | number | Members a campaign would reach today: subscribed, confirmed and not paused. Unsubscribed, pending and paused members – and back-in-stock watchers (source: "restock"), which are never mailed campaigns – stay in the group but are not counted here |
List Groups
Returns every group of the store, ordered by name.
Create Group
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Group name, 1-80 characters |
description | string | null | No | Up to 500 characters |
Returns the new group with 201. A name the store already uses (in any letter case) returns 409.
Get Group
Returns one group with its counts, or 404 with { "error": "Subscriber group not found" }.
Update Group
Renames a group or changes its description. Send at least one of name and description; pass "description": null to clear it. Returns the updated group, 404 for an unknown id, or 409 when the new name is taken.
Delete Group
Deletes the group and its memberships. The subscribers themselves are not touched. Returns { "ok": true, "deleted": 1 }, or 404.
A newsletter that still names a deleted group in groupFilter never reaches more people because of it: an included group that no longer exists matches nobody, and an excluded one excludes nobody.
Add Members
Adds subscribers to the group, by id, by email, or both. Up to 1000 subscribers per request. Subscribers already in the group are left as they are.
| Field | Type | Required | Description |
|---|---|---|---|
subscriberIds | string[] | One of the two | Subscriber UUIDs. Ids that are not subscribers of this store are ignored |
emails | string[] | One of the two | Subscriber email addresses, matched ignoring case. Addresses with no subscriber come back in unknownEmails |
added counts new memberships only, so it can be lower than the number of subscribers sent.
Remove Members
Takes the same body as Add Members and takes those subscribers out of the group. Responds with { groupId, removed, unknownEmails }.