Commit Graph

69 Commits

Author SHA1 Message Date
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
KM Koushik b9d9037ec7 get contacts from emailid,ids (#99) 2025-02-06 00:27:03 +11:00
Giorgio Boa 2137ba8eab fix(docs): adjust env variables (#95) 2025-01-20 09:02:23 +11:00
KMKoushik a8fa1f6c1f add react email docs 2024-12-07 22:14:22 +11:00
KMKoushik 14cd1cbb20 docs: change sandbox warning to new step 2024-11-30 08:27:42 +11:00
Aditya Supare 1a5e18e9db Changed the double card description (#68) 2024-09-06 17:39:32 +10:00
8x4 259937c60c add upsert and delete to contacts (#67) 2024-09-05 09:18:21 +10:00