Matthew Meszaros
25075fcdd8
feat: take the warmup inbox rate and its daily rolling line at Google, Microsoft and Yahoo only (small hosts ride beside it and never make the headline), and rebuild the Accounts mailbox list in the Leads style with host logos, sender and connection line, a status naming whether the mailbox is sending, warming or both, sortable Sent today, animated Warmup, Inbox and pulsing Health columns, with docs and OpenAPI updated
2026-09-27 20:40:45 -07:00
Matthew Meszaros
f45c4552eb
Merge pull request #720 from warmbly/fix/revived-dates-and-release-tag
...
feat: revive only whole timestamps, keep equal Dates across refetches, and type revived timestamps as Date
2026-09-27 13:41:34 +00:00
Matthew Meszaros
ea5dd435d7
feat: revive only whole RFC3339 timestamps (never custom field values or text that starts with a date), keep equal revived Dates across React Query refetches so unchanged data keeps its identity, type every revived response timestamp in the dashboard models as Date, reset the launch dialog only when a different campaign opens, show the build on the page error panel, and tag Cloudflare Pages dashboard and admin builds with their commit as the release
2026-09-27 14:59:06 +02:00
Matthew Meszaros
4587b475ca
Merge pull request #718 from warmbly/fix/warmup-mailbox-selection-cap
...
feat: page every list to the end: fix keyset cursors that dropped a row per page, load all mailboxes and campaigns in the dashboard, and stop offering unlimited limits on Settings > Limits
v0.6.10
2026-09-27 12:26:15 +00:00
Matthew Meszaros
8590f417b8
feat: point keyset list cursors at the last row returned so mailbox, campaign, API key, API key usage, contact note, activity, deal and CRM task lists stop dropping one row at every page boundary, let campaign search report a next page, page campaigns to the end in the dashboard through a shared useAllPages hook, and hold the Settings > Limits form until the limits load
2026-09-27 05:11:24 -07:00
Matthew Meszaros
d2ccf21af5
feat: load every mailbox page in useEmails so the Accounts list, its counts, select-all and bulk warmup, the sidebar count and the campaign sender picker cover workspaces past 50 (and 200) mailboxes, show a loading row and a retry when later pages are pending or fail, and have Settings > Limits show usage against each limit, leave out limits the plan already has unlimited, and point to a pending request instead of letting a duplicate be filed
2026-09-27 05:11:24 -07:00
Matthew Meszaros
1dbbee61c6
Merge pull request #716 from warmbly/feat/localized-optout-and-unsubscribe-page
...
feat: read opt-out replies and serve the unsubscribe page in every tagging language
2026-09-27 12:10:48 +00:00
Matthew Meszaros
e0bab213e7
feat: refuse an Accept-Language qvalue outside 0 to 1, NaN included, in both the backend and the tracking proxy so the two always pick the same unsubscribe page language
2026-09-27 05:06:41 -07:00
Matthew Meszaros
5e745618b1
feat: read opt-out replies in every tagging language with a phrase list per language, quote markers for the 16 tagging languages that had none, and a matcher that folds accents and handles scripts without spaces, and serve the recipient-facing unsubscribe pages (backend and tracking-domain proxy) in the browser's language across all tagging languages with right-to-left layout and an English fallback
2026-09-27 04:54:57 -07:00
Matthew Meszaros
98f8841347
Merge pull request #714 from Skylinerffm97/fix/german-return-dates
...
fix(replyclassify): read German return dates after a weekday, in calendar weeks and at the end of a range
2026-09-27 11:53:31 +00:00
Matthew Meszaros
62dce33b17
Merge pull request #715 from warmbly/fix/campaign-overview-date-range
...
feat: read revived Date timestamps as Dates across the dashboard (fixes the campaign overview crash)
2026-09-27 11:53:26 +00:00
Matthew Meszaros
0b8112f82c
feat: read revived Date timestamps as Dates in the dashboard so the campaign overview's All time period, a segment with a before/after date condition, the deal edit dialog's close date, the warmup drawer's date range, the A/B variant editor's unsaved draft and the scheduled-send tooltip no longer crash, blank or render raw Date text
2026-09-27 04:45:27 -07:00
Matthew Meszaros
8594eda3a2
Merge pull request #713 from Skylinerffm97/fix/not-interested-is-negative
...
fix(replyclassify): read "not interested" as a negative reply
2026-09-27 11:38:24 +00:00
Matthew Meszaros
a09b7df0d1
Merge pull request #712 from Skylinerffm97/feat/german-opt-out-replies
...
feat(replyclassify): read German opt-out replies
2026-09-27 11:38:23 +00:00
Matthew Meszaros
25ec1aceca
feat: keep a German "ab" date and a sentence that opens on "Bis" as two statements in ParseReturnDate by marking the capitalized sentence start before lower-casing
2026-09-27 04:37:26 -07:00
Skylinerffm97 and Claude Opus 5.5
618099d689
fix: read German return dates after a weekday with a comma ("ab Montag, 12.10.", "ab Montag, den 12.10.") for every workday instead of only "ab Montag den", read calendar weeks ("ab KW 42" as that week's Monday, "bis KW 41" and "bis KW 40/41" as the Monday after the last week, a week under way as back now), and take the end of an "ab ... bis ..." range instead of its first day unless a sentence or a return word comes between, so these out-of-office replies hold a lead until the day they name instead of the flat fallback or the start of the absence
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-09-27 10:59:23 +00:00
Skylinerffm97 and Claude Opus 5.5
89b8e9790a
fix: count a German GDPR objection only when the writer objects in the first person and the same sentence goes on to what is objected to behind an article (der Verarbeitung, dem Erhalt weiterer E-Mails, jeglicher Kontaktaufnahme), so a formal disagreement like "ich widerspreche hiermit Ihrer Preisberechnung" and a signature's privacy notice ("Sie können der Verarbeitung jederzeit widersprechen") stay normal replies, while objections worded with "ausdrücklich", "gem. Art. 21 DSGVO" or a compound like "Datenverarbeitung" still opt out
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-09-27 10:59:03 +00:00
Skylinerffm97 and Claude Opus 5.5
1ba3d5df9d
fix: read "not interested" and the other declined-interest replies (aren't, not really, not that, no longer, would not be, uninterested) as negative before the interest phrases, whose "interested" took them for positive replies and sent people who said no down a campaign's positive-reply branch
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-09-27 10:44:38 +00:00
Skylinerffm97 and Claude Opus 5.5
fad04c5efc
feat: read German opt-out replies (bitte austragen, keine weiteren E-Mails, löschen Sie meine Daten, a GDPR objection and more) in the reply opt-out check and the lexicon layer, bind meeting-sense words like abmelden and austragen to bitte or the writer, always cut the German quote markers before reading opt-out so the sender's own German opt-out line in an Outlook, GMX/web.de or T-Online quote never opts anyone out, add GMX's date-first header block and the Original-Nachricht divider to the German rules, fold umlauts and line breaks before matching, and mention German replies in the unsubscribe guide
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-09-27 10:00:47 +00:00
Matthew Meszaros
b18e11b35b
Merge pull request #711 from warmbly/feat/business-only-checkout
...
feat: sell Warmbly to businesses only at checkout and in the terms
v0.6.9
2026-09-27 09:38:55 +00:00
Matthew Meszaros
c2f8b03371
feat: word the business-only checkout notice so an untaxed sale leaves any tax due to the buyer in its own country, with the reverse charge as one example rather than the only case
2026-09-27 11:33:35 +02:00
Matthew Meszaros
4e68bb2562
feat: sell Warmbly to businesses only by requiring the buying company's legal name on the subscription and credit-pack Stripe Checkout sessions with a business-only and tax-exclusive notice beside the pay button, adding business-use and tax clauses to section 06 of the terms of service, and updating the billing guide to match
2026-09-27 11:10:46 +02:00
Matthew Meszaros
6146090fcc
Merge pull request #709 from warmbly/fix/warmup-throttle-stays-in-pool
...
feat: keep a throttled warmup mailbox in the pool and re-judge every mailbox when the consumer starts
2026-09-27 08:55:53 +00:00
Matthew Meszaros
c4f0ffffc2
feat: keep a throttled warmup mailbox in the pool by stamping blocked_at only for a quarantine or block in UpdateParticipantHealth, clear it from throttled rows in migration 000222 so partner selection and the admin pool counts stop treating a throttle as a block, and run the warmup health sweep on consumer boot so a release that changes the rules re-judges every mailbox at once
2026-09-27 10:09:01 +02:00
Matthew Meszaros
8c0cb9759e
Merge pull request #708 from warmbly/fix/recent-posthog-errors
...
feat: handle the error classes recently reported to PostHog across signup, DEK creation, IMAP classification, boot migrations and the dashboard
v0.6.8
2026-09-27 06:37:22 +00:00
Matthew Meszaros
208481f9a4
feat: answer a signup for an existing address with 409 conflict and let a concurrent SSO first sign-in resolve against the account it raced, adopt the stored organization DEK when a parallel first use stored one first, classify IMAP SERVERBUG, LIMIT, bare read-command failures and provider ALERT/EXPIRED responses as server-unreachable, throttle or credentials errors and keep the ALERT text, wait up to two minutes for a free connection slot before the boot migration gives up, guard the dashboard's DOM mutations against browser page translation, treat an aborted passkey sign-in as a cancellation, and drop posthog-js request timeouts from error tracking
2026-09-27 08:26:55 +02:00
Matthew Meszaros
49e7fec849
Merge pull request #707 from warmbly/feature/campaign-analytics-date-range
...
feat: date range filtering for campaign analytics as a send cohort
2026-09-27 06:16:54 +00:00
Matthew Meszaros
ce6f56348b
feat: show the campaign overview and its share export as loading while a new reporting period replaces the previous one, instead of the previous period's figures under the new period's label
2026-09-26 23:11:10 -07:00
Matthew Meszaros
f00591b6e1
feat: read a campaign's first send inside the summary query instead of a separate untenanted lookup, file campaign hourly stats under the same UTC day as the daily series, treat any instant passed as a campaign period day as its calendar day, share one from/to parser between the analytics API and get_campaign_stats, chart All time from the campaign's creation day alongside the summary so an analytics error cannot leave the overview loading, and roll period presets over at UTC midnight
2026-09-26 23:00:30 -07:00
Matthew Meszaros
15b88d6579
Merge pull request #706 from warmbly/fix/warmup-placement-slows-only
...
feat: make warmup spam placement only slow a mailbox down and judge it only at Google, Microsoft and Yahoo, while still showing other hosts
2026-09-27 05:47:17 +00:00
Matthew Meszaros
0b809dee40
feat: scope campaign analytics to an optional from/to send cohort (summary, step performance, engagement and the daily chart read the same UTC days, total_contacts and emails_pending stay campaign-wide, date_range reports the resolved period), count the whole last day in campaign compare and daily stats, add a 7d/30d/90d/all-time/custom period picker to the campaign overview and its share image, take the period in get_campaign_stats, the warmbly and warmblyctl CLIs and the Make and Zapier modules, close a date picker's calendar alone on Escape, and document it in the analytics guide, API reference, MCP table and OpenAPI
2026-09-26 22:42:19 -07:00
Matthew Meszaros
57725e81ef
feat: describe the all-host placement headline as the fallback when Google, Microsoft and Yahoo have fewer than the sample, and say the mailbox's standing is still judged at those three, in the placement tab and the WarmupPlacement type
2026-09-26 22:37:40 -07:00
Matthew Meszaros
81c578a879
feat: keep watch and throttled mailboxes in cold rotation at their dampened volume and rest only quarantined or blocked ones, hold a watch or throttle past its line only when placement set it, fall back to the all-host headline when the major providers lack a sample without capping health on it, count a partner's junked mail through its own receipts, reset the released ledger rows' standing, and correct the resting, rolling-rate and scope docs
2026-09-26 22:26:58 -07:00
Matthew Meszaros
2b1a35dfe1
feat: make warmup spam placement only slow a mailbox down (watch at 10%, half-volume throttle at 20%, never quarantine, block or appeal) and judge it only at Google, Microsoft and Yahoo over verified deliveries, keep small-host spam out of the health bands, warmup and cold ramps and the advisor while still showing it beside the headline rate on the drawer and Deliverability, draw small-host partners whose own filter junks warmup mail less often, send each quarantine or block webhook once plus health_changed, release placement-only quarantines in 000220, and update the warmup, deliverability, advisor and API docs
2026-09-26 22:26:58 -07:00
Matthew Meszaros
0550d2ec92
Merge pull request #704 from warmbly/fix/org-path-drift-and-membership
...
feat: end a removed member's sessions and OAuth app grants through a removal hook detached from the request, refuse OAuth tokens whose holder is no longer a member, clear and detach a session selection that outlived its membership, gate subscription checkout, portal and cancel on manage_billing in the API and the dashboard, re-read org channel permissions live on member, role and ownership changes and withhold gated events while they cannot be read, drop the unrouted GitHub releases webhook handler, and correct v1 and release trigger paths in the docs
2026-09-27 05:13:57 +00:00
Matthew Meszaros
1b45c630bb
feat: end a removed member's sessions and OAuth app grants through a removal hook detached from the request, refuse OAuth tokens whose holder is no longer a member, clear and detach a session selection that outlived its membership, gate subscription checkout, portal and cancel on manage_billing in the API and the dashboard, re-read org channel permissions live on member, role and ownership changes and withhold gated events while they cannot be read, drop the unrouted GitHub releases webhook handler, and correct v1 and release trigger paths in the docs
2026-09-26 22:07:54 -07:00
Matthew Meszaros
fcb303e5b9
Merge pull request #705 from warmbly/fix/action-required-automated-mail-visibility
...
feat: keep automated notifications that need the recipient's action in the inbox with an Action required label, view and notification
2026-09-27 04:45:43 +00:00
Matthew Meszaros
faa9cac061
feat: release a notification for retry when only workspace questions were asked and the call failed, count an unasked notification recheck as failed, read the workspace languages when skipping empty notices, and keep a built-in label name valid only on the question that already saved it
2026-09-26 21:40:42 -07:00
Matthew Meszaros
a1a574524d
Merge pull request #703 from warmbly/feat/session-org-membership
...
feat: scope every session request to a workspace its user is still a member of, deselect a removed member's workspace on all their sessions, disconnect their realtime sockets on removal, and correct the singular /organization paths in the API docs
2026-09-27 04:40:10 +00:00
Matthew Meszaros
9d0f60801c
feat: file an offline notification unasked when the action check fails, bring a reopened verdict's message back to the inbox, skip empty notices and require the built-in check on --recheck-notifications, keep workspace labels saved before a built-in took the name, keep the sender's subject out of the action-required notification and send it off the ingest path, and default omitted outreach settings fields on PATCH
2026-09-26 21:36:11 -07:00
Matthew Meszaros
354d0c27e7
Merge remote-tracking branch 'origin/main' into feat/session-org-membership
2026-09-26 21:30:03 -07:00
Matthew Meszaros
86c5a06893
feat: disconnect a removed member's realtime sockets from the event broadcaster so campaign and account channels end too, and keep invalidating the remaining cached sessions when one invalidation fails
2026-09-26 21:30:03 -07:00
Matthew Meszaros
90f3f57eb9
feat: keep automated notifications that need the recipient's action (failed payment, suspended account, suspicious sign-in, sending limit, expiring service) in the inbox with an Action required label, view and mail-that-needs-action notification, let workspace tagging questions also run on automated notifications, add warmblyctl inbox-tag backfill --recheck-notifications, and document it
2026-09-26 21:28:06 -07:00
Matthew Meszaros
18d57e45eb
Merge pull request #701 from Maris-Business-Solutions/fix/org-risk-endpoint-path
...
feat: call the workspace risk endpoint at /organization/current/risk in getOrganizationRisk so the sending-restricted banner loads instead of 404ing
2026-09-27 04:20:50 +00:00
Matthew Meszaros
2df8991db5
feat: scope every session request to a workspace its user is still a member of, deselect a removed member's workspace on all their sessions, disconnect their realtime sockets on removal, and correct the singular /organization paths in the API docs
2026-09-26 21:18:49 -07:00
Claude
2ac54e66b5
feat: call the workspace risk endpoint at /organization/current/risk in getOrganizationRisk so it matches the backend org route group and the sending-restricted banner loads instead of 404ing
2026-09-27 01:25:28 +02:00
Matthew Meszaros
d95a1075de
Merge pull request #699 from warmbly/feature/contact-email-provider
...
feat: detect each contact's inbox provider from its domain's MX and SPF, show, sort and filter it across contact lists and segments, and use it for campaign ESP matching
2026-09-26 13:52:02 +00:00
Matthew Meszaros
2c156ec07e
feat: hold the contact provider sweep lease by owner token with a compare-and-delete and end each run before it can expire, recognise Microsoft 365 tenant onmicrosoft.com domains for ESP matching, count checked domains with no known provider with other rather than undetected, and report an unknown-provider filter when saving it as a segment
2026-09-26 06:47:29 -07:00
Matthew Meszaros
67a7cf9811
Merge pull request #698 from warmbly/feat/warmup-placement-by-host
...
feat: weight warmup partners by the sender's verified spam rate per recipient mail host instead of per address domain, report deliverability warmup placement and the placement_in_spam webhook by mail host, mark IMAP warmup mail not-junk before it leaves Junk, send single-part text mail over SMTP with a fixed header order, and update the warmup, deliverability, analytics, webhook and OpenAPI docs
2026-09-26 13:45:11 +00:00
Matthew Meszaros
e7ce03f17e
feat: send a lone text body as a direct child of multipart/mixed when an SMTP message carries attachments, keeping multipart/alternative only when both text and HTML bodies are present
2026-09-26 06:41:12 -07:00