Postscript
Sync subscribers and events to Postscript for SMS marketing. Zeotap keeps your Postscript subscriber lists, tags, custom properties, and event data in sync with your warehouse.
Prerequisites
- A Postscript account with API access enabled
- A Postscript private API key (starts with
sk_) - At least one keyword configured in Postscript (required for subscriber creation)
Permissions
The Postscript API key must have permissions to:
- Create and update subscribers
- Manage compliance (unsubscribe) operations
- Create custom events
- Read keywords
Authentication
Postscript uses Private API Key authentication.
- Log in to your Postscript account at app.postscript.io
- Navigate to Account > API
- Click Create Security Key Pair
- Copy the Private API Key (starts with
sk_) - Paste it into the Private API Key field in Zeotap
Important: Use the Private API Key, not the Public API Key. The private key is required for all server-side API operations.
Configuration
| Field | Type | Required | Description |
|---|---|---|---|
| Keyword ID | Text | No | The keyword ID to associate new subscribers with. Find this in Postscript under Keywords. |
| Keyword | Text | No | The keyword text (e.g. SIGNUP). Either Keyword ID or Keyword is required for subscriber creation. |
| Origin | Select | No | Source attribution for new subscribers. Options: website, social, other. Default: other. |
Target Settings
| Field | Type | Required | Description |
|---|---|---|---|
| Object Type | Select | Yes | The Postscript object to sync data to. Options: Subscriber, Event. Default: Subscriber. |
Supported Operations
Sync Modes
| Mode | Supported | Description |
|---|---|---|
| Upsert | Yes | Creates new subscribers or updates existing ones |
| Insert | Yes | Creates new subscribers only |
| Update | — | Not supported (use Upsert) |
| Mirror | — | Not supported |
Audience Sync Modes
| Mode | Supported | Description |
|---|---|---|
| Add | Yes | Adds subscribers to Postscript |
| Remove | Yes | Unsubscribes subscribers from Postscript |
| Mirror | — | Not supported |
| Upsert | Yes | Adds subscribers if not already present |
Features
- Field Mapping: Yes
- Schema Introspection: No
Required Mapping Fields
When Object Type = Subscriber
| Field | Description |
|---|---|
phone_number | Subscriber phone number in E.164 format (e.g. +15555555555) |
When Object Type = Event
| Field | Description |
|---|---|
type | The event name that appears in Postscript (e.g. purchase_completed). Accepts letters, digits, and underscores. |
Default Destination Fields
Subscriber fields: phone_number, email, tags, properties, shopify_customer_id
Event fields: type, phone_number, email, subscriber_id, occurred_at, external_id, properties
How It Works
Subscriber Sync
- Zeotap reads rows from your warehouse model
- Each row is sent individually to the Postscript Create Subscriber endpoint (
POST /api/v2/subscribers) - New subscribers receive an opt-in confirmation SMS from Postscript
- The create endpoint is idempotent for existing phone numbers, so upsert mode works natively
- For remove (audience sync), rows are unsubscribed via
PATCH /api/v2/compliance/unsubscribe
Event Sync
- Zeotap reads rows from your warehouse model
- Each row is sent to the Postscript Create Event endpoint (
POST /api/v2/events) - Events are matched to subscribers asynchronously using subscriber_id, phone, or email
- Events can trigger Postscript Flows and automation rules
Batch Processing
Postscript does not provide a bulk API, so rows are sent individually. Zeotap handles:
- Rate limiting: Automatic retry with exponential backoff on 429 responses
- Error handling: Per-row error tracking with detailed failure messages
- Retries: Up to 3 retries per request on transient failures (429, 5xx)
Rate Limits
Postscript enforces a rate limit of 15 requests per second per API key. Zeotap respects this limit and implements exponential backoff when rate limits are hit.
If you receive 429 errors in sync logs, the sync will automatically retry. For large subscriber lists, syncs may take longer due to rate limiting.
Best Practices
- Use E.164 phone format: Always include the country code (e.g.
+15555555555) for reliable subscriber matching - Set up keywords first: Create and configure your keywords in Postscript before running subscriber syncs
- Use tags for segmentation: Map a
tagscolumn to organize subscribers into Postscript segments - Custom properties: Use the
propertiesfield to sync up to 50 custom key-value pairs per subscriber - Event naming: Use consistent, descriptive event names with underscores (e.g.
cart_abandoned,order_placed) - Monitor opt-in rates: Not all created subscribers will confirm opt-in; monitor your Postscript dashboard
Troubleshooting
Invalid API key format
Postscript private API keys must start with sk_. If you see an authentication error, verify you are using the Private API Key (not the Public API Key) from your Postscript account settings.
Missing keyword_id or keyword
When syncing subscribers, you must configure either a Keyword ID or Keyword in the destination settings. Navigate to Keywords in Postscript to find your keyword details.
Subscribers not appearing in Postscript
New subscribers created via the API must confirm their opt-in before becoming active. Check the Pending subscribers list in Postscript. The subscriber will become active after confirming via SMS.
Phone number format errors
Postscript requires valid phone numbers. Use E.164 format (+15555555555) for best results. Numbers without country codes may be rejected.
Rate limit errors (429)
Zeotap automatically retries on rate limit errors with exponential backoff. If syncs are consistently slow, consider reducing the sync frequency or splitting large audiences into smaller batches.
Unsubscribe failing
The unsubscribe endpoint requires either a subscriber_id or phone_number. Ensure at least one of these fields is mapped in your sync configuration.
Events not triggering Flows
Events are matched to subscribers asynchronously. If an event references a subscriber that does not exist in Postscript, the event may be discarded. Ensure subscribers are synced before sending events.
Custom properties exceeding limit
Postscript allows up to 50 custom properties per subscriber. If you map more than 50 property keys, excess properties will be silently dropped by the API.