# Letterhead > Letterhead is a newsletter platform for publishers: write and send email newsletters, curate content into them, > sell and place promotions, manage your audience, automate journeys, and report on what performs. This is its help > center, plus the developer documentation for the Letterhead API. --- # Coming from Sailthru Source: https://docs.tryletterhead.com/api/coming-from-sailthru/ > If you pull reporting out of Sailthru's list, blast, and profile endpoints, this maps each call and field onto the Letterhead API — including the calls that collapse into one and the handful of fields with no equivalent. If you're moving to Letterhead from Sailthru and you have reporting built on its API, this article maps what you're calling today onto the [Letterhead API](https://docs.tryletterhead.com/api/using-the-letterhead-api/), field by field. **What's covered here:** the three reads teams most often depend on — list statistics, per-campaign statistics, and profile data. Sailthru's other APIs, such as those for sending, templates, or purchase events, aren't mapped yet. If you rely on one of those, tell us which and we'll extend this guide. This is about reading data. If you'd rather keep Sailthru as your sending provider for now and use Letterhead only to build newsletters, that's a different setup — see [Create newsletters in Letterhead while sending through your own ESP](https://docs.tryletterhead.com/newsletters/esp-integration/). :::note[Availability] Some of the audience and segment endpoints below may need to be enabled for your account. Contact support if a response comes back empty or unavailable. ::: ## How the concepts line up Most field-level questions answer themselves once the nouns match up. | In Sailthru | In Letterhead | What changes | | --- | --- | --- | | Site | Company | An API key is scoped to a company and covers every newsletter in it. | | List — the newsletter itself | Newsletter (channel) | Identified by a short text slug rather than a numeric ID. | | List — a saved query | Segment | A live query over your audience, not a stored copy of it. Defined once for the whole company. | | Blast | Newsletter edition | Identified by a unique ID rather than a numeric one. | | Profile | Contact | Identified by the email address itself. | ## Two things that change in your code **Most of what you exported, you can now just ask for.** Newsletter and audience statistics are ordinary requests that answer immediately, and bulk contact reads page through results with a cursor, so none of the reporting below needs an export job. If you do want your audience as one file, Letterhead keeps Sailthru's request, poll, and download pattern for that — covered at the end. **Email addresses come back in the clear.** Contact records carry the actual address. If your Sailthru exports request hashed addresses, you can drop the hashing parameter and whatever you do downstream to match those hashes against your own records — Letterhead identifies a contact by the address itself. ## Lists that are newsletters Sailthru needs three calls per list — inventory, last send time, statistics. In Letterhead each of these answers for every newsletter at once. ### Inventory `GET /api/v3/channels` returns every newsletter in your company. Each one carries the slug you'll use everywhere else, its title, and its type. The newsletter's creation date isn't part of this response. ### Last send time There's no "last send" field on a newsletter. Read it from the editions list instead, which covers every newsletter in one request rather than one request per list: ``` GET /api/v3/letters?allChannels=true&orderBy=publicationDate&asc=false ``` Each edition carries its publication date, title, newsletter, unique ID, and status. Add `channels[]=` to narrow to particular newsletters. ### Audience statistics Two endpoints cover what `stat=list` returns, and between them they go further: - `GET /api/v3/metrics/portfolio-health` — the latest snapshot for every newsletter: total subscribers, new subscribers, unsubscribes, net growth, cleaned addresses, and the five engagement groups described below. - `POST /api/v3/metrics/audience` — the same audience over a date range you choose, with a daily series and a comparison against the previous period. Pass `groupBy: "channel"` for a per-newsletter breakdown. | Sailthru statistic | Letterhead | | --- | --- | | `email_count` | `totalSubscribers`, or `totalAudienceMembers` for everyone including unsubscribed | | `active_count` | `activeSubscribers` | | `engaged_count` | `loyalistsCount` plus `newAndEngagedCount` | | `passive_count` | `casualCount` | | `disengaged_count` | `fadingCount`, or `totalDisengaged` if you want the status rather than the behavior | | `dormant_count` | `ghostsCount` | | `new_count` | `newSubscribers` | | `optout_count` | `unsubscribes` for a chosen window, `totalUnsubscribes` for all time | | `hardbounce_count` | Hard-bounced addresses move to a cleaned state, so `totalCleaned` is the newsletter-level figure. Exact bounce counts are per edition — see below. | | `lists_count` | `singleNewsletterCount` is the inverse: subscribers who read only this newsletter. For genuine cross-newsletter membership, use `GET /api/v3/contacts/overlap`. | Two more rollups have no Sailthru equivalent and may save you some assembly: `GET /api/v3/contacts/overview` returns company-wide totals plus how many newsletters are growing, holding steady, or need attention, and `GET /api/v3/contacts/metrics/groups` breaks subscribers down by group and newsletter with growth and health for each. ## Lists that are segments Where a Sailthru list is really a saved query, the equivalent is a segment. Segments are defined once at company level and evaluated live, so "engaged openers" is one segment you ask about per newsletter rather than a query you maintain separately on every list. Add `?channel=` to any read below to scope it to a single newsletter. | What you want | Endpoint | | --- | --- | | The segments that exist, and which newsletters they apply to | `GET /api/v3/contacts/segments` | | One segment, including its live definition | `GET /api/v3/contacts/segments/{segmentId}` | | How many contacts are in it right now | `GET /api/v3/contacts/segments/{segmentId}/count` | | Who's in it, paged | `POST /api/v3/contacts/segments/{segmentId}/preview` | | Its engagement over time | `GET /api/v3/contacts/segments/{segmentId}/engagement-timeline` | | The same figures for your whole audience, as a baseline | `GET /api/v3/contacts/engagement-timeline` | The engagement timelines return, for each day, how many contacts were delivered to, how many opened, how many clicked, and how many bounced, along with the rates those imply. Append `/csv` to either timeline endpoint for the same data as a file. Reading a segment's definition alongside its count is worth doing: it lets you record what a number actually counted, which is something a stored list membership can't tell you later. ### The five engagement groups Letterhead classifies subscribers by how they've engaged with recent editions, without anyone having to define a rule. These groups are the closest equivalent to Sailthru's engagement levels, and you can use them anywhere a segment is accepted. | Group | Who's in it | | --- | --- | | Loyalists | Engaged with (opened or clicked) at least three of the last five editions | | New & Engaged | Joined in the last 30 days and engaging | | Casual | Engages intermittently — also where subscribers sit when a newsletter is too new to judge | | Fading | Engagement declining across recent editions | | Ghosts | Hasn't engaged with (opened or clicked) any of the last ten editions | Counts for these come from `GET /api/v3/metrics/portfolio-health`, which returns them for every newsletter in a single request. `GET /api/v3/contacts/metrics/groups` gives each group as a share of the newsletter's audience, with an up, down, or steady trend. :::caution[One thing to watch] These groups are defined against a single newsletter's recent editions, so when you filter contacts by one of them you must also scope the request to one newsletter. Segments you define yourself have no such restriction and can be read across your whole company. ::: Older accounts may also see a newsletter-level segment list at `/api/v3/audience/segments`. That one exists for setups that send through an outside provider — if you're sending with Letterhead, build against the company-level segment endpoints above. ## Blast statistics This is where the most work disappears. Sailthru makes you list campaigns and then fetch statistics one campaign at a time; Letterhead returns identity and performance in the same rows. `POST /api/v3/letters/metrics` takes a page number, a sort direction, a date range, and an optional list of newsletters. The envelope's total is the number of published editions matching your filter, so paging is straightforward. If you only care about one newsletter, `POST /api/v3/letters/metrics-by-channel` does the same with a single authorization step. | Sailthru field | Letterhead | | --- | --- | | `blasts[].blast_id` | `uniqueId` | | `blasts[].name` | `title` | | `blasts[].list` | `channel`, plus `segmentNames` and `suppressedSegmentNames` when the edition was sent to particular segments | | `blasts[].start_time` | `publicationDate` | | `count` | `accepted`, with `delivered` alongside it | | `open_total` | `opens`, with `opensUnique` and `opensUniqueConfirmed` | | `confirmed_opens` | `opensUniqueConfirmed` | | `beacon` | `prefetchedOpensLegacy` | | `estopens` | `projectedOpenRate` — a rate rather than a count | | `click_total` | `clicks`, with `clicksUnique`, `realClickRate`, and `nhiClicks` | | `hardbounce` | `hardBounces`, with `hardBounceRate` | | `softbounce` | `softBounces`, with `softBounceRate` | | `optout` | `unsubscribed` | | `subject` | `title` is the edition's title. For subject-line performance specifically, use `GET /api/v3/letters/subject-line-performances`. | ### Two counts you may be used to seeing folded together Letterhead separates two populations that most providers mix into their totals, so you can report on real readers if you want to: - `prefetchedOpensLegacy` is opens recorded because a mail app fetched the tracking image on the reader's behalf, rather than because a person opened the message. - `nhiClicks` is clicks from security scanners and other automated systems rather than people. Both are reported separately instead of being rolled into `opens` and `clicks`, so your open and click rates can be computed either way. ### Going further than Sailthru did A few reads have no equivalent in what you're replacing: - `POST /api/v3/metrics` — company-wide totals with a daily series and a previous-period comparison. - `GET /api/v3/letters/{uniqueId}/links` and `GET /api/v3/letters/{uniqueId}/click-links` — per-link click detail for a single edition. - `POST /api/v3/metrics/clicks/topics` and `POST /api/v3/metrics/clicks/topic-share` — clicks grouped by subject, and how much you publish on a subject against how much readers click it. - `GET /api/v3/links` — every link you've sent, deduplicated across editions. - `GET /api/v3/letters/{uniqueId}/opens-by-hour` — the open curve for one edition. ## Profile data Sailthru's request, poll, download, aggregate sequence becomes a single loop. `POST /api/v3/contacts/browse` pages through your audience with a cursor: make the request, use the cursor it returns to ask for the next page, and repeat until it's exhausted. You can filter by newsletter, subscription status, tag, custom field, segment, date added, or an explicit list of addresses, and sort by name, email, status, or date added. `POST /api/v3/contacts/search` is the lighter keyword-and-tag search over the same data. These are the columns most Sailthru profile exports carry. If yours includes something not listed, it's most likely a custom variable, which maps to a custom field. | Sailthru column | Letterhead | | --- | --- | | `Profile Id` | The email address is the identifier; there's no separate profile ID | | `Email Hash` | `email`, unhashed | | `Domain` | Split it from the email address — it isn't stored separately | | `Profile Created Date` | `createdAt` | | `Signup` | Each subscription carries its own `createdAt`, so you get one per newsletter rather than one per profile | | `Engagement` | Not a field on the contact. `GET /api/v3/contacts/{email}/engagement` returns that contact's deliveries, unique opens, unique clicks, bounces, and the rates those imply. For whole cohorts, use the engagement groups above. | | Custom variables such as date of birth, gender, or source | `customFields`, which you can also filter on when browsing | Each contact also carries first and last name, tags, and a list of subscriptions, each with its newsletter, status, and dates. ### Detail you couldn't get before - `GET /api/v3/contacts/{email}` — the full record. - `GET /api/v3/contacts/{email}/activity` — that contact's event history: opens, clicks, bounces with a reason, and more. - `GET /api/v3/contacts/{email}/last-active` — when they last engaged. - `GET /api/v3/contacts/{email}/suppressions` — why they're being held back, if they are. ### If you'd rather have a file `POST /api/v3/contacts/export` takes the same filters as browsing and builds a CSV of every matching contact in the background. It answers straight away with an `exportId`; poll `GET /api/v3/contacts/exports/{exportId}` until the status is `ready`, then download the file from the `downloadUrl` it returns. The link works for 7 days. See [Start a contacts export](https://docs.tryletterhead.com/api/reference/operations/startacontactsexport/) for the details. The file has first and last name, email, your custom fields, tags, and one column per newsletter showing membership. It doesn't include engagement or date-added columns — browse for those. Signed in to Letterhead, you can run the same export from your company's Contacts page, and the link is emailed to you instead. `POST /api/v3/reports/export` emails a clicks, engagement, or growth report across the newsletters and date range you choose — see [Export a report by email](https://docs.tryletterhead.com/api/reference/operations/exportareport/) for the fields each report carries. These are rolled-up figures per edition, per link, or per newsletter, not a row per contact. ## What doesn't carry over | Sailthru field | Where it stands | | --- | --- | | `pv` | Letterhead reports on the email itself, so there's no on-site pageview figure. | | `spam` per campaign | Not returned by the edition statistics endpoint. | | `spam_count` per list | Not available as a per-newsletter figure over the API. The nearest equivalents are each edition's hard and soft bounce rates, and the company-wide spam complaint rate from the operational pulse endpoint. | | `source_count` | Source isn't a built-in dimension. Store it as a custom field, then filter and count on it when browsing contacts. | | `Domain` | Derive it from the email address. | | List creation date | Not part of the newsletter list response. | | Per-list last send time | Derive it from the editions list — one request covers every newsletter. | ## Next steps - [Using the Letterhead API](https://docs.tryletterhead.com/api/using-the-letterhead-api/) — authentication and what you can build - [Generate & manage API keys](https://docs.tryletterhead.com/api/managing-api-keys/) - [Ensuring successful newsletter delivery during ESP migration](https://docs.tryletterhead.com/api/successful-migration/) — the deliverability side of the move: domains, authentication, and warming up your sending - [API reference](https://docs.tryletterhead.com/api/reference/) — the source of truth for request and response formats --- # Curate content in bulk via API Source: https://docs.tryletterhead.com/api/curate-content-in-bulk-via-api/ > Use the API to create many curations in one request, each naming which of your newsletters it should appear on, with a batch size limit and a clear error when a request is too big. ## Overview The [Letterhead API](https://docs.tryletterhead.com/api/using-the-letterhead-api/) lets you push curated content into your account in bulk — many articles in a single request, rather than one call per article. Each curation in the batch names its own URL and which of your newsletters it should appear on. See [Curate in bulk](https://docs.tryletterhead.com/api/reference/operations/curateinbulk/) for the full request and response format. ## Request shape Alongside your API key, send `api: true` and a `curations` array, where each entry accepts the same fields as the single-article [Curate or update content](https://docs.tryletterhead.com/api/reference/operations/curateorupdatecontent/) endpoint: - **`url`** (required) — the article's URL - **`channels`** — the newsletters this curation should appear on, by channel slug. Different curations in the same batch can target different channels. - **`title`** — saved exactly as you send it; this endpoint doesn't fetch the page to generate one - **`excerpt`**, **`tags`**, **`overwriteTags`** — same behavior as the single-curation endpoint Curating a URL you've already curated updates the existing curation instead of creating a duplicate — the same de-duplication the single-curation endpoint uses. ## Batch size limit A single request accepts up to 500 curations. Internally, each curation fans out into one processing job per channel it targets (at least one job even if it names no channels), and the whole request is capped at 1,500 jobs total. So a batch of curations that each target several channels can hit the limit well before 500 curations — 400 curations naming 4 channels each, for example, would need 1,600 jobs, over the cap. If a request would exceed the job limit, Letterhead rejects the whole batch with a `400` response naming the projected job count and the limit, so you know to split the request into smaller batches rather than guessing which curation pushed it over. ## Response Accepted curations are queued for asynchronous processing. A `202` response names how many curations were accepted, plus the total number of processing jobs queued for them — which can be higher than the curation count, since a curation targeting several channels fans out into one job per channel. ## Use cases - Backfilling a library of existing content across several newsletters at once - Publishing one story simultaneously across every newsletter it belongs on - Syncing curated content from an external CMS or feed on a recurring schedule ## Next steps - [API reference](https://docs.tryletterhead.com/api/reference/) — full paths, parameters, and response formats - [Generate & manage API keys](https://docs.tryletterhead.com/api/managing-api-keys/) - [Using the Letterhead API](https://docs.tryletterhead.com/api/using-the-letterhead-api/) --- # Ensuring Successful Newsletter Delivery during ESP Migration Source: https://docs.tryletterhead.com/api/successful-migration/ > New to Letterhead? Please read through this article to know what you can do now to smoothly transition your existing newsletter over to Letterhead. ### **Introduction** Welcome to Letterhead! We're thrilled to have you on board. This guide is designed to help you navigate the migration process from your current Email Service Provider (ESP) to Letterhead, ensuring that your emails continue to reach your subscribers' inboxes. Whether you're new to email newsletters or an experienced sender, this guide will provide you with step-by-step instructions and best practices to maintain high deliverability and avoid common pitfalls. ### **Initial Migration Phase** ### **1. Decide on Subdomain Usage** #### **What is a Subdomain?** A subdomain is a prefix added to your main domain name, creating a separate segment for sending emails, e.g., news.domain.com or email.domain.com. #### **Why Use a Subdomain?** - **De-risking Your Primary Domain:** Using a subdomain for email sending helps protect your primary domain's reputation. If the subdomain encounters deliverability issues, your main domain (used for your website, sales team, etc.) remains unaffected. - **Isolation of Issues:** If another department or an external actor does something malicious, it won't impact the primary domain's reputation. - **Best Practice for Domain Health:** Helps isolate and manage email reputation independently from your main domain. ### **2\. Verify DMARC, DKIM, and SPF Records** #### **What are these?** DMARC (Domain-based Message Authentication, Reporting, and Conformance), DKIM (DomainKeys Identified Mail), and SPF (Sender Policy Framework) are authentication protocols that help protect your email domain from being used in phishing and spam attacks. #### **Verification Process** 1. Use tools like [MXToolbox](https://mxtoolbox.com/) to check if your DMARC, DKIM, and SPF records are correctly set up. 2. Fixing DMARC Policy Not Enabled Error: Follow the guide on [PowerDMARC](http://powerdmarc.com/dmarc-policy-not-enabled/) to resolve this issue. **Important Note for Letterhead Users:** While Letterhead verifies and handles DMARC, DKIM, and SPF on our side as your ESP, you must ensure these records are correctly set up on your domain. If your DMARC, DKIM, or SPF has not been verified yet, you need to make sure it is active. Letterhead can confirm that these records are correct, but keeping them updated is crucial for optimal deliverability. See also [custom sending domain setup](https://docs.tryletterhead.com/settings/sending-domain-configuration/). #### **Health Check** Before migrating, run a health check on your domain to ensure it's not on any spam lists and that it has no inactive subscribers. Clean up your email list to avoid migrating bad emails to the new platform. Use tools like [NeverBounce](https://neverbounce.com/) or [ZeroBounce](https://www.zerobounce.net/) for list verification. ### **3\. Assess Domain Health and Reputation** #### **Why it's Important** A good domain reputation ensures your emails are less likely to be marked as spam. #### **Tools and Methods** - Use tools like [Sender Score](https://senderscore.org/), [BarracudaCentral](https://www.barracudacentral.org/lookups/reputation), or [TrustedSource](https://www.trustedsource.org/) to check your domain reputation. - Learn More About Email Sender Reputation: Check out resources on [Bird.com](https://www.bird.com/resources/email-sender-reputation) and the [M3AAWG Sender Best Common Practices](https://www.m3aawg.org/sites/default/files/document/M3AAWG_Senders_BCP_Ver3-2015-02.pdf). #### **Common Reasons for Poor Reputation** - High bounce rates, spam complaints, sending to inactive emails, or not sending emails for a long time and suddenly resuming. - Automated campaigns with poor engagement. - Different ESPs handle email content differently, which can impact deliverability. #### **Address Issues** Follow recommendations from these tools to improve your domain health. Improvements can take from a few weeks to several months, depending on the severity and consistency of your practices. ### **4\. Check for Blacklists** #### **What are Blacklists?** Blacklists are databases of IP addresses or domains known to send spam. If your domain or IP is listed, your emails are likely to be blocked or marked as spam by many ESPs. #### **How to Check** Use tools like [MXToolbox](https://mxtoolbox.com/blacklists.aspx) or [Spamhaus](https://www.spamhaus.org/lookup/) to see if your domain or IP is blacklisted. #### **Common Scenarios Leading to Blacklisting** - **Accidental:** High bounce rates, spam complaints, or sending to inactive emails. - **Malicious:** If your domain is hacked and used to send spam. #### **Steps to Take if Blacklisted** 1. Follow the removal process specified by the blacklist service. 2. Improve your email practices, such as maintaining a clean list and ensuring high engagement, to avoid future blacklisting. #### **How Often to Check** Check your domain or IP status quarterly or at least once a year. ### **5\. Gradual IP Warming** #### **Explanation** IP warming is the process of gradually increasing the volume of mail sent with a dedicated IP address according to a predetermined schedule. This helps build a good sender reputation with ISPs. Learn More About IP Warming: [SparkPost IP Warm-Up Overview](https://www.sparkpost.com/docs/deliverability/ip-warm-up-overview/). #### **Detailed Strategy** - **Day 1-3: Start Slow** - Send 0.5-1% of your total list per day, starting with 20-50 emails to your most engaged subscribers. - **Day 4-7: Gradually Increase Volume** - Increase to 1-2% of your total list, including some less active but still engaged recipients. - **Week 2: Moderate Increase** - Increase to 5-10% of your total list, including a broader segment of your list. - **Week 3: Higher Volume** - Increase to 10-20% of your total list, focusing on high engagement rates. - **Week 4 and Beyond: Full Send Volume** - Gradually reach your full intended volume, depending on your total list size and engagement levels. #### **Content Strategy** Use high-quality, engaging content that encourages opens and clicks. Examples include personalized messages, special offers, and exclusive content. #### **Special Considerations** - **List Size Consideration:** - For smaller lists (under 10,000 subscribers), start with smaller percentages and shorter warming periods. - For larger lists (over 100,000 subscribers), extend the warming period and use smaller increments. - **Frequency Adjustments:** - If you send weekly or monthly newsletters, increase the volume incrementally per campaign rather than daily. ### **6\. Monitor** Track open rates, click rates, and bounce rates regularly, monitoring any large spikes in percentage changes. ### **Common Issues and Their Causes** ### **Emails Landing in Spam** #### **Why It Happens** - Switching ESPs can temporarily affect email deliverability, though this can often be resolved after a short period of time without any lasting consequences. - Firewalls, spam filters, and past user actions (e.g., marking emails as spam) can cause issues. - Content that includes spammy words or high scrutiny from email clients or AI filtering. #### **Gmail Tabs Check** Use the [Litmus Gmail Category Tab Test](https://www.litmus.com/gmail-category-tab-test) to see which tab your email is likely to land in. #### **Scenario Analysis** - **Few Subscribers (1-2) Reporting Spam:** - Verify the percentage of affected subscribers. - Check if affected subscribers belong to the same email domain. - **Significant Number of Subscribers (3%+) Reporting Spam:** - Immediate steps to take: Verify DNS records, check email content for spam triggers, review recent changes in sending practices. #### **Decision Tree** 1. **Initial Checks:** - Check the volume of spam complaints. - For low volume, send a canned response guiding subscribers to check their spam/junk folders and mark your emails as "Not Spam." 2. **Higher Volume Issues:** - Check your Letterhead dashboard for anomalies. - If there's a large spike (over 2-3%) in blocked or spam reports, contact Letterhead support. - Verify DMARC, DKIM, and SPF records are correctly set up. - Run your email through a spam checker tool to ensure no spammy content or links. 3. **Detailed Checks:** - Look for complaint patterns (e.g., all from Yahoo, Gmail, or a specific domain). - Ensure no major changes in email content or structure might trigger spam filters. 4. **Final Steps:** - If issues persist, suggest subscribers contact their IT department to check for firewalls or other blocking mechanisms. - Consider sending emails through a different email client or a different email address to see if the issue persists. ### **Bounces and Soft Bounces** #### **When to Be Concerned** - Low Bounce Rates (under 2%): Typically normal, no action needed. - Moderate Bounce Rates (2-5%): Monitor and verify list health. - High Bounce Rates (over 5%): Immediate action is required. #### **Decision Tree** 1. Are bounces predominantly soft (temporary issues) or hard (permanent issues)? - Soft Bounces: Check email server status and retry later. - Hard Bounces: Clean your email list of invalid addresses, ensure proper email collection practices. 2. Tools for Analyzing Bounce Reasons: - Use your ESP's reporting tools to get detailed bounce reasons. - Consider third-party tools like [NeverBounce](https://neverbounce.com/) or [ZeroBounce](https://www.zerobounce.net/). ### **Best Practices for All Times** #### **Maintain Clean Email Lists** - Regularly clean and update email lists. - Remove inactive or unengaged subscribers. #### **Content Best Practices** - Craft engaging, non-spammy content. - Avoid common spam triggers. - Resource on Spam Words: [Campaign Monitor's Guide to Spam Words](https://www.campaignmonitor.com/blog/email-marketing/spam-words-to-avoid/) - Specific Spam Words to Avoid: - Examples include: "free," "guarantee," "urgent," "winner," "buy now," "cash bonus," and "click here." #### **Engagement Metrics** - Keep an eye on open rates, click rates, and bounce rates. - Adjust strategies based on these metrics. - Effective Engagement Strategies: - Personalize your emails. - Segment your audience for targeted messaging. - Use compelling subject lines and preheaders. ### **Ongoing Monitoring and Support** #### **Test Sends** - Conduct thorough tests before full-scale sending. - Best practices for test emails: - Send test emails to a variety of email clients (Gmail, Outlook, Yahoo, etc.). - Check for rendering issues and spam filter triggers. #### **Continuous Monitoring** - Use deliverability tools to monitor performance. - Regular checks on domain health and blacklists. - Best Tool for Continuous Monitoring: [Email on Acid](https://www.emailonacid.com/) or [Litmus](https://www.litmus.com/) #### **Contacting Support** How and when to reach out to [Letterhead's support team](https://docs.tryletterhead.com/support/contact-support/) for help: - Reach out if you notice significant drops in open rates, sudden spikes in bounce rates, or consistent deliverability issues. - Prepare information such as recent email campaign details, bounce reports, and any error messages received. ### **Troubleshooting Guide for Letterhead Customers** #### **Scenario: A subscriber reports not receiving your newsletter** 1. Check the subscriber's profile in your newsletter to confirm an active subscription and recent activity (opens, clicks). 2. If the subscriber is active but does not see the newsletter, there may be an issue with the email client's spam filters. Advise them to add your sending address to their contacts and check their spam folder. 3. Check for any unusual spikes in spam complaints or bounces in your recent campaigns. If there are significant increases, investigate further: - Check if your domain has been flagged on any spam lists using tools like [MXToolbox](https://mxtoolbox.com/blacklists.aspx) or [Spamhaus](https://www.spamhaus.org/lookup/). - Use tools like [Email on Acid](https://www.emailonacid.com/) to check if your recent campaigns are triggering spam alerts. - Review your email content for any trigger words, suspicious links, or other issues that could be causing the problem. 4. If you can't resolve the issue, have the subscriber unsubscribe and re-subscribe, confirming their subscription via the confirmation message. 5. If the problem persists, contact Letterhead support, providing details about the affected subscriber(s), campaign(s), and any actions taken to troubleshoot the issue. #### **Scenario: A significant portion of your subscribers are not receiving your newsletters** 1. Check your ESP dashboard for any unusual spikes in bounce rates or spam complaints. If you notice a significant increase (e.g., over 5% bounce rate or 1% spam complaints), investigate further. 2. Verify that your DMARC, DKIM, and SPF records are correctly set up and have not been modified recently. Incorrect or missing authentication records can lead to deliverability issues. 3. Use tools like [MXToolbox](https://mxtoolbox.com/blacklists.aspx) or [Spamhaus](https://www.spamhaus.org/lookup/) to check if your sending domain or IP has been blacklisted. If listed, follow the removal process and take steps to improve your email practices. 4. Analyze your email content using tools like [Email on Acid](https://www.emailonacid.com/) or [Litmus](https://www.litmus.com/) to identify potential spam triggers, such as spammy words, excessive links, or large images. 5. If the issue persists and affects a significant portion of your subscribers, contact Letterhead support, providing details about the affected campaigns, bounce rates, spam complaints, and any actions taken to troubleshoot the issue. #### **Scenario: Open rates have dropped significantly compared to previous campaigns** 1. Verify that your email content is rendering correctly across different email clients and devices. Use tools like [Litmus](https://www.litmus.com/) or [Email on Acid](https://www.emailonacid.com/) to preview your emails and identify any rendering issues. 2. Check if there have been any recent changes to your email design, subject lines, or sending schedule that might have affected engagement. 3. Analyze your subject lines and preheader text to ensure they are compelling and not misleading. Avoid using spammy or clickbait-style subject lines. 4. Consider segmenting your audience based on engagement levels and sending targeted campaigns to re-engage inactive subscribers. 5. If the drop in open rates is substantial and cannot be attributed to any specific changes in your email strategy, contact Letterhead support for further assistance. #### **Scenario: Click-through rates have decreased, but open rates remain stable** 1. Review your email content to ensure that your calls-to-action (CTAs) are clear, prominent, and enticing. Use action-oriented language and make sure your CTAs stand out visually. 2. Check that all links in your email are working correctly and lead to the intended destinations. Broken or misleading links can discourage clicks. 3. Analyze the relevance and value of your email content. Are you providing content that resonates with your subscribers' interests and needs? Consider surveying your audience to gather feedback on the types of content they would like to receive. 4. Experiment with different CTA placement, design, and copy to optimize click-through rates. Use A/B testing to determine which variations perform best. 5. If you have made significant changes to your email content or template and click-through rates have not improved, reach out to Letterhead support for guidance on best practices and optimization strategies. #### **When to Troubleshoot on Your Own vs. When to File a Ticket** - If you notice minor fluctuations in bounce rates, spam complaints, or engagement metrics, the first attempt to troubleshoot the issue using the steps outlined above. - If the issue affects a small number of subscribers (e.g., less than 1% of your list) and you can resolve it by following best practices or making minor adjustments to your email strategy, there is no need to file a ticket. - However, if you experience a significant or sudden increase in bounce rates (over 5%), spam complaints (over 1%), or a drastic drop in engagement metrics that changes in your email practices cannot explain, [contact Letterhead support](https://docs.tryletterhead.com/support/contact-support/) for assistance. - When filing a ticket, provide as much detail as possible, including the affected campaigns, specific metrics (bounce rates, spam complaints, open rates, click-through rates), any error messages, and the steps you have already taken to troubleshoot the issue. This information will help the support team resolve your issue faster. --- # Generate & manage API keys Source: https://docs.tryletterhead.com/api/managing-api-keys/ > Generate API keys from Settings → API Keys to authenticate integrations like Zapier or WordPress. A key is company-level and reaches every newsletter in your account. Treat keys as secret and replace any that stop working. API keys authenticate your requests to the [Letterhead API](https://docs.tryletterhead.com/api/using-the-letterhead-api/). A key is **company-level**: one key reaches every newsletter in your account, which is what integrations like [Zapier](https://docs.tryletterhead.com/integrations/zapier/) use. Generating and managing keys is an admin task — if you don't see the option, ask an administrator. ## Generate an API key 1. Log in to your Letterhead dashboard and go to **Settings → API Keys**. 2. Click **+ Generate new key**. 3. Enter a descriptive name using only letters, numbers, hyphens, and underscores (e.g., "zapier-integration", "wordpress-connection") so you can recognize the key later, and click **Save**. 4. Copy the key and store it securely, then paste it into the integration that needs it. If a key stops working — for example, an integration starts returning API-key errors — return to **Settings → API Keys**, generate a brand new key, and update your integration with the new secret. ## Key security best practices - **Treat API keys as secret** — never commit them to version control or share them. - **Rotate periodically** — generate fresh keys and retire old ones. - **Use different keys for different integrations** — so you can replace one without breaking others. - **Review your key list periodically** — and retire any you no longer use. ## Next steps - [Using the Letterhead API](https://docs.tryletterhead.com/api/using-the-letterhead-api/) - [Connect AI tools to Letterhead via MCP](https://docs.tryletterhead.com/integrations/connect-ai-tools-mcp/) --- # How can I use webhooks with Letterhead? Source: https://docs.tryletterhead.com/api/webhooks/ > Webhooks are automated messages sent from applications, whenever a specific event occurs, and can be used to trigger an event in another app. Webhooks are automated messages — payloads — delivered to a unique URL whenever a specific event occurs in Letterhead. They're generally faster and require less effort than polling for changes, and let you sync Letterhead data with other apps such as CMSes, CRMs, and team chat tools. You can send the following events from Letterhead to another app via webhook: 1. Audience member created or updated 2. Newsletter published 3. Newsletter scheduled 4. Newsletter ready for metrics 5. Promotion campaign created 6. Promotion campaign details updated 7. Promotion campaign promotion changed 8. Promotion campaign status changed "Newsletter ready for metrics" isn't in the event dropdown yet when you create a webhook in the app (see below) — [contact support](https://docs.tryletterhead.com/support/contact-support/) if you'd like it enabled for your account in the meantime. ## When should I use a webhook? Use a webhook to trigger an action in another application based on an event in Letterhead. For example, when an audience member is created or updated, you might want them to receive a separate marketing email from your CRM — or you might notify an advertiser when the latest edition published with their ad. For a comparison with Zapier and the API, see [Connecting anything else](https://docs.tryletterhead.com/integrations/integrations-overview/#connecting-anything-else). ## How do I create a webhook? Webhooks are managed at the **organization** level. 1. Log in and select your **organization** in the left-hand menu (the organization is the top option, above its channels). 2. On the organization page, open **Settings**, then select **Webhooks**. 3. Click **Add new webhook**. 4. In the slide-out, select the **event** you'd like to track. 5. Enter the **endpoint (URL)** — a secure URL where Letterhead will post the payload. 6. Turn on the **Active** toggle — it shows a checkmark when enabled. 7. Click **Create**. You'll see a confirmation when the webhook is created successfully. ## How can I remove a webhook? You can **deactivate** or **delete** any webhook you create: - **Delete** — hover over the webhook row and click the **delete** icon. This permanently deactivates and removes the webhook. - **Deactivate** — click the **Active** toggle so the checkmark clears and the row is grayed out with an 'x'. You can re-enable it later. ## Need help? [Contact support](https://docs.tryletterhead.com/support/contact-support/) if you run into trouble setting up an endpoint. --- # Retrieve newsletter audience overlap data via API Source: https://docs.tryletterhead.com/api/retrieve-newsletter-audience-overlap-data-via-api/ > Use the API to retrieve audience overlap data showing shared subscribers between newsletter pairs and analyze combined reach across multiple newsletters. ## Overview The [Letterhead API](https://docs.tryletterhead.com/api/using-the-letterhead-api/) provides endpoints to analyze how much your newsletters' audiences overlap. This helps you understand subscriber relationships across your publications and measure your combined reach. This data is available over the API only. :::note[Availability] This capability may need to be enabled for your account — contact support if you don't see it. ::: ## What you can retrieve The API provides two types of overlap data: **Pairwise overlap for all newsletters** — see [Get audience overlap across all newsletters](https://docs.tryletterhead.com/api/reference/operations/getaudienceoverlapacrossallnewsletters/): - How many active subscribers each pair of newsletters shares - Each newsletter's own active-subscriber total - Complete view across your entire portfolio **Detailed breakdown for newsletters you choose** — see [Compare audience overlap for selected newsletters](https://docs.tryletterhead.com/api/reference/operations/compareaudienceoverlapforselectednewsletters/): - Combined unique reach across the whole selection - Each newsletter's own total, and how many subscribers are exclusive to it - The shared count for every overlapping group within your selection — each pair, each trio, and so on, not just the people on all of them Pick between two and five newsletters, each one distinct. Counts are active subscribers only, and people are counted once even if they're on several of your newsletters. ## Use cases This data helps you: - Identify which newsletters share the most subscribers - Calculate your true unique reach across multiple publications - Make informed decisions about cross-promotion opportunities - Understand audience segmentation across your portfolio ## Next steps - [API reference](https://docs.tryletterhead.com/api/reference/) — full paths, parameters, and response formats - [Generate & manage API keys](https://docs.tryletterhead.com/api/managing-api-keys/) - [Using the Letterhead API](https://docs.tryletterhead.com/api/using-the-letterhead-api/) --- # Sending your own HTML: what's tracked and what's required Source: https://docs.tryletterhead.com/api/sending-your-own-html/ > Opens and clicks are tracked automatically when you send your own HTML via the API — with limits on which links qualify, you add your own unsubscribe link using the unsubscribe merge tag, and HTML that fails validation or a non-Letterhead channel can get a send rejected. When you [send a letter from your own HTML](https://docs.tryletterhead.com/api/reference/operations/sendaletter/) instead of using the Letterhead composer, tracking still works — you don't add any markup for it — but a few limits on what gets tracked, an unsubscribe link you need to add yourself, and two requirements that can get the request rejected, are easy to miss if you're coming from another ESP. ## What's tracked automatically **Opens** are tracked with no setup on your part. Letterhead doesn't inject a tracking pixel into your HTML — your sending email service provider's own open tracking handles it. **Clicks** are tracked by default too, but only for links that meet two conditions: - **Only `` anchors are tracked.** A bare URL written directly into the HTML body text (not wrapped in an anchor tag) gets no click tracking. - **Links containing a merge tag (`{{ ... }}`) or a data-feed expression (`[[ ... ]]`) are excluded from tracking.** Rewriting one of these hrefs for tracking would corrupt the expression before it's resolved, so Letterhead leaves them alone — the link still works, it just won't appear in your click report. ## You need to add your own unsubscribe link Unlike a letter built in the Letterhead composer, this endpoint never inserts an unsubscribe link into your HTML — include a working one yourself. (Your HTML isn't left completely untouched: as described above, a tracked link's `href` is rewritten. An unsubscribe link is simply never added if it wasn't there.) **Use the `{{ unsubscribe }}` merge tag rather than a URL you build yourself**, and Letterhead fills in the right per-reader link when the letter goes out: ```html Unsubscribe ``` There's a companion tag for linking to the browser version of the letter, `{{ viewinbrowser }}`. Both are resolved at send time, and both are recognized by HTML validation, so neither counts as an unrecognized merge tag below. Capitals and inner spaces don't matter — `{{unsubscribe}}` and `{{ unsubscribe }}` are the same tag. ## What can get a send rejected Two things reject the request outright, before anything is sent: **The channel must send through Letterhead's own delivery system.** If the channel you're sending to is connected to a third-party email service provider instead, the request is rejected — this endpoint only supports Letterhead's native sending path. Create the letter as a draft and send it from the Letterhead dashboard instead if your channel uses a third-party ESP. **The HTML has to pass validation.** The following are rejected: - Forbidden tags: `