LetterPress – E-Mail campaigns, marketing and newsletter Plugin for WordPress
LetterPress – E-Mail campaigns, marketing and newsletter Plugin for WordPress
Description
LetterPress manages newsletter subscribers and campaigns using a resumable sending queue. Configure WordPress mail, Amazon SES, or SMTP as the active delivery provider. Campaign emails use structured content rendered through a server-side email template and include unsubscribe links.
The plugin supports consent-aware subscriber signup with the [letterpress_signup] shortcode, optional double opt-in, CSV import/export, suppression of unsubscribed and complained recipients, campaign scheduling, and SNS event tracking.
Sending limits use a shared rolling window: set the maximum recipient count and interval in seconds. Batch size only limits how many queued emails a worker claims at a time; it does not increase the send rate. Workers run on scheduled WordPress cron events (never once per second), pace recipients within the rolling window, and resume remaining queue work later. Provider quotas, daily limits, network latency, and retries can reduce throughput.
If a worker stops while an email is in flight, delivery may be ambiguous. LetterPress marks that queue item failed instead of retrying it automatically, to avoid sending a duplicate.
Campaigns can optionally override the global From name and email address. Blank campaign fields fall back independently to the defaults in Sender Identity settings. Ensure any campaign sender address is authorized by the configured email provider.
Campaign body text preserves line breaks as spaced paragraphs. Use {{name}} in the body or subject to personalize it with a subscriber’s name; subscribers without a name see “there”. Campaign messages include a visible unsubscribe link and one-click unsubscribe headers, plus a browser-view link when the campaign has a public slug. Configure the organization’s postal address under Settings Sender Identity so it appears in campaign footers. Requirements differ by jurisdiction; plugin features do not by themselves guarantee legal compliance.
Contact US
https://www.themeqx.com/contact-us/
Installation
This section describes how to install the plugin and get it working.
e.g.
- Upload the plugin to
/wp-content/plugins/letterpressor install it through WordPress. - Activate LetterPress. The plugin applies its versioned, non-destructive database upgrade automatically.
- Open LetterPress > Settings, select the provider to use, and configure sender identity and sending limits.
- For SES, configure an AWS IAM key with SES sending permission and
ses:GetAccountfor quota reporting. Verify the sender email/domain in the same AWS region, enable Easy DKIM, and configure SPF, DMARC, and (optionally) a custom MAIL FROM domain in DNS. DNS verification is not performed by LetterPress. - To process SES feedback, configure an SES configuration set with an SNS event destination for delivery, bounce, complaint, and rejection events. Set the matching SNS topic ARN in LetterPress and subscribe the plugin’s displayed HTTPS event endpoint to that topic. Permit SNS HTTPS certificate retrieval as required by WordPress outbound HTTP.
- SMTP requires a reachable mail server and valid host, port, encryption, and credentials. Use the provider connection test before sending.
- Open LetterPress > Cron Setup to copy the exact WordPress cron URL and follow the instructions for cPanel, Plesk, VPS/SSH, Cloudways, RunCloud, Windows Server, or managed hosting. Configure a server scheduler to request the URL every minute; it runs due WordPress events, including LetterPress’s queue worker.
- Add
[letterpress_signup]to a page to display the consent-based signup form. Configure double opt-in in settings if confirmation is required.
Faq
Campaigns use structured fields for title, body, button, secondary content, and footer. The renderer permits sanitized email-safe rich text; arbitrary HTML and scripts are not accepted.
Yes, you can send a test campaign before run, it will be send to mentioned E-Mail at LetterPress settings page
WordPress mail, Amazon SES API, and generic SMTP are supported. Only the selected provider sends mail; settings for the other providers can be retained.
A personalized unsubscribe URL is included in campaign email footers. Campaigns also send List-Unsubscribe headers. Unsubscribed addresses are suppressed from future campaigns.
Administrators manage signup sources under LetterPress > Sources. Every source has a stable machine readable key (lowercase letters, numbers, dashes, underscores), a display name, an optional website URL, and an active/inactive status. Sources created before the registry existed (legacy, public_form, wp_users, import) are seeded automatically. Renaming a source changes only its display name, never the key. At least one source must exist.
Each source can carry its own sender identity: a default From Name, default From Email, and an optional Reply-To Email. When a campaign email goes to a subscriber, the sender headers resolve per subscriber: an explicit campaign-level sender override wins, otherwise the subscriber’s active source identity is used field by field, and any field the source leaves empty falls back to the Sender Identity settings. Campaigns sent to subscribers from different sources therefore carry each source’s own From header. Inactive sources do not contribute a sender identity and are rejected by the subscriber API.
Deleting a source requires reassigning its subscribers: pick an active replacement source on the confirmation screen and all subscribers using the deleted source move to the replacement in a single database update. Sources cannot be deleted while they are the only source, and the API rejects new subscribers while a deletion is in progress.
Generate and revoke keys on the LetterPress > API Keys page. Each key has an administrator label, for example “Website contact form”. The full secret is displayed once right after creation; only a hashed copy and a short prefix (lpk_…) are stored, so save the secret in your integration immediately. Revoking a key stops it from authenticating new requests right away.
Endpoint: GET /wp-json/letterpress/v1/subscribers
Returns subscribed addresses only, newest first. Same Bearer key authentication as the create endpoint. Optional query parameters:
- source: filter by a registered source key; unknown keys are rejected with a list of valid keys.
- per_page: results per request, 10 by default, clamped to 10-100.
- page: result page, 1 by default.
Each item carries id, email, name, status, source, and subscribed_at. The JSON response contains subscribers (the item list), total_subscribers, total_pages, and current_page.
curl "https://example.com/wp-json/letterpress/v1/subscribers?per_page=25&page=2" \
-H "Authorization: Bearer lpk_your_secret_here"
Endpoint: POST /wp-json/letterpress/v1/add-subscriber
Required headers:
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
Request body:
{
"email": "subscriber@example.com",
"name": "Optional Name",
"source": "landing-page"
}
email is required and must be valid. name is optional. source is required and must be the key of an ACTIVE source from the Sources page; unknown, missing, or inactive sources are rejected and the response lists the currently active keys. API requests never create new sources.
Responses:
- 201 Created: subscriber stored. status is “pending” when confirmation is required by your Deliverability or Frontend settings, otherwise “subscribed”. confirmation_email is “failed” when the row was stored but the confirmation message could not be sent.
- 409 Conflict: the address is already subscribed.
- 403 Forbidden: the address is suppressed (hard bounce, complaint) or blocked, and cannot be subscribed.
- 400 Bad Request: invalid email, or missing or unregistered source (with available_sources listing valid keys).
- 401 Unauthorized: missing, malformed, invalid, or revoked API key.
Resubmitting an address that is still pending sends the confirmation email again, matching the public signup form behavior.
Example with cURL:
curl -X POST https://example.com/wp-json/letterpress/v1/add-subscriber \
-H "Authorization: Bearer lpk_your_secret_here" \
-H "Content-Type: application/json" \
-d '{"email":"subscriber@example.com","name":"Jamie Doe","source":"landing-page"}'
Do not send the API key in URL query parameters, and serve the endpoint over HTTPS only.
Reviews
Changelog
2.4.0
- Added subscriber source management (LetterPress > Sources) with safe deletion and subscriber reassignment.
- Sources moved to a dedicated database table with an optional per-source sender identity (From Name, From Email, Reply-To) applied per subscriber when campaigns send.
- Added source filtering on the Subscribers page and an index on the subscriber source column.
- Added the GET /subscribers (list subscribed) and POST /add-subscriber endpoints with Bearer API key authentication (LetterPress > API Keys).
2.2.0
- Reworked sending limits to use a shared, concurrency-safe rolling recipient rate limiter and independently configured worker batch size.
- Added interval-seconds settings with backward-compatible migration from interval minutes.
2.1.2
- Enforced white text on primary actions and refined LetterPress admin typography.
2.1.1
- Refreshed the LetterPress admin dashboard, settings, forms, and tables with a responsive app-style interface.
2.1.0
- Added structured campaign templates, provider settings, subscriber signup/import/export, campaign scheduling, SES quota-aware limits, and SNS event tracking.
- Added versioned, non-destructive database migration and improved credential protection.
1.1.2
- Fixed: autoload class issue for windows OS
1.1.1
- Added :
lp_strip_tags()function to clean campaign HTML body in more elegant way
1.1.0
- Added : html sanitize functions,
- Fixed : email campaigns sanitize message,
- Fixed : several error
- Updated : Sanitized, Cleaned HTML before inserting into the database
- Updated : Decode HTML ocde before it print.
1.0.0
- Initial Release


