Commit Graph

75 Commits

Author SHA1 Message Date
KM Koushik 04d0f4b123 feat: support standard AWS env vars and default credential chain (#401)
* feat: support standard AWS env vars and default credential chain

Replace non-standard AWS_ACCESS_KEY / AWS_SECRET_KEY with the AWS-standard
AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY. The old names are kept as
fallbacks in the runtimeEnv for backward compatibility.

Both vars are now optional. When omitted, the credentials object is not
passed to SESv2Client, STSClient, or SNSClient — the AWS SDK then falls
back to its default provider chain (IAM roles, ECS task roles, instance
profiles, etc.), which is the recommended approach for cloud-native deployments.

Closes #316

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* refactor: extract shared getAwsCredentialOptions helper and add partial-config guard

- Move the credential spread logic into a single credentials.ts helper
  so SESv2Client, STSClient, and SNSClient all share one implementation
- Throw a clear error if only one of AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY
  is set, preventing silent fallback to the default provider chain with a
  half-configured environment

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: align AWS env vars in docker and docs

* fix: use alias import for AWS credentials helper

---------

Co-authored-by: purva <purvahk08@gmail.com>
Co-authored-by: Purva Kandalgaonkar <136103488+purva-8@users.noreply.github.com>
2026-05-17 21:23:28 +10:00
KM Koushik eafbb53104 docs: add v1.9.x changelog entry (#382)
* docs: add v1.9.x highlights to changelog

* docs: refine v1.9.0 changelog entry

* docs: expand v1.9.0 changelog copy
2026-03-23 15:55:04 +11:00
KM Koushik 79f9049e40 docs: add campaign personalization guide (#374)
* docs: add campaign personalization guide

* docs: show best practices without accordions
2026-03-08 08:23:37 +11:00
KM Koushik 83cb0b24f7 feat: sync sdk contact book support (#373) 2026-03-08 00:59:40 +11:00
Dave Stockley ce8b780155 feat: add dashboard analytics to sdk and public api (#353) 2026-03-04 22:06:21 +11:00
Dave Stockley 7428a1fbfa feat: add contactBooks to sdk, add delete campaign public endpoint (#352)
* feat: add contactBooks to sdk, add delete campaign public endpoint

* fix: pr review notes

* refactor: pr feedback

* feat: bulk delete/create contacts

* refactor: rename a few methods for consistency

* refactor: update openapi docs based on pr feedback

* refactor: update open api docs, based on pr feedback

* fix: delete campaign security issue

* refactor: delete campaign requires team id (from context)

* fix: enums
2026-03-04 07:10:43 +11:00
Michał Ordon 62d7c44efc feat: add REDIS_KEY_PREFIX env var for Redis ACL namespace isolation (#365)
* feat: add REDIS_KEY_PREFIX env var for Redis ACL namespace isolation

Adds optional REDIS_KEY_PREFIX env var that prefixes all Redis keys
(BullMQ queues via `prefix` option, cache/lock/rate-limit keys via
`redisKey()` helper). When unset, behavior is unchanged (BullMQ
defaults to "bull:", cache keys are unprefixed).

This enables self-hosters using Redis ACL multi-tenancy to restrict
useSend to its own key namespace (e.g. `~usesend:*`).

16 files changed across env schema, Redis module, 9 BullMQ queue/worker
files, and 5 direct Redis key operation sites.

* docs: add REDIS_KEY_PREFIX to self-host assets and fix docker run example

Add REDIS_KEY_PREFIX env var to docker/prod/compose.yml, .env.example,
.env.selfhost.example, and self-hosting docs. Fix missing trailing
backslashes in standalone docker run example.

* fix(redis): disable ioredis ready check and BullMQ version check

Redis ACL blocks INFO command (in @dangerous category). ioredis uses
INFO for ready check, BullMQ uses it for version detection. Without
these flags, BullMQ workers fail to initialize and silently stop
processing jobs.

- Add enableReadyCheck: false to ioredis connection
- Add skipVersionCheck: true to all 5 Queue + 5 Worker constructors

* fix(redis): add skipVersionCheck to remaining BullMQ job queues

Add skipVersionCheck: true to Queue and Worker constructors in all 4 job
files (campaign-scheduler, cleanup-email-bodies, usage-job,
webhook-cleanup) to match the pattern already used in service files.
This prevents BullMQ version mismatch errors when using REDIS_KEY_PREFIX
with Redis ACL namespace isolation.
2026-03-02 08:12:47 +11:00
KM Koushik e3e9635a5f feat: add customizable contact double opt-in flow (#350)
* feat: add customizable contact double opt-in flow

* test: add double opt-in service coverage

* fix: address review comments for double opt-in PR

- Make pending status conditional on doubleOptInEnabled flag
- Backfill legacy unsubscribeReason for reliable pending detection
- Add doubleOptInContent to contact book listing select
- Fix duplicate toast on DOI editor subject save failure
- Harden searchParams parsing against string[] values
- Make default DOI template use link mark for clickable URL
- Make public API create+update atomic via transaction
- Prevent contact upsert failure when DOI email send fails
- Fix empty string template variable replacement

Co-authored-by: opencode <opencode@anthropic.com>

* fix: harden double opt-in confirmation safeguards

Preserve explicit unsubscribe intent in DOI flows and prevent confirmation links from re-subscribing opted-out contacts. Also sanitize subscribe-page error messaging and use timing-safe hash comparison for link verification.

* ui stuff

* fix: require doubleOptInUrl in double opt-in templates

* feat: add configurable from address for double opt-in emails

* feat: add resend confirmation flow for pending contacts

* fix: move subscribe confirmation to explicit POST flow

* test: add contact book public API endpoint coverage

* docs: add double opt-in documentation and update OpenAPI spec

Add a user guide for the double opt-in feature covering setup, contact
statuses, email customization, template variables, and best practices.
Update the OpenAPI spec to include doubleOptIn fields in all contactBook
request/response schemas.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: opencode <opencode@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 00:34:20 +11:00
KM Koushik edcd32a4ea fix: prevent premature webhook auto-disable and allow re-enable (#364)
* fix: prevent premature webhook auto-disable and allow re-enable

Use persisted failure counters when deciding auto-disable status and restore dashboard re-enable flow so webhooks are not deactivated unexpectedly after reset.

* fix: count webhook failures per failed call

Only increment consecutive failure counters after a call exhausts retries, while keeping the 30-call auto-disable threshold and stale-state protection.

* fix(docs): correct webhook SDK package name (#363)

* test: isolate webhook unit suite from mailer deps

Mock limit service in webhook unit tests so Vitest does not resolve team-service and mailer paths requiring usesend-js during CI.
2026-02-28 07:40:26 +11:00
KM Koushik 1c644740f2 fix(docs): correct webhook SDK package name (#363) 2026-02-28 07:15:04 +11:00
KM Koushik f7a0d11758 Fix webhook documentation link in changelog
Updated webhook documentation link to point to the correct URL.
2026-02-22 23:28:15 +11:00
KM Koushik 091b99cb10 Add v1.8.0 changelog entry with February 2025 updates (#348)
* docs: add v1.8.0 changelog with features since v1.7.0

Adds changelog entry covering webhooks, Python SDK, Contact Books API,
email retention/cleanup, idempotency support, and various improvements.

https://claude.ai/code/session_012hGggJSKqRZB4PkaaPAyrS

* update

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-02-22 22:19:41 +11:00
Vincent Vu ed4a429a1d fix(doc): Correct API reference in Go package documentation (#354)
* Correct API reference in Go package documentation

Updated description to reference the useSend API instead of Unsend API.

* Update documentation to reflect useSend branding

Added a issue to the package maintainer.

If maintainer isn't actively maintaining the package. Will fork it.

* fix(docs): remove community section and update Go SDK documentation

- Remove community section until content is ready.
- Update Go SDK docs to useSend implementation.
2026-02-17 07:43:13 +11:00
Dave Stockley 752fe5a183 feat: add get-campaigns docs (#351) 2026-02-16 16:27:44 +11:00
KM Koushik 8676965019 feat: add webhooks (#334) 2026-01-18 20:50:54 +11:00
Dave Stockley 6786ff003e feat: contact books public api (#336)
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2026-01-17 17:24:25 +11:00
Dave Stockley 68d951c55a feat: v1/campaign public api endpoint (#335)
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2026-01-11 09:37:57 +11:00
KM Koushik cb489654b5 idempotency (#282) 2025-11-17 11:42:09 +11:00
mino eacf231173 docs: add .env symlink setup instructions for apps/web (#287)
Co-authored-by: Claude <noreply@anthropic.com>
2025-11-08 06:52:47 +11:00
KM Koushik 78db758512 product update 2025-10-19 08:15:04 +11:00
KM Koushik 367457997e add changelog page (#275) 2025-10-19 06:57:23 +11:00
KM Koushik a5ca3b2f87 add campaign api (#274) 2025-10-18 10:31:43 +11:00
KM Koushik 2fe2d5cdab update package version and response return tyupe for delete domain api (#272) 2025-10-11 06:37:24 +11:00
Kuntal Majee 3f6a02ac56 delete-domain route added (#267) 2025-10-11 05:56:45 +11:00
KM Koushik 890ad72057 feat: add custom email headers (#260) 2025-09-28 21:33:45 +10:00
KM Koushik 76fdad6c81 feat: expose domain dns records via api (#259) 2025-09-27 09:40:14 +10:00
KM Koushik cbd97853b9 docs: update railway deploy links (#233) 2025-09-16 07:45:01 +10:00
KM Koushik 4c4094619a docs: remove MCP contextual options (#229) 2025-09-15 05:30:58 +10:00
KM Koushik 053fafb7cd docs: add Railway self-hosting guide (#228) 2025-09-14 06:34:11 +10:00
KM Koushik 66208a4b7a chore: update README with new contributors and remove outdated Python documentation 2025-09-11 21:09:06 +10:00
KM Koushik 3158ddc51c feat: add typed Python SDK (#213) 2025-09-09 05:50:08 +10:00
KM Koushik 5b3022c27b update docs theme 2025-09-07 18:13:39 +10:00
KM Koushik 79d1ebaf36 fix build and some docs 2025-09-06 06:01:03 +10:00
KM Koushik dbc9e3e976 update branding in docs 2025-09-03 22:46:03 +10:00
KM Koushik 07c53d3f58 rebrand to useSend (#210) 2025-09-03 08:21:55 +10:00
Matt Stein a6e8a1c362 GithubGitHub (#171) 2025-06-08 10:41:56 +10:00
KM Koushik 04a3a12d40 docs: add coolify blog link (#169) 2025-06-04 21:00:40 +10:00
Mohannad Faihan Otaibi e3a1739fc8 chore: update self-hosting.mdx with SMTP Proxy instructions (#168) 2025-06-03 11:02:24 +10:00
KM Koushik 4957ea822f feat: add list emails api (#167) 2025-06-01 10:07:57 +10:00
KM Koushik 15e5327024 feat: add In-Reply-To option (#165) 2025-05-25 20:44:13 +10:00
KM Koushik 14557a96ac docs: fix node sdk initialization (#163) 2025-05-17 14:13:32 +10:00
KMKoushik 84de7a1f65 add description for batch api 2025-04-20 07:40:45 +10:00
KMKoushik ef184b13a1 add batch api to docs 2025-04-19 21:54:36 +10:00
KM Koushik 3fe96b477f add batch email api (#149)
* add bulk email

* add bulk email api

* add batch email sdk changes
2025-04-19 21:45:17 +10:00
KM Koushik 70026cb11d domain apis (#146)
* fix: create domain api

* add domain apis

* fix url

---------

Co-authored-by: harshsbhat <harsh121102@gmail.com>
2025-04-05 06:48:03 +11:00
KM Koushik 1d863f699a fix package url 2025-03-28 14:14:38 +11:00
KMKoushik efe36248a6 add go community package 2025-03-23 18:25:03 +11:00
KM Koushik 0a1d93ac60 make dev setup better (#116)
* make dev setup better

* chage docs

* remove the need of github login
2025-03-17 21:33:43 +11:00
KMKoushik 48395915f0 add sdk changes 2025-03-08 23:05:28 +11:00
Arxk 9c5da6dca6 Added transaction to creating an SES setting & upgraded to Prisma ORM 6 (#109)
* Added transaction to creating SES setting & upgraded Prisma to Prisma ORM 6

* Keep logging of the queue status in

---------

Co-authored-by: Kumarion <121711454+Kumarion@users.noreply.github.com>
2025-03-08 23:05:28 +11:00