Troubleshooting

This page mentions tools we use ourselves. Some links are affiliate links — if you sign up after clicking through, we earn a small commission, at no extra cost to you. See the full list of tools we use.

Troubleshooting

Image captions show literal HTML on old AI Agents posts

If an older AI Agents post shows its Wikimedia attribution caption as literal HTML — e.g. the caption text reads <a href="https://commons.wikimedia.org/...">Photo by …</a> rather than a clickable link — that’s a v2.14.112 fix at work for new posts. Older posts written before 2.14.112 stored the caption HTML in a form that WordPress later re-escaped, so the link tags display as text. New posts are fine.

To repair the older ones, hit the admin-only REST endpoint:

# Dry-run (default) — reports which posts WOULD be touched, writes nothing
curl -X POST -u USER:APP_PASS https://YOURSITE/wp-json/otts-pro/v1/backfill-broken-captions

# Apply the repair
curl -X POST -u USER:APP_PASS "https://YOURSITE/wp-json/otts-pro/v1/backfill-broken-captions?write=1"

The endpoint scans AI Agents-generated posts, finds figure-caption blocks with escaped <a> tags, unescapes them, and saves. Returns a JSON summary of which post IDs were updated. Safe to run multiple times — already-correct posts are skipped.

Amazon SES sends fail silently

If you’ve picked Amazon SES as your provider and every send dies with a generic “SES send failed — check the SMTP credentials” — and the SMTP credentials are definitely correct — the issue is almost always the AWS region field.

AWS region field — paste the region slug only

The AWS region field expects a region slug like eu-west-1 or us-east-1not the full SMTP host. Pasting the full host (e.g. email-smtp.eu-west-1.amazonaws.com) from elsewhere in the AWS console produces an invalid SMTP target like email-smtp.email-smtp.eu-west-1.amazonaws.com.amazonaws.com which fails DNS resolution. Every send dies at connect time, and the surfaced error is generic.

From OTTS Pro 2.14.120 onwards, the plugin auto-extracts the slug from a pasted host at save time — the field re-renders with the corrected value (e.g. eu-west-1) so you can see visually that something was normalised. On older Pro versions the value stays broken in the database. Upgrade to 2.14.120+ and re-save the provider settings.

Diagnostic endpoint

Admin-only REST endpoint that shows what the SES provider has actually stored:

curl -u USER:APP_PASS https://YOURSITE/wp-json/otts-pro/v1/provider-debug

Returns the raw region value, the normalised region the plugin will actually use, the derived SMTP host, whether the username and password are set, and the most-recent captured send error (with the real PHPMailer message — not the generic line). When troubleshooting send issues, this is the first thing to check.

Other things to verify on the AWS console

  • SES → Verified identities — your domain should show Verified (green), not Pending. SES rejects sends from unverified From: domains regardless of the SMTP credentials being correct.
  • SES → Account dashboard — if your account is still in sandbox, you can only send TO addresses you’ve also verified. Either move to production (one-time request) or add the test recipient as a verified email identity.
  • SES → SMTP settings — the username/password you paste into OTTS must come from Create SMTP credentials on this page, not from regular IAM access keys. SES SMTP passwords are derived from IAM secrets using a specific algorithm; raw access keys won’t authenticate.

Common issues and how to fix them. If your problem isn't here, email us.

Generator returns “Claude API key not configured”

One Two Three Send → Settings → AI — paste your key from console.anthropic.com, save. The placeholder shows •••••• when set; if it shows sk-ant-..., the key field is empty.

Test email never arrives

  • Resend: confirm your sending domain is verified in the Resend dashboard. Unverified domains are blocked. Check the From email matches a verified domain.
  • SMTP: most failures are wrong port or wrong encryption. Try port 587 with TLS, or 465 with SSL. Check your host's firewall allows outbound on those ports.
  • Inspect the One Two Three Send → All Newsletters list — failed sends record the error in wp_otts_sends.error_log.

Signup form returns “invalid_nonce”

You're running an old version. v1.0.4+ replaced the nonce with a honeypot field for cache-safety. Update to the latest free plugin and clear your page cache.

Edit page shows “Sorry, you are not allowed to access this page”

Bug fixed in v1.0.1 — earlier versions hid the edit submenu in a way that broke the page handler on some hosts. Update to the latest free plugin.

Welcome email never arrives for new signups

  • One Two Three Send → Settings → Welcome Email → confirm Send welcome email is on.
  • Confirm an email provider is configured and the test email worked (Settings → Email Provider → Send test email to admin).
  • Subscribe a test email from the public homepage form, not from the admin. Check spam / promotions.

Scheduled sends never fire

WP-Cron only runs when someone visits your site. On low-traffic sites the cron can sit idle for hours. Fix:

  • Set up a real cron in your hosting control panel hitting https://yoursite.com/wp-cron.php?doing_wp_cron every 5 minutes.
  • If you see “Scheduled actions” plugins in your dashboard, they often replace WP-Cron with a more reliable scheduler.

Stripe webhook returns 400 invalid_signature

Almost always a mismatched signing secret. In Stripe → Developers → Webhooks → click your endpoint → Signing secret → reveal and copy the whsec_... string into One Two Three Send → Settings → Payments → Webhook signing secret. Save and resend the failed webhook from Stripe to verify.

Audit FAILs on a draft I want to send

The audit blocks auto-send when there is a FAIL but does not block manual sending. Click Send Now on the edit screen and it goes regardless. Better: address the failing check (subject line empty, malformed link, unresolved {first_name} placeholder) before sending.

Auto Content is generating off-topic articles

Edit the directive — be more specific about your topic categories and voice. The starter directive is intentionally generic. Add a “BANNED CONTENT” section listing things you never want to see (specific words, phrasings, formats). Generate one at a time with Generate now until the output reads right, then turn on the schedule.

Lead-magnet download link returns “Invalid link”

The signing key is derived from your WordPress AUTH_KEY constant. If you rotated AUTH_KEY (security plugins sometimes do this), every previously-issued link is invalidated. Subscribers can click any expired link to receive a fresh one automatically — the auto-refresh handler verifies the email matches an active subscriber before issuing.

“Settings → Payments” tab missing

Payments tab only appears when the pro plugin is active. If you have the pro zip but the tab is missing, check Plugins → Installed and confirm both One Two Three Send and One Two Three Send Pro show as active.

Next: For developers.

Facebook first-comment fails with “(#200) You do not have sufficient permissions”

If a Facebook text post publishes correctly but the follow-up “+ 1st comment” never lands, and the Pro Queue dashboard shows a red banner listing posts with error (#200) You do not have sufficient permissions to perform this action, the page access token is missing the pages_manage_engagement scope. That scope is what Facebook uses to authorize commenting on the page’s own posts; it was added to the OAuth scope list in post plugin 1.6.2 but sites that authorized before that release still hold their old token without it.

Fix: upgrade the free post plugin to 1.6.2+ then go to Newsletter → Settings → Connect to Facebook and reconnect. Facebook will prompt you to approve the additional permission. After reconnecting, retry the post (or wait for the next scheduled one) — the comment will land. The Queue dashboard banner clears on the next page-load once there are no failed first-comments in the last 7 days.

The Pro Queue dashboard (Post Pro 1.8.2+) renders a one-click “Reconnect Facebook” button inside the banner so you can fix it without navigating through the settings tabs.

Banner stuck after reconnect? Post Pro 1.8.3 (paired with free plugin 1.7.2) auto-clears the permission-error rows when you reconnect Facebook — the reconnect now fires a hook that drops the stale meta. Older versions left the rows in place; the workaround was to click Dismiss next to each row (or Dismiss all below the table) once you had verified subsequent posts were commenting cleanly.

Transactional email deliverability

If your password-reset emails, contact-form receipts, or admin notifications go missing or land in spam, the issue is almost always how your host sends mail — not the newsletter plugin. WordPress’s default wp_mail() uses PHP’s sendmail, which most modern inbox providers treat with suspicion. The fix is routing transactional mail through a dedicated service with a clean sending reputation. We use Postmark for this. (Note: Postmark and similar transactional services refuse bulk newsletter sends — pair Postmark for transactional mail with One Two Three Send or a newsletter provider for the actual newsletter blasts.)

Related — bounce + complaint auto-cleanup. Once SES is sending cleanly, configure the SES → SNS → plugin event loop so dead and complaining addresses are auto-marked instead of accumulating and putting your SES reputation at risk. See Amazon SES bounce + complaint auto-cleanup on the Pro plugin docs page.