Skip to content

Contact management and segments

Store contacts with typed custom properties, import them from CSV, and build rule-based segments for targeted email. Subscription topics and RFC 8058 one-click unsubscribe are handled for you.

Contacts with typed properties

Every contact has an email, name, and custom properties you define as text, number, boolean, date, or select. Import from CSV, sync over the API, and export to CSV at any time.

Rule-based segments

Combine up to 50 conditions with AND or OR — contact fields, custom properties, signup date, or engagement such as "opened at least 3 emails in the last 30 days". Rules are evaluated live.

Compliant unsubscribe handling

Subscription topics let contacts opt out of one stream without losing others. Broadcasts always carry RFC 8058 one-click unsubscribe headers for Gmail and Yahoo bulk-sender compliance.

Create a contact

typescript
await poststack.contacts.create({
  email: 'alice@example.com',
  first_name: 'Alice',
  last_name: 'Smith',
  properties: {
    company: 'Acme Inc',
    plan: 'pro',
    signed_up_at: '2026-01-15',
  },
});

Use cases

Newsletter and marketing lists

Import existing contacts from a CSV or sync them over the API, then segment by property or engagement and broadcast to the right subset for every campaign.

Product changelog and release notes

Keep a segment of users on a given plan, or who signed up in the last 90 days, so feature announcements only reach customers who can actually use them.

Lifecycle automation

Pair contacts with workflows to run onboarding sequences and follow-ups: trigger on a new contact, a new subscription, or a custom event from your app, then wait, branch on a condition, and send.

GDPR-friendly consent management

Subscription topics let recipients opt out of one stream (a newsletter) while keeping another (product updates). Signup forms can be embedded on your site to collect consent at the source.

How it works

Contacts are records identified by email address, with first name, last name, an unsubscribed flag, and a `properties` object for anything else. Custom properties are defined once per team with a type — text, number, boolean, date, or select — and values are validated against that type when a contact is created, updated, or imported. Contacts can be created, updated, and deleted through the API, the MCP server, or the dashboard. The dashboard CSV import parses the file in your browser and shows a preview before anything is written; the import then deduplicates by email (case-insensitive) and skips contacts that already exist, and up to 10,000 contacts can be sent in one import request over the API. Segments come in two kinds: static segments you add contacts to explicitly, and rule-based segments defined by up to 50 conditions joined with AND or OR. Conditions can test contact fields, custom properties, creation date, engagement tier, and behavioural counts such as emails opened or clicked within a rolling window, and you can preview who matches before saving. Rule-based segments are evaluated when they are used, so a broadcast always goes to the people who match at send time. Subscription topics implement granular consent: a contact can stay subscribed to `product_updates` while unsubscribing from `newsletter`, and the per-recipient `{{preferences_url}}` lets them manage that themselves. Contact changes emit `contact.created`, `contact.updated`, `contact.deleted`, and `contact.unsubscribed` webhook events you can pipe into a CRM or data warehouse. Before you send, the separate email validation API can check addresses for syntax, MX records, and disposable domains.

Full parameters, limits, and examples are in the Contact management and segments documentation.

Frequently asked questions

Are contacts charged per record?

No. PostStack does not charge per contact. You pay for emails sent, not contacts stored, so a large list that you email rarely costs nothing extra.

Can I import an existing list?

Yes — upload a CSV in the dashboard (you see a preview before anything is written) or send up to 10,000 contacts per request over the API. Imports deduplicate by email and skip contacts that already exist. Unsubscribes and bounces from your old provider belong in the suppression list, which has its own import.

How do unsubscribes work?

Broadcasts always include RFC 8058 one-click unsubscribe headers, and templates can place a visible `{{unsubscribe_url}}` link in the footer. Unsubscribes are processed immediately, recorded on the contact, and emitted as a `contact.unsubscribed` webhook. Subscription topics support granular opt-out per stream.

Can contacts have custom fields?

Yes. Define typed contact properties at the team level (text, number, boolean, date, or select), then set them per contact via the API or dashboard. Use them in segment rules and as template variables.

Can I export my contacts?

Yes. `GET /contacts/export` (or the dashboard export button) returns every contact as CSV, and the list endpoints return JSON with pagination. Your data is yours, and you can leave at any time.

Related features

Ready to start sending?

Free plan includes 3,000 emails/month. No credit card required.