Matthew Meszaros
77194fb460
feat: animate folding the sidebar's Email, CRM and Resources sections row by row, keep the current page visible in a folded section, flag an Advisor finding on the rows a section hides with a dot on its header, widen the header into a full-width target with a hover chevron, key the fold state by stable section ids inside the persisted warmbly-storage, and update the unibox layout guide
2026-09-29 01:33:20 -07:00
Skylinerffm97 and Claude Opus 5.5
032eb04fba
web(nav): announce the current page in a folded section to screen readers, document collapsible sections
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-09-28 21:35:35 +02:00
Skylinerffm97
8ff5a81c16
web(nav): hide collapsed sections in the rail too, except the active page
2026-09-28 21:27:22 +02:00
Skylinerffm97
d14605b57f
web(nav): make the Email, CRM and Resources sections collapsible
2026-09-28 21:27:22 +02:00
Matthew Meszaros
4c1fc9604b
Merge pull request #729 from warmbly/fix/cloud-warmup-standing-gates
...
feat: hold Warmbly Cloud's warmup standing on a linked self-hosted instance so campaign gates, pacing, lifecycle and account health enforce a cloud quarantine, block or throttle
v0.6.12
2026-09-28 17:58:49 +00:00
Matthew Meszaros
d1aa7ca399
feat: rank any warmup standing past its term, throttles included, below a live one so an unrenewed throttle cannot mask an active cloud standing
2026-09-28 10:48:14 -07:00
Matthew Meszaros
92ff20155b
Merge pull request #730 from warmbly/fix/warmup-plan-entitlements
...
feat: limit the Warmup plan to the premium pool and uncapped mailboxes, and lock sending, inbox, AI and integrations behind a plan that sends
2026-09-28 16:36:08 +00:00
Matthew Meszaros
f9ef16a36b
feat: let a Stripe subscription to a sending plan outrank a Warmup plan grant, report the daily send cap from the sender's own gate (unlimited when uncapped) and refuse a daily-send request that would cap an unlimited plan, detect the Warmup plan by id in the dashboard, show a mailbox override on the Warmup plan card, fall back to period length for the yearly price, derive WarmupPlanID from config, and correct the billing guide on what the server refuses
2026-09-28 09:24:27 -07:00
Matthew Meszaros
07725257ee
feat: rank a warmup hold past its end below any live standing so an ended quarantine cannot mask an active cloud throttle
2026-09-28 09:23:06 -07:00
Matthew Meszaros
a268e3c54a
feat: limit the Warmup plan to the premium pool and uncapped mailboxes by gating sending, the inbox, AI, integrations, placement tests and paid storage on a plan that sends (HasProductPlan, with HasPremiumWarmup for pool placement), report 0 daily sends and refuse non-mailbox limit requests for workspaces that do not send, lock Warmup workspaces in the dashboard like free ones, show only the mailbox meter for them, and show the yearly price on yearly subscriptions
2026-09-28 09:16:42 -07:00
Matthew Meszaros
32a58f5a35
Merge pull request #728 from warmbly/fix/inbox-sidebar-contact-match
...
feat: resolve the unibox contact panel's sender through the thread's campaign send when the reply comes from another address
2026-09-28 16:08:46 +00:00
Matthew Meszaros
0fd8cd2a25
Merge pull request #727 from warmbly/fix/imap-warmup-filing-session
...
feat: serialize every IMAP sync step with warmup actions on the shared session and re-open the sync's folder after an action, so a warmup MOVE always runs against the folder it selected and filing into the Warmbly folder lands on servers like Zoho
2026-09-28 16:05:27 +00:00
Matthew Meszaros
53327384b7
feat: carry review-required cloud blocks and the later end of an equal cloud hold into the local pool, keep a cloud hold through a failed unenroll, leave standing changes to the sync so each fires its webhook, skip unchanged standings, read risk bands through the standing-aware health read, report failed standing syncs on the job panel, and document the source field in openapi.json
2026-09-28 09:05:11 -07:00
Matthew Meszaros
b3518dd775
feat: resolve the unibox contact panel's sender through the thread's campaign send when the reply comes from an address that is not a contact (alias, second domain, forward, or another workspace mailbox), via thread_id and account_id on GET /contacts/lookup with a match field, gated on unibox access and the API key mailbox allowlist, show a Replied from line and keep a loaded contact on a failed refetch, skip every workspace mailbox when picking the other party, apply the same match to Pause follow-ups when answering the sender, and document it
2026-09-28 09:03:19 -07:00
Matthew Meszaros
a5def657b9
feat: keep the IMAP sync view when re-opening it fails so every later sync step retries or refuses instead of reading the folder a warmup action selected, drop the unused Mailbox select that bypassed the session lock, and shorten the new comments
2026-09-28 09:01:21 -07:00
Matthew Meszaros
a749a8e353
feat: hold Warmbly Cloud's warmup standing on a linked self-hosted instance, syncing each enrolled mailbox's health into cloud_link_mailboxes so campaign gates, send plans, lifecycle, risk pacing, account health and the Advisor enforce a cloud quarantine, block or throttle, fire the usual health webhooks and realtime events, and carry a hold into the local pool on unenroll
2026-09-28 08:46:40 -07:00
Matthew Meszaros
0f16fa60a7
feat: serialize every IMAP sync step with warmup actions on the shared session and re-open the sync's folder after an action, so a warmup MOVE always runs against the folder it selected and filing into the Warmbly folder lands on servers like Zoho
2026-09-28 08:46:19 -07:00
Matthew Meszaros
68e5f290f6
Merge pull request #726 from warmbly/feat/mailbox-cell-classic-look
...
feat: mailbox profile photos, and the classic two-line Accounts mailbox cell
2026-09-28 15:22:57 +00:00
Matthew Meszaros
950f79c224
feat: keep a stored mailbox photo when its admin grant cannot answer even if the inbox vendor has none, hide Accounts tag chips below lg so the mailbox address keeps its width, and say in the mailbox API reference that only grant and vendor photos are re-checked weekly
2026-09-28 08:17:32 -07:00
Matthew Meszaros
6108ef8255
feat: show each mailbox's own profile photo in its drawer header (read at a Microsoft connect, through Google and Microsoft admin grants, and from Zapmail and InboxKit listings, stored as a re-encoded JPEG under avatars/mailboxes with a weekly refresh, migration 000227 and workspace export support), bring back the classic Accounts mailbox cell as two lines with provider-logo avatars and vendor, grant or host chips, and replace the pulsing status and health dots with a text shimmer on live and at-risk states
2026-09-28 08:04:48 -07:00
Matthew Meszaros
215e04bd09
Merge pull request #725 from warmbly/fix/contacts-csv-import
...
feat: run contact file imports as background jobs with a whole-file check, live progress, resumable drafts and a rebuilt import wizard, and show company logos and inbox providers on contact avatars
v0.6.11
2026-09-28 05:26:28 +00:00
Matthew Meszaros
4a68ca783f
feat: answer an out-of-range contact import list limit with the range that endpoint accepts (1 to 100, default 50) instead of the generic limit message
2026-09-27 22:20:48 -07:00
Matthew Meszaros
f8221384f6
feat: let contact file uploads use their own 50 MB cap instead of the global 10 MB one and say when a file is too large, refuse an import list limit below one, hold an imported update to the contact size limit, keep a company logo laid out while it lazy-loads, neutralize formula cells in the sync error download, settle the draft save indicator when an edit is undone, and document the draft save route
2026-09-27 22:10:02 -07:00
Matthew Meszaros
f4f219b7c5
feat: run contact file imports as background jobs (upload once, a whole-file check of new, existing, repeated and invalid rows, a chunked leased runner with live CONTACT_IMPORT_PROGRESS, history, cancel, a draft that autosaves and survives a reload, remembered mappings, and a failed-rows CSV under the file's own headers), match existing contacts across the workspace, batch updates and fail a bad row alone, keep imported verdicts on update, scope every import write to the importing workspace, rebuild the import wizard with icons and inline segment creation, show company logos and the inbox provider on the contact avatar, and hide contact columns the list has no data for
2026-09-27 21:50:10 -07:00
Matthew Meszaros
8b921b3340
Merge pull request #724 from warmbly/feat/placement-seed-choice-quick-pace-credits
...
feat: let a placement test target chosen seed inboxes or providers, add a quick pace that sends copies seconds apart, charge credits with explicit consent for tests past the monthly free allowance with automatic refunds for tests that deliver nothing, and add a Seeds picker to the compose window
2026-09-28 04:22:55 +00:00
Matthew Meszaros
b716164393
feat: settle every finished paid placement test once with the credits it got back recorded, refund an ambiguous charge's own key and clean up after a refused charge past request cancellation, net keyed refunds against the charge they return in spend windows, leave an unreadable balance to the server, show the server's seed and budget refusals, and renumber the migration to 000224 after 000223 landed on main
2026-09-27 21:17:40 -07:00
Matthew Meszaros
62fac73c3d
feat: write a paid placement test before charging it and roll it back on a refused charge, take the agreed price as max_credits, refuse hand-picked seeds the sender's day cannot cover or that are not connected by name, refund only what a monthly reset has not expired and net refunds out of spend limits, bound the refund pass with a partial index, and re-filter a cloud panel's seeds by provider
2026-09-27 21:16:12 -07:00
Matthew Meszaros
4924d2c88d
feat: let a placement test target chosen seed inboxes or providers, add a quick pace that sends copies seconds apart, charge credits with explicit consent for tests past the monthly free allowance with automatic refunds for tests that deliver nothing, and add a Seeds picker to the compose window
2026-09-27 21:16:12 -07:00
Matthew Meszaros
c4db732af5
Merge pull request #723 from warmbly/feat/mailbox-list-and-major-inbox-rate
...
feat: warmup inbox rate at the major providers only, and a Leads-style Accounts mailbox list
2026-09-28 03:52:12 +00:00
Matthew Meszaros
e1ef617306
Merge pull request #722 from warmbly/feature/inbox-tagging-ooo-return-date
...
feat: let inbox tagging confirm an out-of-office return date before the hold uses it
2026-09-28 03:48:37 +00:00
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
f9b15b3942
feat: read an out-of-office return date for inbox tagging from the body or, when the body is empty, the snippet, the same text the hold parses, so a message synced without a body still gets its date confirmed
2026-09-27 20:40:35 -07:00
Matthew Meszaros
55c5bdcf61
feat: let inbox tagging confirm an out-of-office return date by asking whether the phrase the parser read it from says when the sender is back, send the hold to the workspace fallback on a clear no below 0.40, store the date asked about in a new inbox_tag_results.return_date column (migration 000223), and show the date and answer on the tagging review page
2026-09-27 20:28:44 -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