Skip to content

fix: prevent premature webhook auto-disable and allow re-enable - #364

Merged
KMKoushik merged 4 commits into
mainfrom
fix/webhook-auto-disable-reenable
Feb 27, 2026
Merged

fix: prevent premature webhook auto-disable and allow re-enable#364
KMKoushik merged 4 commits into
mainfrom
fix/webhook-auto-disable-reenable

Conversation

@KMKoushik

@KMKoushikKMKoushik commented Feb 27, 2026

Copy link
Copy Markdown
Member

Summary

  • fix webhook failure handling to evaluate auto-disable using the persisted post-increment failure count, preventing stale-state one-failure deactivations after manual reset/reactivation
  • allow AUTO_DISABLED webhooks to be activated again from both webhook list and webhook detail actions in the dashboard
  • add webhook service unit coverage for headers, retry behavior, failure lifecycle, auto-disable threshold logic, re-enable reset behavior, and test webhook payload creation

Testing

  • pnpm --filter web exec vitest run -c vitest.unit.config.ts \"src/server/service/webhook-service.unit.test.ts\"

Summary by cubic

Fixes webhook failure handling to count failures per failed call and prevent early auto-disable. Restores the ability to re-enable AUTO_DISABLED webhooks in the dashboard.

  • Bug Fixes
    • Increment consecutiveFailures only after a call exhausts retries, and decide auto-disable using the persisted post-increment counter in a transaction to avoid one-failure deactivations after resets.
    • Enable “Re-enable” for AUTO_DISABLED webhooks on list and detail pages; activating clears consecutiveFailures and shows the correct button label.
    • Add unit tests for headers/retries/failure lifecycle/threshold/re-enable reset/test payload; mock limit service to avoid mailer deps in CI; docs add email.rendering_failure, use usesend-js, and clarify “30 consecutive failed calls”.

Written for commit 55c9d56. Summary will update on new commits.

Summary by CodeRabbit

  • New Features

    • Added email.rendering_failure event type for webhooks
  • Improvements

    • Clarified webhook action labels/states to show "Resume" or "Re-enable" and simplified button disabled behavior
    • Standardized wording to "30 consecutive failed calls" and unified "failed calls" phrasing across guidance
    • Improved transactional handling of webhook failures and auto-disable logic
  • Documentation

    • Updated webhook guide, event table formatting, and SDK examples (usesend → usesend-js)
  • Tests

    • Added comprehensive unit tests for webhook processing and auto-disable scenarios

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

vercelBot commented Feb 27, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
unsend-marketingReadyReadyPreview, CommentFeb 27, 2026 8:40pm

@greptile-appsgreptile-appsBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your free trial has ended. If you'd like to continue receiving code reviews, you can add a payment method here.

@coderabbitai

coderabbitaiBot commented Feb 27, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3dbe71d and 55c9d56.

📒 Files selected for processing (3)
  • apps/docs/guides/webhooks.mdx
  • apps/web/src/server/service/webhook-service.ts
  • apps/web/src/server/service/webhook-service.unit.test.ts

Walkthrough

This PR updates webhook behavior and docs: adds an email.rendering_failure event in docs and replaces usesend imports with usesend-js; refactors UI action rendering to use a new canActivate boolean for PAUSED/AUTO_DISABLED states and adjusts button disabled logic; changes webhook-service failure handling to perform consecutive-failure increments and potential auto-disable inside a single transaction; and adds comprehensive unit tests covering retries, failure counting, auto-disable, re-enable, and test-call creation.

Possibly related PRs

Suggested labels

codex

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Title check✅ PassedThe pull request title accurately summarizes the main changes: fixing premature webhook auto-disable logic and enabling re-enable functionality for auto-disabled webhooks, which aligns with the core objectives of the changeset.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@cloudflare-workers-and-pages

cloudflare-workers-and-pagesBot commented Feb 27, 2026

Copy link
Copy Markdown

Deploying usesend with Cloudflare Pages Cloudflare Pages

Latest commit:55c9d56
Status:⚡️ Build in progress...

View logs

Only increment consecutive failure counters after a call exhausts retries, while keeping the 30-call auto-disable threshold and stale-state protection.
Mock limit service in webhook unit tests so Vitest does not resolve team-service and mailer paths requiring usesend-js during CI.
@KMKoushik
KMKoushik merged commit edcd32a into mainFeb 27, 2026
3 of 4 checks passed
@KMKoushik
KMKoushik deleted the fix/webhook-auto-disable-reenable branch February 27, 2026 20:40
Sign up for freeto 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

@KMKoushik
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
fix: prevent premature webhook auto-disable and allow re-enable by KMKoushik · Pull Request #364 · usesend/useSend · GitHub
Skip to content

fix: prevent premature webhook auto-disable and allow re-enable - #364

Merged
KMKoushik merged 4 commits into
mainfrom
fix/webhook-auto-disable-reenable
Feb 27, 2026
Merged

fix: prevent premature webhook auto-disable and allow re-enable#364
KMKoushik merged 4 commits into
mainfrom
fix/webhook-auto-disable-reenable

Conversation

@KMKoushik

@KMKoushikKMKoushik commented Feb 27, 2026

Copy link
Copy Markdown
Member

Summary

  • fix webhook failure handling to evaluate auto-disable using the persisted post-increment failure count, preventing stale-state one-failure deactivations after manual reset/reactivation
  • allow AUTO_DISABLED webhooks to be activated again from both webhook list and webhook detail actions in the dashboard
  • add webhook service unit coverage for headers, retry behavior, failure lifecycle, auto-disable threshold logic, re-enable reset behavior, and test webhook payload creation

Testing

  • pnpm --filter web exec vitest run -c vitest.unit.config.ts \"src/server/service/webhook-service.unit.test.ts\"

Summary by cubic

Fixes webhook failure handling to count failures per failed call and prevent early auto-disable. Restores the ability to re-enable AUTO_DISABLED webhooks in the dashboard.

  • Bug Fixes
    • Increment consecutiveFailures only after a call exhausts retries, and decide auto-disable using the persisted post-increment counter in a transaction to avoid one-failure deactivations after resets.
    • Enable “Re-enable” for AUTO_DISABLED webhooks on list and detail pages; activating clears consecutiveFailures and shows the correct button label.
    • Add unit tests for headers/retries/failure lifecycle/threshold/re-enable reset/test payload; mock limit service to avoid mailer deps in CI; docs add email.rendering_failure, use usesend-js, and clarify “30 consecutive failed calls”.

Written for commit 55c9d56. Summary will update on new commits.

Summary by CodeRabbit

  • New Features

    • Added email.rendering_failure event type for webhooks
  • Improvements

    • Clarified webhook action labels/states to show "Resume" or "Re-enable" and simplified button disabled behavior
    • Standardized wording to "30 consecutive failed calls" and unified "failed calls" phrasing across guidance
    • Improved transactional handling of webhook failures and auto-disable logic
  • Documentation

    • Updated webhook guide, event table formatting, and SDK examples (usesend → usesend-js)
  • Tests

    • Added comprehensive unit tests for webhook processing and auto-disable scenarios

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

vercelBot commented Feb 27, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
unsend-marketingReadyReadyPreview, CommentFeb 27, 2026 8:40pm

@greptile-appsgreptile-appsBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your free trial has ended. If you'd like to continue receiving code reviews, you can add a payment method here.

@coderabbitai

coderabbitaiBot commented Feb 27, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3dbe71d and 55c9d56.

📒 Files selected for processing (3)
  • apps/docs/guides/webhooks.mdx
  • apps/web/src/server/service/webhook-service.ts
  • apps/web/src/server/service/webhook-service.unit.test.ts

Walkthrough

This PR updates webhook behavior and docs: adds an email.rendering_failure event in docs and replaces usesend imports with usesend-js; refactors UI action rendering to use a new canActivate boolean for PAUSED/AUTO_DISABLED states and adjusts button disabled logic; changes webhook-service failure handling to perform consecutive-failure increments and potential auto-disable inside a single transaction; and adds comprehensive unit tests covering retries, failure counting, auto-disable, re-enable, and test-call creation.

Possibly related PRs

Suggested labels

codex

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Title check✅ PassedThe pull request title accurately summarizes the main changes: fixing premature webhook auto-disable logic and enabling re-enable functionality for auto-disabled webhooks, which aligns with the core objectives of the changeset.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@cloudflare-workers-and-pages

cloudflare-workers-and-pagesBot commented Feb 27, 2026

Copy link
Copy Markdown

Deploying usesend with Cloudflare Pages Cloudflare Pages

Latest commit:55c9d56
Status:⚡️ Build in progress...

View logs

Only increment consecutive failure counters after a call exhausts retries, while keeping the 30-call auto-disable threshold and stale-state protection.
Mock limit service in webhook unit tests so Vitest does not resolve team-service and mailer paths requiring usesend-js during CI.
@KMKoushik
KMKoushik merged commit edcd32a into mainFeb 27, 2026
3 of 4 checks passed
@KMKoushik
KMKoushik deleted the fix/webhook-auto-disable-reenable branch February 27, 2026 20:40
Sign up for freeto 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

@KMKoushik
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: prevent premature webhook auto-disable and allow re-enable by KMKoushik · Pull Request #364 · usesend/useSend · GitHub
Skip to content

fix: prevent premature webhook auto-disable and allow re-enable - #364

Merged
KMKoushik merged 4 commits into
mainfrom
fix/webhook-auto-disable-reenable
Feb 27, 2026
Merged

fix: prevent premature webhook auto-disable and allow re-enable#364
KMKoushik merged 4 commits into
mainfrom
fix/webhook-auto-disable-reenable

Conversation

@KMKoushik

@KMKoushikKMKoushik commented Feb 27, 2026

Copy link
Copy Markdown
Member

Summary

  • fix webhook failure handling to evaluate auto-disable using the persisted post-increment failure count, preventing stale-state one-failure deactivations after manual reset/reactivation
  • allow AUTO_DISABLED webhooks to be activated again from both webhook list and webhook detail actions in the dashboard
  • add webhook service unit coverage for headers, retry behavior, failure lifecycle, auto-disable threshold logic, re-enable reset behavior, and test webhook payload creation

Testing

  • pnpm --filter web exec vitest run -c vitest.unit.config.ts \"src/server/service/webhook-service.unit.test.ts\"

Summary by cubic

Fixes webhook failure handling to count failures per failed call and prevent early auto-disable. Restores the ability to re-enable AUTO_DISABLED webhooks in the dashboard.

  • Bug Fixes
    • Increment consecutiveFailures only after a call exhausts retries, and decide auto-disable using the persisted post-increment counter in a transaction to avoid one-failure deactivations after resets.
    • Enable “Re-enable” for AUTO_DISABLED webhooks on list and detail pages; activating clears consecutiveFailures and shows the correct button label.
    • Add unit tests for headers/retries/failure lifecycle/threshold/re-enable reset/test payload; mock limit service to avoid mailer deps in CI; docs add email.rendering_failure, use usesend-js, and clarify “30 consecutive failed calls”.

Written for commit 55c9d56. Summary will update on new commits.

Summary by CodeRabbit

  • New Features

    • Added email.rendering_failure event type for webhooks
  • Improvements

    • Clarified webhook action labels/states to show "Resume" or "Re-enable" and simplified button disabled behavior
    • Standardized wording to "30 consecutive failed calls" and unified "failed calls" phrasing across guidance
    • Improved transactional handling of webhook failures and auto-disable logic
  • Documentation

    • Updated webhook guide, event table formatting, and SDK examples (usesend → usesend-js)
  • Tests

    • Added comprehensive unit tests for webhook processing and auto-disable scenarios

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

vercelBot commented Feb 27, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
unsend-marketingReadyReadyPreview, CommentFeb 27, 2026 8:40pm

@greptile-appsgreptile-appsBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your free trial has ended. If you'd like to continue receiving code reviews, you can add a payment method here.

@coderabbitai

coderabbitaiBot commented Feb 27, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3dbe71d and 55c9d56.

📒 Files selected for processing (3)
  • apps/docs/guides/webhooks.mdx
  • apps/web/src/server/service/webhook-service.ts
  • apps/web/src/server/service/webhook-service.unit.test.ts

Walkthrough

This PR updates webhook behavior and docs: adds an email.rendering_failure event in docs and replaces usesend imports with usesend-js; refactors UI action rendering to use a new canActivate boolean for PAUSED/AUTO_DISABLED states and adjusts button disabled logic; changes webhook-service failure handling to perform consecutive-failure increments and potential auto-disable inside a single transaction; and adds comprehensive unit tests covering retries, failure counting, auto-disable, re-enable, and test-call creation.

Possibly related PRs

Suggested labels

codex

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Title check✅ PassedThe pull request title accurately summarizes the main changes: fixing premature webhook auto-disable logic and enabling re-enable functionality for auto-disabled webhooks, which aligns with the core objectives of the changeset.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@cloudflare-workers-and-pages

cloudflare-workers-and-pagesBot commented Feb 27, 2026

Copy link
Copy Markdown

Deploying usesend with Cloudflare Pages Cloudflare Pages

Latest commit:55c9d56
Status:⚡️ Build in progress...

View logs

Only increment consecutive failure counters after a call exhausts retries, while keeping the 30-call auto-disable threshold and stale-state protection.
Mock limit service in webhook unit tests so Vitest does not resolve team-service and mailer paths requiring usesend-js during CI.
@KMKoushik
KMKoushik merged commit edcd32a into mainFeb 27, 2026
3 of 4 checks passed
@KMKoushik
KMKoushik deleted the fix/webhook-auto-disable-reenable branch February 27, 2026 20:40
Sign up for freeto 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

@KMKoushik
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: prevent premature webhook auto-disable and allow re-enable by KMKoushik · Pull Request #364 · usesend/useSend · GitHub
Skip to content

fix: prevent premature webhook auto-disable and allow re-enable - #364

Merged
KMKoushik merged 4 commits into
mainfrom
fix/webhook-auto-disable-reenable
Feb 27, 2026
Merged

fix: prevent premature webhook auto-disable and allow re-enable#364
KMKoushik merged 4 commits into
mainfrom
fix/webhook-auto-disable-reenable

Conversation

@KMKoushik

@KMKoushikKMKoushik commented Feb 27, 2026

Copy link
Copy Markdown
Member

Summary

  • fix webhook failure handling to evaluate auto-disable using the persisted post-increment failure count, preventing stale-state one-failure deactivations after manual reset/reactivation
  • allow AUTO_DISABLED webhooks to be activated again from both webhook list and webhook detail actions in the dashboard
  • add webhook service unit coverage for headers, retry behavior, failure lifecycle, auto-disable threshold logic, re-enable reset behavior, and test webhook payload creation

Testing

  • pnpm --filter web exec vitest run -c vitest.unit.config.ts \"src/server/service/webhook-service.unit.test.ts\"

Summary by cubic

Fixes webhook failure handling to count failures per failed call and prevent early auto-disable. Restores the ability to re-enable AUTO_DISABLED webhooks in the dashboard.

  • Bug Fixes
    • Increment consecutiveFailures only after a call exhausts retries, and decide auto-disable using the persisted post-increment counter in a transaction to avoid one-failure deactivations after resets.
    • Enable “Re-enable” for AUTO_DISABLED webhooks on list and detail pages; activating clears consecutiveFailures and shows the correct button label.
    • Add unit tests for headers/retries/failure lifecycle/threshold/re-enable reset/test payload; mock limit service to avoid mailer deps in CI; docs add email.rendering_failure, use usesend-js, and clarify “30 consecutive failed calls”.

Written for commit 55c9d56. Summary will update on new commits.

Summary by CodeRabbit

  • New Features

    • Added email.rendering_failure event type for webhooks
  • Improvements

    • Clarified webhook action labels/states to show "Resume" or "Re-enable" and simplified button disabled behavior
    • Standardized wording to "30 consecutive failed calls" and unified "failed calls" phrasing across guidance
    • Improved transactional handling of webhook failures and auto-disable logic
  • Documentation

    • Updated webhook guide, event table formatting, and SDK examples (usesend → usesend-js)
  • Tests

    • Added comprehensive unit tests for webhook processing and auto-disable scenarios

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

vercelBot commented Feb 27, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
unsend-marketingReadyReadyPreview, CommentFeb 27, 2026 8:40pm

@greptile-appsgreptile-appsBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your free trial has ended. If you'd like to continue receiving code reviews, you can add a payment method here.

@coderabbitai

coderabbitaiBot commented Feb 27, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3dbe71d and 55c9d56.

📒 Files selected for processing (3)
  • apps/docs/guides/webhooks.mdx
  • apps/web/src/server/service/webhook-service.ts
  • apps/web/src/server/service/webhook-service.unit.test.ts

Walkthrough

This PR updates webhook behavior and docs: adds an email.rendering_failure event in docs and replaces usesend imports with usesend-js; refactors UI action rendering to use a new canActivate boolean for PAUSED/AUTO_DISABLED states and adjusts button disabled logic; changes webhook-service failure handling to perform consecutive-failure increments and potential auto-disable inside a single transaction; and adds comprehensive unit tests covering retries, failure counting, auto-disable, re-enable, and test-call creation.

Possibly related PRs

Suggested labels

codex

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Title check✅ PassedThe pull request title accurately summarizes the main changes: fixing premature webhook auto-disable logic and enabling re-enable functionality for auto-disabled webhooks, which aligns with the core objectives of the changeset.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@cloudflare-workers-and-pages

cloudflare-workers-and-pagesBot commented Feb 27, 2026

Copy link
Copy Markdown

Deploying usesend with Cloudflare Pages Cloudflare Pages

Latest commit:55c9d56
Status:⚡️ Build in progress...

View logs

Only increment consecutive failure counters after a call exhausts retries, while keeping the 30-call auto-disable threshold and stale-state protection.
Mock limit service in webhook unit tests so Vitest does not resolve team-service and mailer paths requiring usesend-js during CI.
@KMKoushik
KMKoushik merged commit edcd32a into mainFeb 27, 2026
3 of 4 checks passed
@KMKoushik
KMKoushik deleted the fix/webhook-auto-disable-reenable branch February 27, 2026 20:40
Sign up for freeto 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

@KMKoushik
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' fix: prevent premature webhook auto-disable and allow re-enable by KMKoushik · Pull Request #364 · usesend/useSend · GitHub
Skip to content

fix: prevent premature webhook auto-disable and allow re-enable - #364

Merged
KMKoushik merged 4 commits into
mainfrom
fix/webhook-auto-disable-reenable
Feb 27, 2026
Merged

fix: prevent premature webhook auto-disable and allow re-enable#364
KMKoushik merged 4 commits into
mainfrom
fix/webhook-auto-disable-reenable

Conversation

@KMKoushik

@KMKoushikKMKoushik commented Feb 27, 2026

Copy link
Copy Markdown
Member

Summary

  • fix webhook failure handling to evaluate auto-disable using the persisted post-increment failure count, preventing stale-state one-failure deactivations after manual reset/reactivation
  • allow AUTO_DISABLED webhooks to be activated again from both webhook list and webhook detail actions in the dashboard
  • add webhook service unit coverage for headers, retry behavior, failure lifecycle, auto-disable threshold logic, re-enable reset behavior, and test webhook payload creation

Testing

  • pnpm --filter web exec vitest run -c vitest.unit.config.ts \"src/server/service/webhook-service.unit.test.ts\"

Summary by cubic

Fixes webhook failure handling to count failures per failed call and prevent early auto-disable. Restores the ability to re-enable AUTO_DISABLED webhooks in the dashboard.

  • Bug Fixes
    • Increment consecutiveFailures only after a call exhausts retries, and decide auto-disable using the persisted post-increment counter in a transaction to avoid one-failure deactivations after resets.
    • Enable “Re-enable” for AUTO_DISABLED webhooks on list and detail pages; activating clears consecutiveFailures and shows the correct button label.
    • Add unit tests for headers/retries/failure lifecycle/threshold/re-enable reset/test payload; mock limit service to avoid mailer deps in CI; docs add email.rendering_failure, use usesend-js, and clarify “30 consecutive failed calls”.

Written for commit 55c9d56. Summary will update on new commits.

Summary by CodeRabbit

  • New Features

    • Added email.rendering_failure event type for webhooks
  • Improvements

    • Clarified webhook action labels/states to show "Resume" or "Re-enable" and simplified button disabled behavior
    • Standardized wording to "30 consecutive failed calls" and unified "failed calls" phrasing across guidance
    • Improved transactional handling of webhook failures and auto-disable logic
  • Documentation

    • Updated webhook guide, event table formatting, and SDK examples (usesend → usesend-js)
  • Tests

    • Added comprehensive unit tests for webhook processing and auto-disable scenarios

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

vercelBot commented Feb 27, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
unsend-marketingReadyReadyPreview, CommentFeb 27, 2026 8:40pm

@greptile-appsgreptile-appsBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your free trial has ended. If you'd like to continue receiving code reviews, you can add a payment method here.

@coderabbitai

coderabbitaiBot commented Feb 27, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3dbe71d and 55c9d56.

📒 Files selected for processing (3)
  • apps/docs/guides/webhooks.mdx
  • apps/web/src/server/service/webhook-service.ts
  • apps/web/src/server/service/webhook-service.unit.test.ts

Walkthrough

This PR updates webhook behavior and docs: adds an email.rendering_failure event in docs and replaces usesend imports with usesend-js; refactors UI action rendering to use a new canActivate boolean for PAUSED/AUTO_DISABLED states and adjusts button disabled logic; changes webhook-service failure handling to perform consecutive-failure increments and potential auto-disable inside a single transaction; and adds comprehensive unit tests covering retries, failure counting, auto-disable, re-enable, and test-call creation.

Possibly related PRs

Suggested labels

codex

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Title check✅ PassedThe pull request title accurately summarizes the main changes: fixing premature webhook auto-disable logic and enabling re-enable functionality for auto-disabled webhooks, which aligns with the core objectives of the changeset.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@cloudflare-workers-and-pages

cloudflare-workers-and-pagesBot commented Feb 27, 2026

Copy link
Copy Markdown

Deploying usesend with Cloudflare Pages Cloudflare Pages

Latest commit:55c9d56
Status:⚡️ Build in progress...

View logs

Only increment consecutive failure counters after a call exhausts retries, while keeping the 30-call auto-disable threshold and stale-state protection.
Mock limit service in webhook unit tests so Vitest does not resolve team-service and mailer paths requiring usesend-js during CI.
@KMKoushik
KMKoushik merged commit edcd32a into mainFeb 27, 2026
3 of 4 checks passed
@KMKoushik
KMKoushik deleted the fix/webhook-auto-disable-reenable branch February 27, 2026 20:40
Sign up for freeto 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

@KMKoushik
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: prevent premature webhook auto-disable and allow re-enable by KMKoushik · Pull Request #364 · usesend/useSend · GitHub
Skip to content

fix: prevent premature webhook auto-disable and allow re-enable - #364

Merged
KMKoushik merged 4 commits into
mainfrom
fix/webhook-auto-disable-reenable
Feb 27, 2026
Merged

fix: prevent premature webhook auto-disable and allow re-enable#364
KMKoushik merged 4 commits into
mainfrom
fix/webhook-auto-disable-reenable

Conversation

@KMKoushik

@KMKoushikKMKoushik commented Feb 27, 2026

Copy link
Copy Markdown
Member

Summary

  • fix webhook failure handling to evaluate auto-disable using the persisted post-increment failure count, preventing stale-state one-failure deactivations after manual reset/reactivation
  • allow AUTO_DISABLED webhooks to be activated again from both webhook list and webhook detail actions in the dashboard
  • add webhook service unit coverage for headers, retry behavior, failure lifecycle, auto-disable threshold logic, re-enable reset behavior, and test webhook payload creation

Testing

  • pnpm --filter web exec vitest run -c vitest.unit.config.ts \"src/server/service/webhook-service.unit.test.ts\"

Summary by cubic

Fixes webhook failure handling to count failures per failed call and prevent early auto-disable. Restores the ability to re-enable AUTO_DISABLED webhooks in the dashboard.

  • Bug Fixes
    • Increment consecutiveFailures only after a call exhausts retries, and decide auto-disable using the persisted post-increment counter in a transaction to avoid one-failure deactivations after resets.
    • Enable “Re-enable” for AUTO_DISABLED webhooks on list and detail pages; activating clears consecutiveFailures and shows the correct button label.
    • Add unit tests for headers/retries/failure lifecycle/threshold/re-enable reset/test payload; mock limit service to avoid mailer deps in CI; docs add email.rendering_failure, use usesend-js, and clarify “30 consecutive failed calls”.

Written for commit 55c9d56. Summary will update on new commits.

Summary by CodeRabbit

  • New Features

    • Added email.rendering_failure event type for webhooks
  • Improvements

    • Clarified webhook action labels/states to show "Resume" or "Re-enable" and simplified button disabled behavior
    • Standardized wording to "30 consecutive failed calls" and unified "failed calls" phrasing across guidance
    • Improved transactional handling of webhook failures and auto-disable logic
  • Documentation

    • Updated webhook guide, event table formatting, and SDK examples (usesend → usesend-js)
  • Tests

    • Added comprehensive unit tests for webhook processing and auto-disable scenarios

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

vercelBot commented Feb 27, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
unsend-marketingReadyReadyPreview, CommentFeb 27, 2026 8:40pm

@greptile-appsgreptile-appsBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your free trial has ended. If you'd like to continue receiving code reviews, you can add a payment method here.

@coderabbitai

coderabbitaiBot commented Feb 27, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3dbe71d and 55c9d56.

📒 Files selected for processing (3)
  • apps/docs/guides/webhooks.mdx
  • apps/web/src/server/service/webhook-service.ts
  • apps/web/src/server/service/webhook-service.unit.test.ts

Walkthrough

This PR updates webhook behavior and docs: adds an email.rendering_failure event in docs and replaces usesend imports with usesend-js; refactors UI action rendering to use a new canActivate boolean for PAUSED/AUTO_DISABLED states and adjusts button disabled logic; changes webhook-service failure handling to perform consecutive-failure increments and potential auto-disable inside a single transaction; and adds comprehensive unit tests covering retries, failure counting, auto-disable, re-enable, and test-call creation.

Possibly related PRs

Suggested labels

codex

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Title check✅ PassedThe pull request title accurately summarizes the main changes: fixing premature webhook auto-disable logic and enabling re-enable functionality for auto-disabled webhooks, which aligns with the core objectives of the changeset.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@cloudflare-workers-and-pages

cloudflare-workers-and-pagesBot commented Feb 27, 2026

Copy link
Copy Markdown

Deploying usesend with Cloudflare Pages Cloudflare Pages

Latest commit:55c9d56
Status:⚡️ Build in progress...

View logs

Only increment consecutive failure counters after a call exhausts retries, while keeping the 30-call auto-disable threshold and stale-state protection.
Mock limit service in webhook unit tests so Vitest does not resolve team-service and mailer paths requiring usesend-js during CI.
@KMKoushik
KMKoushik merged commit edcd32a into mainFeb 27, 2026
3 of 4 checks passed
@KMKoushik
KMKoushik deleted the fix/webhook-auto-disable-reenable branch February 27, 2026 20:40
Sign up for freeto 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

@KMKoushik
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: prevent premature webhook auto-disable and allow re-enable by KMKoushik · Pull Request #364 · usesend/useSend · GitHub
Skip to content

fix: prevent premature webhook auto-disable and allow re-enable - #364

Merged
KMKoushik merged 4 commits into
mainfrom
fix/webhook-auto-disable-reenable
Feb 27, 2026
Merged

fix: prevent premature webhook auto-disable and allow re-enable#364
KMKoushik merged 4 commits into
mainfrom
fix/webhook-auto-disable-reenable

Conversation

@KMKoushik

@KMKoushikKMKoushik commented Feb 27, 2026

Copy link
Copy Markdown
Member

Summary

  • fix webhook failure handling to evaluate auto-disable using the persisted post-increment failure count, preventing stale-state one-failure deactivations after manual reset/reactivation
  • allow AUTO_DISABLED webhooks to be activated again from both webhook list and webhook detail actions in the dashboard
  • add webhook service unit coverage for headers, retry behavior, failure lifecycle, auto-disable threshold logic, re-enable reset behavior, and test webhook payload creation

Testing

  • pnpm --filter web exec vitest run -c vitest.unit.config.ts \"src/server/service/webhook-service.unit.test.ts\"

Summary by cubic

Fixes webhook failure handling to count failures per failed call and prevent early auto-disable. Restores the ability to re-enable AUTO_DISABLED webhooks in the dashboard.

  • Bug Fixes
    • Increment consecutiveFailures only after a call exhausts retries, and decide auto-disable using the persisted post-increment counter in a transaction to avoid one-failure deactivations after resets.
    • Enable “Re-enable” for AUTO_DISABLED webhooks on list and detail pages; activating clears consecutiveFailures and shows the correct button label.
    • Add unit tests for headers/retries/failure lifecycle/threshold/re-enable reset/test payload; mock limit service to avoid mailer deps in CI; docs add email.rendering_failure, use usesend-js, and clarify “30 consecutive failed calls”.

Written for commit 55c9d56. Summary will update on new commits.

Summary by CodeRabbit

  • New Features

    • Added email.rendering_failure event type for webhooks
  • Improvements

    • Clarified webhook action labels/states to show "Resume" or "Re-enable" and simplified button disabled behavior
    • Standardized wording to "30 consecutive failed calls" and unified "failed calls" phrasing across guidance
    • Improved transactional handling of webhook failures and auto-disable logic
  • Documentation

    • Updated webhook guide, event table formatting, and SDK examples (usesend → usesend-js)
  • Tests

    • Added comprehensive unit tests for webhook processing and auto-disable scenarios

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

vercelBot commented Feb 27, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
unsend-marketingReadyReadyPreview, CommentFeb 27, 2026 8:40pm

@greptile-appsgreptile-appsBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your free trial has ended. If you'd like to continue receiving code reviews, you can add a payment method here.

@coderabbitai

coderabbitaiBot commented Feb 27, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3dbe71d and 55c9d56.

📒 Files selected for processing (3)
  • apps/docs/guides/webhooks.mdx
  • apps/web/src/server/service/webhook-service.ts
  • apps/web/src/server/service/webhook-service.unit.test.ts

Walkthrough

This PR updates webhook behavior and docs: adds an email.rendering_failure event in docs and replaces usesend imports with usesend-js; refactors UI action rendering to use a new canActivate boolean for PAUSED/AUTO_DISABLED states and adjusts button disabled logic; changes webhook-service failure handling to perform consecutive-failure increments and potential auto-disable inside a single transaction; and adds comprehensive unit tests covering retries, failure counting, auto-disable, re-enable, and test-call creation.

Possibly related PRs

Suggested labels

codex

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Title check✅ PassedThe pull request title accurately summarizes the main changes: fixing premature webhook auto-disable logic and enabling re-enable functionality for auto-disabled webhooks, which aligns with the core objectives of the changeset.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@cloudflare-workers-and-pages

cloudflare-workers-and-pagesBot commented Feb 27, 2026

Copy link
Copy Markdown

Deploying usesend with Cloudflare Pages Cloudflare Pages

Latest commit:55c9d56
Status:⚡️ Build in progress...

View logs

Only increment consecutive failure counters after a call exhausts retries, while keeping the 30-call auto-disable threshold and stale-state protection.
Mock limit service in webhook unit tests so Vitest does not resolve team-service and mailer paths requiring usesend-js during CI.
@KMKoushik
KMKoushik merged commit edcd32a into mainFeb 27, 2026
3 of 4 checks passed
@KMKoushik
KMKoushik deleted the fix/webhook-auto-disable-reenable branch February 27, 2026 20:40
Sign up for freeto 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

@KMKoushik
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); fix: prevent premature webhook auto-disable and allow re-enable by KMKoushik · Pull Request #364 · usesend/useSend · GitHub
Skip to content

fix: prevent premature webhook auto-disable and allow re-enable - #364

Merged
KMKoushik merged 4 commits into
mainfrom
fix/webhook-auto-disable-reenable
Feb 27, 2026
Merged

fix: prevent premature webhook auto-disable and allow re-enable#364
KMKoushik merged 4 commits into
mainfrom
fix/webhook-auto-disable-reenable

Conversation

@KMKoushik

@KMKoushikKMKoushik commented Feb 27, 2026

Copy link
Copy Markdown
Member

Summary

  • fix webhook failure handling to evaluate auto-disable using the persisted post-increment failure count, preventing stale-state one-failure deactivations after manual reset/reactivation
  • allow AUTO_DISABLED webhooks to be activated again from both webhook list and webhook detail actions in the dashboard
  • add webhook service unit coverage for headers, retry behavior, failure lifecycle, auto-disable threshold logic, re-enable reset behavior, and test webhook payload creation

Testing

  • pnpm --filter web exec vitest run -c vitest.unit.config.ts \"src/server/service/webhook-service.unit.test.ts\"

Summary by cubic

Fixes webhook failure handling to count failures per failed call and prevent early auto-disable. Restores the ability to re-enable AUTO_DISABLED webhooks in the dashboard.

  • Bug Fixes
    • Increment consecutiveFailures only after a call exhausts retries, and decide auto-disable using the persisted post-increment counter in a transaction to avoid one-failure deactivations after resets.
    • Enable “Re-enable” for AUTO_DISABLED webhooks on list and detail pages; activating clears consecutiveFailures and shows the correct button label.
    • Add unit tests for headers/retries/failure lifecycle/threshold/re-enable reset/test payload; mock limit service to avoid mailer deps in CI; docs add email.rendering_failure, use usesend-js, and clarify “30 consecutive failed calls”.

Written for commit 55c9d56. Summary will update on new commits.

Summary by CodeRabbit

  • New Features

    • Added email.rendering_failure event type for webhooks
  • Improvements

    • Clarified webhook action labels/states to show "Resume" or "Re-enable" and simplified button disabled behavior
    • Standardized wording to "30 consecutive failed calls" and unified "failed calls" phrasing across guidance
    • Improved transactional handling of webhook failures and auto-disable logic
  • Documentation

    • Updated webhook guide, event table formatting, and SDK examples (usesend → usesend-js)
  • Tests

    • Added comprehensive unit tests for webhook processing and auto-disable scenarios

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

vercelBot commented Feb 27, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
unsend-marketingReadyReadyPreview, CommentFeb 27, 2026 8:40pm

@greptile-appsgreptile-appsBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your free trial has ended. If you'd like to continue receiving code reviews, you can add a payment method here.

@coderabbitai

coderabbitaiBot commented Feb 27, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3dbe71d and 55c9d56.

📒 Files selected for processing (3)
  • apps/docs/guides/webhooks.mdx
  • apps/web/src/server/service/webhook-service.ts
  • apps/web/src/server/service/webhook-service.unit.test.ts

Walkthrough

This PR updates webhook behavior and docs: adds an email.rendering_failure event in docs and replaces usesend imports with usesend-js; refactors UI action rendering to use a new canActivate boolean for PAUSED/AUTO_DISABLED states and adjusts button disabled logic; changes webhook-service failure handling to perform consecutive-failure increments and potential auto-disable inside a single transaction; and adds comprehensive unit tests covering retries, failure counting, auto-disable, re-enable, and test-call creation.

Possibly related PRs

Suggested labels

codex

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Title check✅ PassedThe pull request title accurately summarizes the main changes: fixing premature webhook auto-disable logic and enabling re-enable functionality for auto-disabled webhooks, which aligns with the core objectives of the changeset.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@cloudflare-workers-and-pages

cloudflare-workers-and-pagesBot commented Feb 27, 2026

Copy link
Copy Markdown

Deploying usesend with Cloudflare Pages Cloudflare Pages

Latest commit:55c9d56
Status:⚡️ Build in progress...

View logs

Only increment consecutive failure counters after a call exhausts retries, while keeping the 30-call auto-disable threshold and stale-state protection.
Mock limit service in webhook unit tests so Vitest does not resolve team-service and mailer paths requiring usesend-js during CI.
@KMKoushik
KMKoushik merged commit edcd32a into mainFeb 27, 2026
3 of 4 checks passed
@KMKoushik
KMKoushik deleted the fix/webhook-auto-disable-reenable branch February 27, 2026 20:40
Sign up for freeto 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

@KMKoushik