
CrescaLooking for an Amazon Pinpoint alternative before October 30, 2026? What stops, what keeps working, how to export your data, and how to move email to Cresca.
AWS ends support for Amazon Pinpoint on October 30, 2026. After that date the Pinpoint console and its engagement features, which are endpoints, segments, campaigns, journeys and analytics, can no longer be used. If you send email campaigns from Pinpoint, you need an Amazon Pinpoint alternative for your contacts, templates and campaigns before the deadline, and you need to export your data while you still can.
This guide explains exactly what stops working, what keeps working, the paths AWS recommends, and a step-by-step plan to move your email to Cresca, with scripts you can copy.
In this guide
AWS's end-of-support notice splits Pinpoint into two halves. The engagement features are retired. Several message-sending APIs keep running. Pinpoint also stopped accepting new customers on May 20, 2025.
| Pinpoint capability | After October 30, 2026 |
|---|---|
| Console, endpoints, segments, campaigns, journeys | No longer accessible |
| Analytics and KPI APIs | Not supported; export historical KPIs before the date |
SendUsersMessages and sending to a stored endpoint ID |
Not supported |
| In-app messaging and recommenders | Not supported |
Email, SMS and voice sending with SendMessages
|
Continues for existing customers only |
| Email, SMS and voice templates | Continue, including create, update and delete |
| Push, push templates, OTP, phone number validation | Continue for all accounts |
| Event delivery to Kinesis or Data Firehose, metrics to CloudWatch | Continue for direct sends |
The short version for email marketers: if you build audiences and send email campaigns or journeys in Pinpoint, that stops on October 30. If you only call SendMessages to send one-off emails from your app, that keeps working for now, but AWS recommends moving it too.
If your Pinpoint use was mostly email marketing, meaning a contact list, a few segments, designed campaigns and maybe a welcome series, neither SES on its own nor a contact-centre platform is a like-for-like replacement. That's the gap an email marketing platform fills as an Amazon Pinpoint alternative.
Do this before anything else, while the console still works. Everything below comes from the AWS offboarding steps.
get-segment, get-campaign and get-journey APIs, or copy them from the console. You'll rebuild them, so screenshots of the important ones help too.list-templates, then fetch each one with get-email-template.get-campaign-date-range-kpi and get-application-date-range-kpi, return up to the past 3 months. Export anything you want to keep for reporting.For example, with the AWS CLI:
# Save every email template
aws pinpoint list-templates --template-type EMAIL > templates.json
aws pinpoint get-email-template --template-name welcome-email > welcome-email.json
# Save a campaign definition and its last 3 months of KPIs
aws pinpoint get-campaign --application-id APP_ID --campaign-id CAMPAIGN_ID > campaign.json
aws pinpoint get-campaign-date-range-kpi --application-id APP_ID --campaign-id CAMPAIGN_ID \
--kpi-name email-open-rate > campaign-kpi.json
| In Pinpoint | In Cresca |
|---|---|
| Email endpoints | Contacts, imported from CSV or added with the contacts API |
| Endpoint and user attributes | Custom fields and tags |
| Segments | Contact lists, built from tags and custom fields |
| Email campaigns | Campaigns: designed by the AI agent, in the design editor or from a template, sent now or scheduled |
| Simple email journeys, such as a welcome series | Automation workflows that send a sequence of emails with delays |
| Email templates | Marketing templates in the design editor; transactional templates with versions for API email |
SendMessages for app email |
The transactional email API: POST /emails
|
| Campaign analytics | Campaign reports: deliveries, bounces, complaints, unsubscribes, plus opt-in opens and clicks |
| Verified email identity on SES | A verified sending domain in Cresca, with its own DKIM and SPF records |
In Cresca, open Sending Domains and add the domain you send from today. Cresca gives you the exact DNS records: an ownership record, three DKIM records and a custom MAIL FROM subdomain with its own SPF record. If your DNS is on Cloudflare, Cresca can add them for you.
Your existing SES records can stay where they are. Cresca only adds new records and never overwrites existing ones, so your Pinpoint sending keeps working while you test. See sending domains for details.
A Pinpoint segment export has one endpoint per line, including SMS and push endpoints, and opted-out addresses. Before importing, keep only email endpoints, leave out anyone who opted out, and remove duplicates. This script does that and writes a CSV you can import:
import csv
import json
def first(values):
"""Pinpoint stores attributes as lists of strings."""
return values[0] if isinstance(values, list) and values else ""
seen = set()
with open("pinpoint-endpoints.json") as src, open("cresca-contacts.csv", "w", newline="") as out:
writer = csv.writer(out)
writer.writerow(["email", "first_name", "last_name", "plan"])
for line in src:
endpoint = json.loads(line)
if endpoint.get("ChannelType") != "EMAIL":
continue
if endpoint.get("OptOut") == "ALL": # opted out: do not import
continue
email = (endpoint.get("Address") or "").strip().lower()
if not email or email in seen:
continue
seen.add(email)
user = endpoint.get("User", {}).get("UserAttributes", {})
attrs = endpoint.get("Attributes", {})
writer.writerow([
email,
first(user.get("FirstName")),
first(user.get("LastName")),
first(attrs.get("Plan")), # any custom attribute you use
])
print(f"{len(seen)} contacts written")
Change the attribute names to the ones your project uses. Anything you used for segmenting, such as plan, country or signup date, is worth keeping as a column.
Opted-out people must stay out of your marketing. Don't import them as contacts. If you want an extra safeguard, add their addresses to your suppression list in Cresca.
Import the CSV in Contacts, map each column to a field or custom field, and add tags that match your old segments. During import, invalid and duplicate addresses are skipped, and addresses that have bounced or complained are kept out.
If you'd rather script it, the contacts API adds up to 1,000 contacts per request to a list, creating the list if needed. It takes an email address and an optional first and last name, so use the CSV import for custom fields.
const response = await fetch('https://api.cresca.xyz/api/v1/contacts', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.CRESCA_API_KEY}`, // full-access key
'Content-Type': 'application/json',
},
body: JSON.stringify({
list_name: 'Migrated from Pinpoint',
contacts: [
{ email: 'ana@example.com', first_name: 'Ana' },
{ email: 'ben@example.com', first_name: 'Ben' },
],
}),
});
console.log((await response.json()).summary); // created, updated, rejected...
Contact imports through the API are limited to 120 requests per 15 minutes, on top of your plan's general rate limit. Check your plan's contact limit on the pricing page before you start.
Go through the segment definitions you saved and rebuild the ones you still use as contact lists, using the tags and custom fields from your import. This is a good moment to drop segments nobody has sent to in months.
Pinpoint templates use Handlebars placeholders such as {{User.UserAttributes.FirstName}}. Replace them with Cresca merge fields for the matching contact fields.
You don't have to copy every old design by hand. Describe the campaign to Cresca's AI agent, such as "Our monthly product update for existing customers, three short sections, plain and friendly", and it designs a complete email using your brand profile. A fact-check pass removes claims your brief didn't make. Then fine-tune it in the design editor, or start from one of 36 templates.
If a journey was a straight email sequence, such as a welcome series of three emails a few days apart, rebuild it as an automation workflow. Journeys that branched across channels or used push and SMS steps don't have a direct equivalent in Cresca; keep the non-email parts on AWS End User Messaging.
Send your first Cresca campaigns to your most engaged contacts, the people who opened or clicked recently, then widen the audience over a week or two. A sudden jump in volume from new sending records can look suspicious to mailbox providers. Our domain warm-up guide covers the schedule. Once the new setup is working, stop the old Pinpoint campaigns.
If your app calls SendMessages for password resets, receipts or verification codes, that keeps working after October 30 for existing customers. But it's a good time to move, and the change is small. With Cresca's transactional email API, one request sends an email from your verified domain:
curl -X POST 'https://api.cresca.xyz/api/v1/emails' \
-H 'Authorization: Bearer cr_live_xxxxxxxxx' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: password-reset/req_8f2a' \
-d '{
"from": "Acme <hello@acme.com>",
"to": "user@example.com",
"subject": "Reset your password",
"html": "<p>Click the link to reset your password. It expires in 1 hour.</p>"
}'
What you get that a bare send API doesn't give you:
{{{VARIABLE}}} values. Editing a draft never changes what your app sends.Idempotency-Key and body within 24 hours returns the original response instead of sending twice.The quickstart takes you from a verified domain to a first email, and the transactional email API guide covers every endpoint with code.
Pinpoint did more than email, so be clear about what moves where:
POST /emails, with an idempotency key.AWS ends support on October 30, 2026. After that, the Pinpoint console and its endpoints, segments, campaigns, journeys and analytics can no longer be used. Pinpoint stopped accepting new customers on May 20, 2025.
Campaigns and journeys stop, because they depend on the retired engagement features. Direct sends through the SendMessages API continue for existing customers, though AWS recommends moving email to SES or another provider for the long term.
It depends on what you used Pinpoint for. For email campaigns, audiences and app email in one place, an email marketing platform such as Cresca replaces the engagement features, adds an AI email designer and keeps transactional email in the same account. For SMS and push, use AWS End User Messaging.
Yes. Add the same domain in Cresca and publish its DNS records next to your existing ones. Cresca never overwrites existing records, so you can run both while you migrate.
Leave them out of your import. An opt-out is still valid after you change platforms, and emailing those people again breaks their trust and, in many countries, the law.
Cresca is free for 30 days with no credit card. Paid plans are $29, $49 or $99 a month, sized by contacts and monthly emails, and every plan includes the transactional email API. See pricing.
Start your migration today: try Cresca free for 30 days, or go straight to the API quickstart if you only need to move transactional email.
Originally published on the Cresca blog.