Changelog
The format follows Keep a Changelog and the project follows Semantic Versioning.
The canonical changelogs live alongside the code:
api/CHANGELOG.md— Rails APImcp/CHANGELOG.md— MCP server
Unreleased
Section titled “Unreleased”- Multi-tenant
Accountmodel. Every API key, request log, outreach, campaign, contact import, and contact is scoped to an account. accounts:bootstraprake — idempotent founder-account creation + backfill of unattached resources.- Cross-account isolation enforced (cross-tenant access returns 404, never leaks).
- Configurable per-campaign
bounce_rate_threshold(default 8.0, range 0.5–25.0). - Per-send bounce rate calculation (matches SMTP2GO’s denominator).
Planmodel + 5 default plans (Free / Hobby / Pro / Scale / Founder).UsageRecordmodel + dispatch soft-cap when over plan limit (returns 402plan_limit_reached).- Stripe billing: customer creation at signup, webhook handler,
POST /billing/checkout,POST /billing/portal,GET /billing/subscription,GET /billing/usage, publicGET /plans. - Outbound webhooks:
Webhook+WebhookDeliverymodels, full CRUD endpoints, HMAC-SHA256 signing, retry-on-5xx with auto-disable at 5 consecutive failures, 7 event types. POST /signup(public) +POST/GET/DELETE /api_keys(Bearer-auth) for self-serve account creation and key management.- Idempotency-Key support on all mutating POST endpoints (24h replay, 409 on key+different-body conflict).
rack-attackrate limiting: 60 req/min per API key, 5 signups/hour per IP.- Structured error envelope:
{ code, type, message, details? }with RFC-7807-flavored type URI. - Per-account
limits_concurrencyonSendEmailJob(10),CampaignDispatcherJob(3),WebhookDeliveryJob(10).
Changed
Section titled “Changed”Campaign#statsandCampaignHealthMonitorJobcompute bounce rate againstSUM(sends_count)rather than enrollment count.ApiKey.issue!requires anaccount:keyword argument.- Every error response now uses
render_error(:code)with the unified envelope.
[0.1.0] — 2026-04-26
Section titled “[0.1.0] — 2026-04-26”Initial private deployment.
- Multi-step outreach campaigns with batch dispatch, pause/resume, daily caps.
- Per-credential SMTP rotation with auto-disable on bounce-rate threshold.
- IMAP reply detection.
- Open tracking pixel.
- Cross-campaign dedup via
Outreachmodel. - Token-based unsubscribes +
List-Unsubscribeheader. - Dispatch-time MX verification.
- SMTP2GO inbound webhook (bounce events).
EnrollmentSkippersistence with kind/reason.- API-key authentication with SHA-256 hashed tokens (
ak_live_...prefix). RequestLogand/usageendpoint with per-client-kind breakdown./repliesendpoint.- Send-forecast endpoint.
@ampout/mcp-server(TypeScript) — 11 tools callable from Claude Desktop, Cursor, and any MCP client.