Commit Graph

  • 3290360333 feat: keep the Gmail folder reconciliation going past a message Gmail refuses, list the inbox by label, remove rows Gmail no longer has, retry a failed pass after 15 minutes, report each Gmail move once per tick, answer the internal listing with a fixed error, and keep the conversation open when widening to All mail Matthew Meszaros 2026-09-29 10:39:13 -07:00
  • d902fc226e Merge pull request #744 from Skylinerffm97/feat/unibox-scope-rail-customize Matthew Meszaros 2026-09-29 17:33:41 +00:00
  • fd8b9ac844 feat: animate the unibox scope rail (row folds, sliding active highlight, edit-mode swap), let people drag or keyboard-reorder Mail and Views rows and move whole sections, add row and section menus with right-click, hide-with-undo and reset, and give the shared PopoverMenu pointer anchoring, arrow-key and typeahead navigation and focus return Matthew Meszaros 2026-09-29 10:30:03 -07:00
  • 505d10cdc8 Merge pull request #747 from warmbly/fix/sidebar-rail-and-lead-checkboxes Matthew Meszaros 2026-09-29 17:23:19 +00:00
  • b0408cf5a0 Merge pull request #749 from warmbly/fix/import-file-cells-stay-text Matthew Meszaros 2026-09-29 17:23:12 +00:00
  • a8f0787ab5 Merge pull request #746 from warmbly/feat/lead-cc Matthew Meszaros 2026-09-29 17:20:11 +00:00
  • ca66b25d8d feat: register the release's bus schemas from the booting backend and hold the fleet on its current release until the backend runs the new one and the schema registry accepts them, check every published schema against a recorded snapshot in CI (make schemas) so a change the registry would refuse fails before merge, pin a FORWARD or FULL registry subject to BACKWARD on refusal, bound advisor narration so the run still lands, store unlabelled 8-bit mail with its invalid UTF-8 replaced, treat a pending or credential-less passkey ceremony as a cancellation, and drop link-scanner rejections from site error tracking Matthew Meszaros 2026-09-29 19:20:07 +02:00
  • f3004510f1 feat: keep uploaded file cells (import preview sample rows, column samples and headers, failed-row emails and values) as text in the dashboard API client instead of reviving timestamp-shaped cells into Dates that crash the contact import mapper Matthew Meszaros 2026-09-29 10:19:50 -07:00
  • d99a09825f feat: run one inbox placement test across many sending mailboxes as a placement batch (issue #736): server-side sender scopes (a campaign's senders or the whole workspace, filtered by provider, domain, tag and untested days) and sampling (random, percent stratified by provider or domain, per domain, per provider) snapshotted at creation, a runner that starts senders under per-workspace and instance-wide concurrency and a start rate with defer or skip for unavailable mailboxes, aggregate placement by sending domain, sending provider and recipient provider, fleet coverage, cancel, credits agreed per batch, org transfer, operator settings in the admin panel, dashboard pages and dialog, CLI commands, agent tools, OpenAPI and docs Matthew Meszaros 2026-09-29 10:19:46 -07:00
  • 39ccb8ad27 feat: keep sidebar icons and the profile avatar at one position while the rail collapses by matching the row and avatar margins and padding in both shapes, and use the shared sky Checkbox for the new campaign flow's lead-list cards and the placement seed chooser instead of black check squares Matthew Meszaros 2026-09-29 10:19:35 -07:00
  • 5fdb2e40a5 feat: keep a refused lead copy from spending the lead's send attempts, drop campaign-wide CC and BCC addresses that bounced on the campaign, resolve copies only for email steps, fail a reply or link unsubscribe when the lead's copies cannot be read instead of guessing, credit a copy's message to a lead only when it replies in a thread, show each copy's status in the Leads CC badge, and close the CC picker on Escape from any focused child Matthew Meszaros 2026-09-29 10:11:17 -07:00
  • 0ed98a8c55 feat: copy up to two colleagues on every email a campaign sends one lead (campaign_lead_cc, migrations 000230-000231) with a drawer CC editor that suggests same-company contacts, hold a copied contact's own lead so nobody gets two threads, count a copy's reply as the lead's, opt out every copy on a link unsubscribe, drop a bounced or refused copy without bouncing the lead, skip suppressed campaign CC and BCC addresses, and document the endpoints, CLI, skills and OpenAPI Matthew Meszaros 2026-09-29 09:53:27 -07:00
  • e2f319cfd8 feat: file Gmail mail where Gmail moves it (archive, delete, spam, back to inbox) via an UPDATE_FOLDER event resolved against provider_folder, repair rows already stranded in the unibox Inbox with a six-hourly Gmail folder reconciliation, and close the open unibox conversation on a scope change with a close button in the reader header Matthew Meszaros 2026-09-29 09:43:13 -07:00
  • a772868577 feat: render each seed's copy of a placement tracking comparison once, seal it with the workspace key in placement_renders, and send it from both halves so the pixel and wrapped links are the only difference, with a refusal frozen for the pair, the copy pruned when the comparison ends, excluded from workspace exports, and documented in the placement, export and data-control pages Matthew Meszaros 2026-09-29 09:34:32 -07:00
  • 4cffd2259e web(unibox): one Mail block without the gap, and a quiet pencil that darkens on hover Skylinerffm97andClaude Opus 5.5 2026-09-29 16:27:47 +02:00
  • daebe3bf20 web(unibox): slate-500 for the hidden-rows hint and the pencil at rest (4.7:1) Skylinerffm97andClaude Opus 5.5 2026-09-29 16:05:51 +02:00
  • b4b6595f47 web(unibox): read the hidden-rows hint with the pencil and give both the header label's weight Skylinerffm97andClaude Opus 5.5 2026-09-29 16:01:33 +02:00
  • 2fcd90291a web(unibox): edit rail rows with a pencil and show how many are hidden Skylinerffm97andClaude Sonnet 5.5 2026-09-29 15:51:41 +02:00
  • 9f06aa4f1c web(unibox): say highlighted count in the rail's dot comments too Skylinerffm97andClaude Opus 5.5 2026-09-29 15:31:09 +02:00
  • d2304d9444 web(unibox): tighten the scope rail's folded dot, edit-mode focus and a11y Skylinerffm97andClaude Opus 5.5 2026-09-29 15:27:47 +02:00
  • e4988e3e5f web(unibox): fold the scope rail sections and let people hide Mail and Views rows Skylinerffm97andClaude Sonnet 5.5 2026-09-29 15:12:08 +02:00
  • 06db0c7cf5 Merge pull request #738 from warmbly/feat/campaign-create-flow v0.6.13 Matthew Meszaros 2026-09-29 12:19:52 +00:00
  • 92504896bf Merge pull request #737 from warmbly/fix/warmup-removal-verification Matthew Meszaros 2026-09-29 12:19:15 +00:00
  • 1846661218 feat: keep leads a segment link enrolled but that left the segment in the draft audience count, fall back to the default window when a saved one runs backwards, and leave a draft's steps untouched when a step the flow did not load or create appears Matthew Meszaros 2026-09-29 05:14:07 -07:00
  • ad4104c57a feat: never add a warmup strike from a recheck (confirm it, or withdraw it when the message is still in the mailbox or retention removed it since), revise a tampering hold before its strike is deleted so a retry completes it, compare-and-swap the revision on the hold's term, scope the ledger revision to the whole address, keep tampering events 37 days so a live hold's strikes survive pruning, answer an inconclusive search as unknown so IMAP rechecks stop, and return an IMAP transport failure as an error Matthew Meszaros 2026-09-29 05:12:36 -07:00
  • deea70fd42 feat: anchor the campaign estimate timeline tooltip on the hovered bar instead of a fraction of the row width Matthew Meszaros 2026-09-29 05:03:38 -07:00
  • 4d5a4e34e3 Merge remote-tracking branch 'origin/main' into fix/warmup-removal-verification Matthew Meszaros 2026-09-29 04:57:45 -07:00
  • e5eb3b0ff1 feat: re-decide a withdrawn warmup tampering hold on the strikes left in the seven days before it was imposed (on the pool row, or the reputation ledger for a mailbox out of every pool), stamp an old strike verified only when a worker answers its search and ask again after six hours, retry a removal check for a mailbox still loading, redeliver a failed strike, search IMAP folders in one session hold, and share the Message-ID search helpers Matthew Meszaros 2026-09-29 04:57:45 -07:00
  • b6075391a3 feat: count only a draft's non-segment leads alongside its chosen lists in the campaign estimate and fill unsent estimate settings from the saved campaign, keep branches added on the Steps tab while the new campaign flow is open, renumber automatic step names, and read a draft's lead count without analytics access Matthew Meszaros 2026-09-29 04:52:37 -07:00
  • 9ed3c6eaae feat: keep campaigns.kind until every node stops reading it, count a saved draft's own leads and hand-picked senders in the campaign estimate via campaign_id with the 08:00-18:00 window as the default, make a failed draft save retry as an update, keep Steps-tab step names, gate draft reopening on manage campaigns and save schedule-only edits on close Matthew Meszaros 2026-09-29 04:43:25 -07:00
  • 6bdef4c3f5 Merge pull request #732 from Skylinerffm97/feat/collapsible-nav-sections Matthew Meszaros 2026-09-29 11:39:53 +00:00
  • 0c0b932691 feat: mark the sidebar row for the current page with aria-current so a folded section announces where you are, and assert in the unibox layout test that the collapsed rail keeps its label in the link as a faded column rather than an sr-only span Matthew Meszaros 2026-09-29 04:28:59 -07:00
  • c5a981d86c feat: record a warmup deletion strike only after the worker searches the mailbox and finds the message in the trash or gone, so a move reported as a removal (Graph, a provider filter, a mailbox rule, a second Warmbly instance, our own filing) is never charged, withdraw strikes whose message is still in the mailbox and lift the pause or block they imposed, recheck deletion strikes recorded before the search once via warmup_tampering_events.verified_at (000229), and clarify the tampering reasons and warmup guide Matthew Meszaros 2026-09-29 04:28:34 -07:00
  • bed5194d66 feat: animate collapsing the sidebar to its icon rail by morphing each nav row, the collapse toggle and the profile card in place (icons hold position while labels fade and clip), shrinking the section headers away, folding out rail sections with nothing left to show, and cross-fading the live stats panel with an eased height Matthew Meszaros 2026-09-29 01:49:38 -07:00
  • f88ecd7b4c feat: rebuild the new campaign flow as Leads, Emails, Schedule and Review with a lead-list picker, the full step editor and a live launch plan, keep unlaunched campaigns as server drafts that reopen in the flow from the campaigns list and a Continue setup button, simulate POST /campaigns-estimate day by day under warmup graduation, warmup mail sharing the send spacing, other campaigns, health holds and follow-up waits, retire one-time emails (migration 000229 drops campaigns.kind, the list type filter and badge go), enlarge the step subject field, and lift the editor popovers above dialogs Matthew Meszaros 2026-09-28 09:40:41 -07:00
  • 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 Matthew Meszaros 2026-09-29 01:33:20 -07:00
  • 032eb04fba web(nav): announce the current page in a folded section to screen readers, document collapsible sections Skylinerffm97andClaude Opus 5.5 2026-09-28 21:35:35 +02:00
  • 8ff5a81c16 web(nav): hide collapsed sections in the rail too, except the active page Skylinerffm97 2026-09-28 00:57:08 +02:00
  • d14605b57f web(nav): make the Email, CRM and Resources sections collapsible Skylinerffm97 2026-09-28 00:12:13 +02:00
  • 4c1fc9604b Merge pull request #729 from warmbly/fix/cloud-warmup-standing-gates v0.6.12 Matthew Meszaros 2026-09-28 17:58:49 +00:00
  • 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 Matthew Meszaros 2026-09-28 10:48:14 -07:00
  • 92ff20155b Merge pull request #730 from warmbly/fix/warmup-plan-entitlements Matthew Meszaros 2026-09-28 16:36:08 +00:00
  • 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 Matthew Meszaros 2026-09-28 09:24:27 -07:00
  • 07725257ee feat: rank a warmup hold past its end below any live standing so an ended quarantine cannot mask an active cloud throttle Matthew Meszaros 2026-09-28 09:22:00 -07:00
  • 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 Matthew Meszaros 2026-09-28 09:16:42 -07:00
  • 32a58f5a35 Merge pull request #728 from warmbly/fix/inbox-sidebar-contact-match Matthew Meszaros 2026-09-28 16:08:46 +00:00
  • 0fd8cd2a25 Merge pull request #727 from warmbly/fix/imap-warmup-filing-session Matthew Meszaros 2026-09-28 16:05:27 +00:00
  • 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 Matthew Meszaros 2026-09-28 09:05:11 -07:00
  • 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 Matthew Meszaros 2026-09-28 09:03:19 -07:00
  • 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 Matthew Meszaros 2026-09-28 09:01:21 -07:00
  • 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 Matthew Meszaros 2026-09-28 08:46:40 -07:00
  • 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 Matthew Meszaros 2026-09-28 08:46:19 -07:00
  • 68e5f290f6 Merge pull request #726 from warmbly/feat/mailbox-cell-classic-look Matthew Meszaros 2026-09-28 15:22:57 +00:00
  • 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 Matthew Meszaros 2026-09-28 08:17:32 -07:00
  • 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 Matthew Meszaros 2026-09-28 08:04:48 -07:00
  • 215e04bd09 Merge pull request #725 from warmbly/fix/contacts-csv-import v0.6.11 Matthew Meszaros 2026-09-28 05:26:28 +00:00
  • 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 Matthew Meszaros 2026-09-27 22:20:48 -07:00
  • 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 Matthew Meszaros 2026-09-27 22:10:02 -07:00
  • 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 Matthew Meszaros 2026-09-27 21:50:10 -07:00
  • 8b921b3340 Merge pull request #724 from warmbly/feat/placement-seed-choice-quick-pace-credits Matthew Meszaros 2026-09-28 04:22:55 +00:00
  • 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 Matthew Meszaros 2026-09-27 21:17:40 -07:00
  • 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 Matthew Meszaros 2026-09-27 21:08:40 -07:00
  • 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 Matthew Meszaros 2026-09-27 20:55:56 -07:00
  • c4db732af5 Merge pull request #723 from warmbly/feat/mailbox-list-and-major-inbox-rate Matthew Meszaros 2026-09-28 03:52:12 +00:00
  • e1ef617306 Merge pull request #722 from warmbly/feature/inbox-tagging-ooo-return-date Matthew Meszaros 2026-09-28 03:48:37 +00:00
  • 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 Matthew Meszaros 2026-09-27 20:40:45 -07:00
  • 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 Matthew Meszaros 2026-09-27 20:40:35 -07:00
  • 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 Matthew Meszaros 2026-09-27 20:28:44 -07:00
  • f45c4552eb Merge pull request #720 from warmbly/fix/revived-dates-and-release-tag Matthew Meszaros 2026-09-27 13:41:34 +00:00
  • 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 Matthew Meszaros 2026-09-27 14:59:06 +02:00
  • 4587b475ca Merge pull request #718 from warmbly/fix/warmup-mailbox-selection-cap v0.6.10 Matthew Meszaros 2026-09-27 12:26:15 +00:00
  • 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 Matthew Meszaros 2026-09-27 05:10:23 -07:00
  • 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 Matthew Meszaros 2026-09-27 05:03:09 -07:00
  • 1dbbee61c6 Merge pull request #716 from warmbly/feat/localized-optout-and-unsubscribe-page Matthew Meszaros 2026-09-27 12:10:48 +00:00
  • 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 Matthew Meszaros 2026-09-27 05:06:41 -07:00
  • 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 Matthew Meszaros 2026-09-27 04:53:17 -07:00
  • 98f8841347 Merge pull request #714 from Skylinerffm97/fix/german-return-dates Matthew Meszaros 2026-09-27 11:53:31 +00:00
  • 62dce33b17 Merge pull request #715 from warmbly/fix/campaign-overview-date-range Matthew Meszaros 2026-09-27 11:53:26 +00:00
  • 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 Matthew Meszaros 2026-09-27 04:45:27 -07:00
  • 8594eda3a2 Merge pull request #713 from Skylinerffm97/fix/not-interested-is-negative Matthew Meszaros 2026-09-27 11:38:24 +00:00
  • a09b7df0d1 Merge pull request #712 from Skylinerffm97/feat/german-opt-out-replies Matthew Meszaros 2026-09-27 11:38:23 +00:00
  • 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 Matthew Meszaros 2026-09-27 04:37:26 -07:00
  • 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 Skylinerffm97andClaude Opus 5.5 2026-09-27 10:32:55 +00:00
  • 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 Skylinerffm97andClaude Opus 5.5 2026-09-27 10:28:45 +00:00
  • 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 Skylinerffm97andClaude Opus 5.5 2026-09-27 10:29:33 +00:00
  • 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 Skylinerffm97andClaude Opus 5.5 2026-09-27 09:36:12 +00:00
  • b18e11b35b Merge pull request #711 from warmbly/feat/business-only-checkout v0.6.9 Matthew Meszaros 2026-09-27 09:38:55 +00:00
  • 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 Matthew Meszaros 2026-09-27 11:33:35 +02:00
  • 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 Matthew Meszaros 2026-09-27 11:10:46 +02:00
  • 6146090fcc Merge pull request #709 from warmbly/fix/warmup-throttle-stays-in-pool Matthew Meszaros 2026-09-27 08:55:53 +00:00
  • 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 Matthew Meszaros 2026-09-27 10:09:01 +02:00
  • 8c0cb9759e Merge pull request #708 from warmbly/fix/recent-posthog-errors v0.6.8 Matthew Meszaros 2026-09-27 06:37:22 +00:00
  • 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 Matthew Meszaros 2026-09-27 08:26:55 +02:00
  • 49e7fec849 Merge pull request #707 from warmbly/feature/campaign-analytics-date-range Matthew Meszaros 2026-09-27 06:16:54 +00:00
  • 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 Matthew Meszaros 2026-09-26 23:11:10 -07:00
  • 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 Matthew Meszaros 2026-09-26 23:00:30 -07:00
  • 15b88d6579 Merge pull request #706 from warmbly/fix/warmup-placement-slows-only Matthew Meszaros 2026-09-27 05:47:17 +00:00
  • 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 Matthew Meszaros 2026-09-26 22:42:19 -07:00
  • 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 Matthew Meszaros 2026-09-26 22:37:40 -07:00
  • 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 Matthew Meszaros 2026-09-26 22:26:57 -07:00