Commit Graph

445 Commits

Author SHA1 Message Date
Dave Stockley 752fe5a183 feat: add get-campaigns docs (#351) 2026-02-16 16:27:44 +11:00
KM Koushik 487902421b feat: add web testing foundation with infra-backed suites (#349)
* feat: add web test framework with infra-backed suites

* fix: honor DATABASE_URL env in integration prepare script

* fix: apply web test review feedback

* fix: streamline web test infra lifecycle and workflow scope
2026-02-16 09:13:29 +11:00
KM Koushik 09bdb8aaad feat(python-sdk): add webhook verification and event handling (#344)
* feat(python-sdk): add webhook verification and event handling

Add webhook support to the Python SDK matching the JS SDK implementation:
- Add Webhooks class with verify() and construct_event() methods
- Implement HMAC-SHA256 signature verification with timing-safe comparison
- Add timestamp validation with configurable tolerance (default 5 minutes)
- Add comprehensive webhook event types (18 events: email, contact, domain, test)
- Add WebhookVerificationError with typed error codes
- Export webhook constants (headers) and types

* fix(python-sdk): harden webhook parsing and typing

Normalize invalid UTF-8 webhook payloads to INVALID_BODY errors so verify() safely returns false, and narrow base email webhook event types to avoid discriminated-union overlap. Add regression tests for both paths.

* chore(python-sdk): bump package version to 0.2.9

* feat(python-sdk): add local webhook test example project

Add a runnable Flask receiver and signed webhook sender under packages/python-sdk/example, and link it from the Python SDK README for local verification.

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-02-08 08:18:14 +11:00
KM Koushik e246d32ef9 fix: prevent duplicate notification emails via atomic Redis SET NX (#346)
The warning and limit-reached notification emails were being sent
multiple times because of a race condition: concurrent workers could
both read the Redis cooldown key as empty (GET), both send emails,
then both set the key (SETEX). Replaced the non-atomic GET + SETEX
pattern with a single atomic SET ... NX EX that claims the cooldown
slot before any emails are sent. Also increased cooldown from 6 hours
to 24 hours so each notification is sent at most once per day.

https://claude.ai/code/session_01VBYXi5e64Vtq1cXWsfTYTw

Co-authored-by: Claude <noreply@anthropic.com>
2026-02-01 07:24:02 +11:00
KM Koushik 1b3b8f5751 fix: add repository field for npm provenance 2026-01-18 22:08:26 +11:00
KM Koushik 4c4d150dba fix: configure npm OIDC trusted publishing correctly 2026-01-18 22:03:24 +11:00
KM Koushik b3b7bddafb Change publish command from pnpm to npm 2026-01-18 21:56:01 +11:00
KM Koushik b0575ea9fc Update release workflow with OIDC permissions
Added permissions for OIDC and updated job steps.
2026-01-18 21:54:08 +11:00
KM Koushik eed37d09c6 fix build 2026-01-18 21:44:25 +11:00
KM Koushik d3b6ba7c0a fix: add tsup config for SDK and bump version to 1.6.0 (#343) 2026-01-18 21:04:43 +11:00
KM Koushik 8676965019 feat: add webhooks (#334) 2026-01-18 20:50:54 +11:00
KM Koushik f40a311cc9 fix: enforce contact book ownership (#341) 2026-01-17 18:08:05 +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
Thiago Praxedes 83119f97c8 Refine suppression list to include only affected recipients (#339) 2026-01-17 17:00:43 +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 bba9e937bb fix seg fault (#329) 2025-12-30 07:45:34 +11:00
KM Koushik 95dfa6b532 Upgrade Next.js to 15.5.9 (#326)
Co-authored-by: Claude <noreply@anthropic.com>
2025-12-18 06:48:24 +11:00
KM Koushik bef580ff92 use turbo in dev mode (#321) 2025-12-14 20:29:53 +11:00
KM Koushik 11b5ac1bf7 Fix bar chart hover on zero delivery days (#320)
Co-authored-by: Claude <noreply@anthropic.com>
2025-12-14 10:27:28 +11:00
KM Koushik 1e79f13bd4 add export contact book option (#318) 2025-12-14 10:08:54 +11:00
KM Koushik 461cd949e5 Fix Infinity% display bug in email chart (#319)
Co-authored-by: Claude <noreply@anthropic.com>
2025-12-14 09:35:05 +11:00
KM Koushik fd3c600b2e add upload contacts support (#314) 2025-12-13 08:15:42 +11:00
Vincent Vu 9c1c6f3538 fix(security): CVE-2025-55184, CVE-2025-55183 (#313) 2025-12-12 10:11:43 +11:00
KM Koushik 7fdb82a9e9 Fix version display in side navigation (#306)
Co-authored-by: Claude <noreply@anthropic.com>
2025-12-08 09:19:37 +11:00
KM Koushik 3e3f6d521a Display Docker image version in sidebar (#304)
Co-authored-by: Claude <noreply@anthropic.com>
2025-12-07 22:18:56 +11:00
Krish Parekh 641d5f36d2 Feat/code blocks with copy 2025-12-07 16:38:54 +11:00
KM Koushik b4640ac5e4 update mintlify (#302) 2025-12-07 07:48:33 +11:00
KM Koushik 693ec9c0ce bump nextjx version (#301) 2025-12-07 07:41:15 +11:00
Krish Parekh a3b7e4c877 refactor: replace Image component with Avatar for improved user display in TrustedBy section (#297) 2025-12-06 07:29:29 +11:00
KM Koushik d6be1af5b9 fix image position issue 2025-12-04 08:24:06 +11:00
KM Koushik e1b64d0d7b Add feedback dialog for cloud dashboard (#293) 2025-11-29 10:22:12 +11:00
Deepak S 357d561a8e "[feat] Emails retention periods/cleanup #158" (#286) 2025-11-29 08:13:41 +11:00
KM Koushik 05a02844b2 Update prisma version in start script 2025-11-21 20:14:05 +11:00
KM Koushik b2e0233758 fix: update docker node version (#290) 2025-11-20 18:08:07 +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 f525381fb9 send free limit reached email for inactive plans 2025-10-26 11:05:51 +11:00
KM Koushik 7edff5b783 Add subscription ID search to admin team lookup (#284)
Co-authored-by: Claude <noreply@anthropic.com>
2025-10-26 09:40:11 +11:00
KM Koushik 4fe354b85a Fix free limits and email notifications for inactive users (#283)
Co-authored-by: Claude <noreply@anthropic.com>
2025-10-26 07:52:44 +11:00
KM Koushik 8e569f886e fix build 2025-10-25 05:43:00 +11:00
KM Koushik 1c9056ba75 Configure Email Usage Alert Logic (#278)
Co-authored-by: Claude <noreply@anthropic.com>
2025-10-25 05:37:46 +11:00
KM Koushik 374f173a09 add delete resource modal (#280) 2025-10-25 05:37:16 +11:00
KM Koushik f1e63b6c46 add team ID column to email analytics page (#279)
Co-authored-by: Claude <noreply@anthropic.com>
2025-10-25 04:49:45 +11:00
KM Koushik 77b0239b92 add contact to users on waitlist removal (#276) 2025-10-19 15:08:33 +11:00
KM Koushik 78db758512 product update 2025-10-19 08:15:04 +11:00
KM Koushik 189b44bc1e fix campaign update not working 2025-10-19 07:14:03 +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 e631f16c85 feat: batch campaigns (#227) 2025-10-12 22:43:16 +11:00
KM Koushik 159b15e37e queue bulk contacts (#273) 2025-10-12 06:18:04 +11:00