Skip to content

fix(website): correct Resend, Brevo, Postmark and Mailgun facts; SES pricing for the calculator's markdown - #252

Merged
stewartjarod merged 28 commits into
mainfrom
advisor/027-website-facts
Nov 4, 2026
Merged

stewartjarod merged 28 commits into
mainfrom
advisor/027-website-facts

Conversation

@stewartjarod

Copy link
Copy Markdown
Contributor

Summary

wraps.dev made claims about Resend, Brevo, Postmark and Mailgun that their own pricing pages and docs no longer support. Each corrected claim was checked against the vendor's page on 2026-11-03.

 Resend rate limit
-  2 requests per second, on every tier
+  10 requests per second per team, the same on every self-serve plan (Free, Pro, Scale),
+  raised for trusted senders; Batch API = up to 100 emails in one request (counts as one)
 Resend regions / inbound / overage / SSO
-  no region choice; no inbound; overage $0.65-0.90, bills automatically
+  4 sending regions (account data stays in the US); inbound on every plan;
+  overage $0.90 down to $0.46, only once "Transactional Overages" is on; SSO is a $150/mo Scale add-on
 Brevo
-  "Business" tier; Starter ~$69 at 100K; a dormant list is free
+  "Standard"; Starter ~$82 at 100K; free within each volume tier's contact limit; logo removal = Standard or a $12/mo Starter add-on
 Postmark (cost blogs)
-  10K tier + overage at 100K
+  volume tiers read off the pricing slider (Basic $115 / Pro $125.50 / Platform $126 at 100K)
 Mailgun
-  "a year of logs"
+  5 days on Foundation, 30 on Scale

Plus three code changes:

lib/ses-calculator-markdown.ts   /tools/ses-calculator.md now serves SES pricing (was the Wraps plans doc),
                                 generated from lib/ses-cost.ts (sesBandRate, sesMonthlyTotal, SES_FREE_TIER_ANSWER
                                 now shared with the page; the page renders the same numbers)
components/json-ld.tsx           serializeJsonLd escapes < > & U+2028 U+2029 (defence in depth; React 19 already
                                 rewrites </script)
config/search-intent.ts          regenerated, so `versus:generate` is a no-op on main again

Evidence

  • Before: rg -in "2 ?(rps|req|requests? per second)" apps/website matched Resend claims in versus.ts, alternatives.ts, search-intent.ts, migrate/resend and compare/resend-vs-wraps. pnpm --filter wraps-website versus:generate on a clean main rewrote the /versus/amazon-ses-vs-resend block. An agent asking for /tools/ses-calculator.md got Wraps pricing.
    After: no Resend "2 rps" line left; versus:generate and sitemap:dates leave git status clean; the new pricing-agent-surface test (calculator markdown carries the SES per-1,000 rate from ses-cost.ts) fails on main and passes here; the new json-ld tests fail against main's component.
  • pnpm --filter wraps-website typecheck, test (1455/1455) and build pass on the head commit. In the build output, all 1139 JSON-LD blocks across 334 pages parse.
  • Four gate-review rounds (opus); the last round's six one-sentence findings are applied in the round-4 commit.

Merge Danger

Door: two-way. Copy, config data, one serializer and one markdown route; revert is clean.

Blast Radius: copy. The /versus/* and /alternatives/* pages, two cost blog posts, /compare/resend-vs-wraps, /migrate/resend, /tools/ses-calculator.md and every page's inline JSON-LD (escaping only; data unchanged). Some secondaryQueries changed to drop the stale number, so those pages target slightly different searches.

Merge by rebase from a local checkout, not GitHub's squash or rebase button: the commits are signed, and sitemap.test.ts checks page-dates.ts against commit dates, which a GitHub rewrite would invalidate. Known leftovers (other unverified competitor claims, next/script breadcrumb JSON-LD, lastmod for config-driven pages) are tracked for a follow-up.

🤖 Generated with Claude Code

https://claude.ai/code/session_01GxJAQPhLCuY6ku8FwL8qCq

stewartjarod and others added 26 commits November 3, 2026 19:11
…er name

Resend's API default is 10 requests per second per team on every plan,
raisable for trusted senders on request, not 2 per second that no plan lifts
(resend.com/docs/api-reference/rate-limit). Resend sends from four regions
(resend.com/docs/dashboard/domains/regions) while account data stays in the
US, so the 'no region choice' points now say that instead. Brevo's public
tier is Standard, not Business (brevo.com/pricing, brevo.com/pricing.md);
Starter's 100K price is also corrected.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQPhLCuY6ku8FwL8qCq
…nt on main

The committed /versus/amazon-ses-vs-resend rationale was stale: versus.ts
already carried the Forge MTA wording and search-intent.ts had not been
regenerated from it.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQPhLCuY6ku8FwL8qCq
The calculator's agent markdown was the Wraps plans doc. It now describes
Amazon SES pricing (plans, band rates, monthly cost by volume, free tier,
estimator) rendered from lib/ses-cost.ts, and links to /pricing.md for
Wraps' own plans.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQPhLCuY6ku8FwL8qCq
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQPhLCuY6ku8FwL8qCq
JsonLd rendered JSON.stringify(data) raw inside the script tag, so a
`</script>` in any JSON-LD string would end it. The serialized text now
writes those characters as \u escapes; JSON.parse reads back the same data.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQPhLCuY6ku8FwL8qCq
…e constants as the page

SES_PLAN_INCLUDES, SES_VOLUME_BANDS and SES_EXAMPLE_VOLUMES move into
lib/ses-cost.ts and both the page and the markdown import them, so the
'What it adds' column no longer disagrees with the page.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQPhLCuY6ku8FwL8qCq
…us.ts

Covers the consB line that said Resend has no named region, the mailersend
FAQ that omitted that Resend account data stays in the US, a missed 'two API
calls a second', and a Mailgun pick line that no longer followed.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQPhLCuY6ku8FwL8qCq
…, overage, inbound, batches)

Brevo prices cut to the readings on brevo.com/pricing (Starter from $9, Standard
from $18). Resend: a self-serve-plans qualifier for the rate limit (Enterprise has
its own), the Batch API (100 emails per request, one request) in place of the
2 rps-sized superlatives, the 10k flash-sale scenario scaled honestly, overage
$0.90 down to $0.46 with pay-as-you-go opt-in, inbound emails included on every
plan, a missed 'named region' line, Brevo logo add-on wording, and distinct
secondary queries per route. Sources: resend.com/pricing.md, resend.com/docs/api-reference/rate-limit.md,
brevo.com/pricing.md.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQPhLCuY6ku8FwL8qCq
React 19 already rewrites </script in script text; the serializer is defence in
depth for <!--, >, & and U+2028/9. The new assertions fail on the old component.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQPhLCuY6ku8FwL8qCq
…between the calculator page and its markdown

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQPhLCuY6ku8FwL8qCq
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQPhLCuY6ku8FwL8qCq
Resend inbound is on every plan, so the sentences that assumed none are
rewritten around route matching on recipient, sender or header. SSO is a
$150/mo Scale add-on (included on Enterprise), the blog's 100K sender pays
$0.90 overage, Brevo's logo add-on and 'double' wording are corrected, the rate
limit is qualified to self-serve plans everywhere, batch wording follows
Resend's docs (up to 100 emails in a single API call, no attachments yet),
and the /versus/resend-vs-sendgrid secondary query matches its FAQ.
Sources: resend.com/pricing.md, resend.com/docs/api-reference/emails/send-batch-emails.md,
brevo.com/pricing.md.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQPhLCuY6ku8FwL8qCq
…, free-tier heading)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQPhLCuY6ku8FwL8qCq
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQPhLCuY6ku8FwL8qCq
…the cost blogs

The 30K-fewer table priced every row as pure overage. On a 100K tier the
30K are included volume (Resend saves $0), and Postmark now sells each plan
in volume tiers (50K and 125K), so the 100K totals, the Basic-vs-Platform
inversion and the spreads change. The Mailgun Foundation row is dropped:
its overage is only published as "from $1.30" and no stop sits between 50K
and 100K.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQPhLCuY6ku8FwL8qCq
- Resend marketing contacts: "from $40/mo for 5,000", and "in contact
  tiers" wherever the copy implied a flat per-block rate (the tiers are
  not linear).
- Mailgun log search: the real retention (5 days Foundation, 30 Scale),
  not "a year".
- Brevo dormant lists: the volume tier's contact limit caveat on every
  "free to keep" sibling on the Brevo pages and alternatives cards.
- Brevo logo removal: Standard or Starter's paid add-on.
- Resend rate limit: "self-serve" wherever every plan/tier was claimed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQPhLCuY6ku8FwL8qCq
- Brevo free allowance: cut the unsourced daily-cap clause.
- Resend batch: "up to 100 emails in a single API call", Resend's own
  wording, wherever the copy said several/multiple recipients per call.
- mailgun-vs-resend: re-angle the bulk rate-limit query to batch size so
  it no longer targets the resend-vs-sendgrid intent.
- Calculator markdown: what the dearer SES plans buy is read from
  SES_PLAN_INCLUDES, not retyped (managed IPs and validations are Pro).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQPhLCuY6ku8FwL8qCq
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQPhLCuY6ku8FwL8qCq
…12.6x

Resend's Enterprise card lists "Enterprise rate limits", so the lines that
said no plan raises the default now say no self-serve plan. The blog index
card for the cost post still quoted the old 17x spread.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQPhLCuY6ku8FwL8qCq
…revo Starter at 100K, Mailgun log window, Brevo contact-limit caveats

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQPhLCuY6ku8FwL8qCq
@vercel

vercel Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
wraps-website Ready Ready Preview Nov 4, 2026 3:31am UTC
1 Skipped Deployment
Project Deployment Actions Updated
wraps-web Skipped Skipped Nov 4, 2026 3:31am UTC

Request Review

stewartjarod and others added 2 commits November 3, 2026 20:29
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQPhLCuY6ku8FwL8qCq
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GxJAQPhLCuY6ku8FwL8qCq
@vercel
vercel Bot temporarily deployed to Preview – wraps-web November 4, 2026 03:30 Inactive
@stewartjarod
stewartjarod merged commit de48893 into main Nov 4, 2026
30 of 32 checks passed
@stewartjarod
stewartjarod deleted the advisor/027-website-facts branch November 4, 2026 04:34

This branch was successfully deployed

1 active and 1 inactive deployments
Preview – wraps-website — 112ac3f2 Deployed Nov 4, 2026 by vercel[bot]
Preview – wraps-web — 112ac3f2 Deployed Nov 4, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant