Commit Graph
810 Commits
Author SHA1 Message Date
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
Skylinerffm97andClaude 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
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
2026-09-28 17:58:49 +00: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 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 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 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 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 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 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 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 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 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
2026-09-27 12:26:15 +00: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 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
Skylinerffm97andClaude 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
Skylinerffm97andClaude 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 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 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
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 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 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 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 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 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 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 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
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 8812cba439 feat: detect each contact's inbox provider from its domain's MX and SPF in a backend sweep, show it as a sortable Email provider column with the provider logo, filter and segment on it across contacts, campaign leads and segments, and use it for campaign ESP matching including Workspace and Microsoft 365 custom domains and the coverage panel's per-provider lead counts 2026-09-26 06:33:44 -07:00
Matthew Meszaros 014ba06b3a 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 06:30:22 -07:00
Matthew Meszaros c6027fecde Merge pull request #694 from warmbly/fix/premium-warmup-pool-partners
feat: borrow the best proven free warmup mailboxes whenever a premium mailbox has too few outside-workspace partners, reserve a quarter of every inbox's daily warmup capacity for premium senders, and show the pool and partner cap in the mailbox drawer
2026-09-26 05:07:38 +00:00
Matthew Meszaros af8b08d27a feat: rank borrowed free warmup mailboxes strictly by provider then tenure then activity, build the two inbound-share candidate suffixes once, and correct the partner-limit wording in the drawer, OpenAPI, warmup and Warmbly Cloud docs and AGENTS.md 2026-09-25 21:52:45 -07:00
Matthew Meszaros 6e62c500c3 feat: borrow the best proven free warmup mailboxes whenever a premium mailbox has fewer outside-workspace partners than max(25, its warmup ceiling) so siblings no longer block borrowing, keep a quarter of every inbox's daily warmup capacity for premium senders, and show the pool and any partner cap on today's target in the mailbox drawer 2026-09-25 21:47:36 -07:00
Matthew Meszaros caf1852217 feat: keep placement seeds out of warmup pools as recipients too, store a probe's Message-ID before the send, hold queued probes against the sender's day and size a test to what is left, claim due monitors so one replica runs each, write comparison halves in one transaction, scan each seed's mail once per tick, keep test history when a mailbox is deleted, default to 20 seeds a minute apart, and render cloud-panel tests without a real lead by default 2026-09-25 21:46:09 -07:00
Matthew Meszaros 989daede3c feat: add the Placement tests dashboard with the test list, detail and comparison views, New test dialog, Seed inboxes tab, campaign step Test inbox placement action and Placement monitor card, live updates over PLACEMENT_TEST_UPDATED with a slow poll only while the socket is down, the two placement notification categories, and seed-aware warmup errors on Mailboxes 2026-09-25 21:03:26 -07:00
Matthew Meszaros 291ed2ae15 feat: document inbox placement tests in a new guide and API reference page, with the endpoints, error codes, realtime event, notification categories, placement settings, Warmbly Cloud seed panel, export and import behavior, CLI commands, assistant tools, admin Seed panel page and sandbox seed inboxes, and add the endpoints to openapi.json 2026-09-25 21:01:58 -07:00