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 Meszaros2026-09-29 10:39:13 -07:00
d902fc226e
Merge pull request #744 from Skylinerffm97/feat/unibox-scope-rail-customize
Matthew Meszaros2026-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 Meszaros2026-09-29 10:30:03 -07:00
505d10cdc8
Merge pull request #747 from warmbly/fix/sidebar-rail-and-lead-checkboxes
Matthew Meszaros2026-09-29 17:23:19 +00:00
b0408cf5a0
Merge pull request #749 from warmbly/fix/import-file-cells-stay-text
Matthew Meszaros2026-09-29 17:23:12 +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 Meszaros2026-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 Meszaros2026-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 Meszaros2026-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 Meszaros2026-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 Meszaros2026-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 Meszaros2026-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 Meszaros2026-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 Meszaros2026-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.52026-09-29 16:27:47 +02:00
b4b6595f47
web(unibox): read the hidden-rows hint with the pencil and give both the header label's weight
Skylinerffm97andClaude Opus 5.52026-09-29 16:01:33 +02:00
92504896bf
Merge pull request #737 from warmbly/fix/warmup-removal-verification
Matthew Meszaros2026-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 Meszaros2026-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 Meszaros2026-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 Meszaros2026-09-29 05:03:38 -07:00
4d5a4e34e3
Merge remote-tracking branch 'origin/main' into fix/warmup-removal-verification
Matthew Meszaros2026-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 Meszaros2026-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 Meszaros2026-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 Meszaros2026-09-29 04:43:25 -07:00
6bdef4c3f5
Merge pull request #732 from Skylinerffm97/feat/collapsible-nav-sections
Matthew Meszaros2026-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 Meszaros2026-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 Meszaros2026-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 Meszaros2026-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 Meszaros2026-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 Meszaros2026-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.52026-09-28 21:35:35 +02:00
8ff5a81c16
web(nav): hide collapsed sections in the rail too, except the active page
Skylinerffm972026-09-28 00:57:08 +02:00
d14605b57f
web(nav): make the Email, CRM and Resources sections collapsible
Skylinerffm972026-09-28 00:12:13 +02: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 Meszaros2026-09-28 10:48:14 -07: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 Meszaros2026-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 Meszaros2026-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 Meszaros2026-09-28 09:16:42 -07:00
32a58f5a35
Merge pull request #728 from warmbly/fix/inbox-sidebar-contact-match
Matthew Meszaros2026-09-28 16:08:46 +00:00
0fd8cd2a25
Merge pull request #727 from warmbly/fix/imap-warmup-filing-session
Matthew Meszaros2026-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 Meszaros2026-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 Meszaros2026-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 Meszaros2026-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 Meszaros2026-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 Meszaros2026-09-28 08:46:19 -07:00
68e5f290f6
Merge pull request #726 from warmbly/feat/mailbox-cell-classic-look
Matthew Meszaros2026-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 Meszaros2026-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 Meszaros2026-09-28 08:04:48 -07: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 Meszaros2026-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 Meszaros2026-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 Meszaros2026-09-27 21:50:10 -07:00
8b921b3340
Merge pull request #724 from warmbly/feat/placement-seed-choice-quick-pace-credits
Matthew Meszaros2026-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 Meszaros2026-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 Meszaros2026-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 Meszaros2026-09-27 20:55:56 -07:00
c4db732af5
Merge pull request #723 from warmbly/feat/mailbox-list-and-major-inbox-rate
Matthew Meszaros2026-09-28 03:52:12 +00:00
e1ef617306
Merge pull request #722 from warmbly/feature/inbox-tagging-ooo-return-date
Matthew Meszaros2026-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 Meszaros2026-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 Meszaros2026-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 Meszaros2026-09-27 20:28:44 -07:00
f45c4552eb
Merge pull request #720 from warmbly/fix/revived-dates-and-release-tag
Matthew Meszaros2026-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 Meszaros2026-09-27 14:59:06 +02: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 Meszaros2026-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 Meszaros2026-09-27 05:03:09 -07:00
1dbbee61c6
Merge pull request #716 from warmbly/feat/localized-optout-and-unsubscribe-page
Matthew Meszaros2026-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 Meszaros2026-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 Meszaros2026-09-27 04:53:17 -07:00
98f8841347
Merge pull request #714 from Skylinerffm97/fix/german-return-dates
Matthew Meszaros2026-09-27 11:53:31 +00:00
62dce33b17
Merge pull request #715 from warmbly/fix/campaign-overview-date-range
Matthew Meszaros2026-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 Meszaros2026-09-27 04:45:27 -07:00
8594eda3a2
Merge pull request #713 from Skylinerffm97/fix/not-interested-is-negative
Matthew Meszaros2026-09-27 11:38:24 +00:00
a09b7df0d1
Merge pull request #712 from Skylinerffm97/feat/german-opt-out-replies
Matthew Meszaros2026-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 Meszaros2026-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.52026-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.52026-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.52026-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.52026-09-27 09:36:12 +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 Meszaros2026-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 Meszaros2026-09-27 11:10:46 +02:00
6146090fcc
Merge pull request #709 from warmbly/fix/warmup-throttle-stays-in-pool
Matthew Meszaros2026-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 Meszaros2026-09-27 10:09:01 +02: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 Meszaros2026-09-27 08:26:55 +02:00
49e7fec849
Merge pull request #707 from warmbly/feature/campaign-analytics-date-range
Matthew Meszaros2026-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 Meszaros2026-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 Meszaros2026-09-26 23:00:30 -07:00
15b88d6579
Merge pull request #706 from warmbly/fix/warmup-placement-slows-only
Matthew Meszaros2026-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 Meszaros2026-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 Meszaros2026-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 Meszaros2026-09-26 22:26:57 -07:00