Matthew Meszaros
241c5cc352
Merge pull request #693 from warmbly/feature/deliverability-check
...
feat: open inbox placement tests to workspaces with campaign-accurate probes, own and Warmbly Cloud seed panels, tracking comparison and scheduled campaign monitors, and default OpenAI models to gpt-6-luna
2026-09-26 04:50:57 +00: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
Matthew Meszaros
c3e48538d6
feat: record no creator on a placement monitor set by an API key, and refuse a cloud-panel placement test on the linked workspace's allowance or the sender's daily limit before the cloud opens and charges it
2026-09-25 20:58:30 -07:00
Matthew Meszaros
d84864a8cb
feat: seed six instance placement seed inboxes on their own domains in the sandbox and have the simulator file each placement copy into the seed's Inbox or Junk as a stand-in spam filter, stricter on Microsoft and Yahoo seeds and on tracked copy
2026-09-25 20:57:47 -07:00
Matthew Meszaros
d4467ce10e
feat: add the admin Seed panel page to manage the instance placement seed inboxes, run operator tests and read every workspace's results, plus the placement allowance and pacing settings on the Configuration page
2026-09-25 20:56:11 -07:00
Matthew Meszaros
bbcf8725c3
feat: add warmbly placement CLI commands for overview, test, list, view, cancel, seed inboxes and campaign monitors, the list_placement_tests, get_placement_test and run_placement_test assistant tools, and the placement commands in the warmbly-cli skill
2026-09-25 20:56:02 -07:00
Matthew Meszaros
d91b78458b
feat: skip placement probes from a suspended workspace the same way warmup sends are skipped
2026-09-25 20:53:52 -07:00
Matthew Meszaros
099233ed08
feat: cast the placement expiry cutoff to timestamptz so Postgres does not read it as an interval, and cover probe matching by Message-ID, expiry, cancellation, daily-budget charging, monitors, seed selection across host families and every create refusal with live and unit tests
2026-09-25 20:52:48 -07:00
Matthew Meszaros
7f324a38ac
feat: open inbox placement tests to workspaces with probes rendered like the campaign send and paced as placement tasks, Message-ID matching instead of a subject token and warmup header, instance, workspace and Warmbly Cloud seed panels, a tracking comparison, scheduled campaign monitors with alerts and optional auto-pause, monthly allowances, realtime updates and org transfer registration
2026-09-25 20:48:15 -07:00
Matthew Meszaros
7f1bae8cac
feat: default the OpenAI writing, agent and warmup content batch models to gpt-6-luna instead of gpt-4o-mini, gpt-4o and gpt-5-mini, and document the new preset default in the deployment guide
2026-09-25 20:18:26 -07:00
Matthew Meszaros
f8c72dbd8c
Merge pull request #692 from warmbly/feature/domain-bulk-setup
...
feat: bulk tracking domain and redirect setup for sending domains, link.<domain> default, per-domain overrides
v0.6.6
2026-09-25 16:59:10 +00:00
Matthew Meszaros
8fda36b3da
feat: report a failed bulk sending-domain request as an error on each of its domains and keep running the remaining batches and the redirect half instead of stopping the whole setup
2026-09-25 09:55:29 -07:00
Matthew Meszaros
d6e4c42e50
feat: give each domain in a bulk sending-domain setup a 20s deadline and send 25 per request so every batch answers inside the dashboard timeout, send each domain's resolved tracking host and website from the bulk dialog so a kept verified host is not replaced by the base subdomain, and release the CSV export's blob URL after the download starts
2026-09-25 09:44:00 -07:00
Matthew Meszaros
356c215d37
feat: limit Check DNS now on Sending domains to tracking hosts still waiting for DNS so a verified host covering part of a domain is never extended to its other mailboxes
2026-09-25 09:32:05 -07:00
Matthew Meszaros
6b9df08f3e
Merge remote-tracking branch 'origin/main' into feature/domain-bulk-setup
2026-09-25 09:30:36 -07:00
Matthew Meszaros
0fedc7abe6
feat: default tracking hosts to link.<domain>, set one tracking subdomain and redirect website for every domain in mailbox imports and on Sending domains with a per-domain dropdown to override each, add POST /emails/domains/bulk that goes through the inbox vendor's API where it can, add multi-select with check DNS, copy records, CSV export, clear tracking and remove redirect to Sending domains, and fix the sandbox seed's deliverability conflict target
2026-09-25 09:30:36 -07:00
Matthew Meszaros
c54e6b7fea
Merge pull request #691 from warmbly/fix/inbox-tag-gmail-context-and-custom-questions
...
feat: report the Message-ID Gmail stamps and resolve a reply's campaign through the Gmail thread and In-Reply-To (#682 ), and add workspace tagging questions and tagging languages (#683 )
v0.6.5
2026-09-25 04:26:11 +00:00
Matthew Meszaros
76ba8721dc
Merge pull request #690 from warmbly/feat/compose-placement
...
feat: move the unibox Compose button from the top of the folder rail into the conversation list title row as a ghost sky button with an N key hint
2026-09-25 04:25:00 +00:00
Matthew Meszaros
dd98c4b1fe
feat: record the campaign an inbox tag verdict was made with (migration 000216) so --recheck-cold-inbound asks only about verdicts made without one and never re-bills, keep the recheck from removing labels when no verdict was stored, let the campaign lookup use the tasks Message-ID index, require the Gmail address tail on the Russian and Japanese quote markers so a proposed meeting time is not cut, keep workspace question labels off notifications, and key and lock tagging question edits by id
2026-09-24 21:21:11 -07:00
Matthew Meszaros
c93bf1fcca
Merge remote-tracking branch 'origin/main' into feat/compose-placement
...
# Conflicts:
# web/src/components/app/unibox/ConversationList.tsx
2026-09-24 21:20:31 -07:00
Matthew Meszaros
bc73fc35a9
feat: give the unibox Compose button its visible label as the accessible name (screen-reader only on phones), hide the N key hint from assistive tech, and drop the drafts row's leftover top margin
2026-09-24 21:20:18 -07:00
Matthew Meszaros
6a13fd5238
feat: report the Message-ID Gmail stamps on a send and resolve a reply's campaign through the Gmail thread and In-Reply-To so campaign replies stop tagging as sales pitches (with a warmblyctl --recheck-cold-inbound backfill that clears the stale labels and a tasks thread index), let a workspace add its own yes/no and pick-one tagging questions with plain-word labels and hold/stop/task actions, and add tagging languages (44 named to the classifier; for 27, only once chosen, tagging also cuts their quoted history and reads their away and non-delivery subjects), documented in the inbox tagging guide and the OpenAPI schema
2026-09-24 21:08:35 -07:00
Matthew Meszaros
74bf081d57
feat: move the unibox Compose button from the top of the folder rail into the conversation list title row (and the Scheduled view header) as a ghost sky button with an N key hint on every viewport, keeping compose drafts at the top of the rail, and update the marketing inbox mock and the unibox guide to match
2026-09-24 20:53:37 -07:00
Matthew Meszaros
e5e559f5fb
Merge pull request #688 from warmbly/feature/unibox-rail-lead-pause
...
feat: pause and resume a lead from the unibox contact panel and the reply composer (#681 )
2026-09-25 03:53:22 +00:00
Matthew Meszaros
d9fd7df42b
Merge remote-tracking branch 'origin/main' into feature/unibox-rail-lead-pause
...
# Conflicts:
# web/src/components/app/contacts/ContactEdit.tsx
2026-09-24 20:39:58 -07:00
Matthew Meszaros
78a742e9f3
Merge pull request #689 from warmbly/fix/inbox-bulk-archive-reappearing
...
feat: animate unibox rows out in the direction of the action (archive, trash, back to inbox, snooze) with a labelled underlay and in with a fade or grow, keep the list mounted so bulk exits play and give re-entering keys a fresh presence key so a refilling list never strands archived rows, fade new pages in at full height so infinite scroll stops chaining every page, batch bulk archive/read/snooze requests under the 500-id cap, show an all-caught-up state and an animated selection bar, and page the conversation list from the last returned row so no conversation is skipped at a page boundary
2026-09-25 03:36:49 +00:00
Matthew Meszaros
21991ccc6b
Merge pull request #686 from warmbly/feature/contact-custom-field-inputs
...
feat: custom field inputs when adding or editing a contact
2026-09-25 03:27:34 +00:00
Matthew Meszaros
9b310cf0c5
feat: rebase contact custom fields key by key so a teammate's new field is kept instead of saved as a removal, lock stored field names the server refuses and check every key a save sends, keep saved fields visible across tab switches, give new-field rows stable ids, and stop Enter in a field name from submitting the New contact form
2026-09-24 20:25:25 -07:00
Matthew Meszaros
5e49d16e5d
feat: animate unibox rows out in the direction of the action (archive, trash, back to inbox, snooze) with a labelled underlay and in with a fade or grow, keep the list mounted so bulk exits play and give re-entering keys a fresh presence key so a refilling list never strands archived rows, fade new pages in at full height so infinite scroll stops chaining every page, batch bulk archive/read/snooze requests under the 500-id cap, show an all-caught-up state and an animated selection bar, and page the conversation list from the last returned row so no conversation is skipped at a page boundary
2026-09-24 20:24:31 -07:00
Matthew Meszaros
ed18fad2cd
feat: pause nothing from the reply composer when the lead's state cannot be re-read, keep an armed follow-up pause pointed at at least one campaign and clear it after the send, report already-held campaigns apart from ones that could not be paused, word a paused or blocked next step by its reason in the unibox contact panel, and keep Stop disabled while Resume is in flight
2026-09-24 20:20:49 -07:00
Matthew Meszaros
77f0c56e72
Merge pull request #687 from warmbly/feature/automated-mail-routing-and-labels
...
feat: keep automated mail out of the inbox and rename automatic labels to plain words
2026-09-25 03:19:29 +00:00
Matthew Meszaros
c3ef053841
Merge pull request #685 from warmbly/fix/campaign-queued-stall
...
feat: keep a campaign's pass chain running through every failure (a pass whose hand-off to a worker fails or that errors is followed by another a minute later instead of waiting on the reconciler, retries move their slot, dead-lettered passes replay through the campaign lock), pass over mailboxes no heartbeating worker holds (worker_id now loaded with the sender pool, shown as Reconnecting in the send plan), count a hand-off failure against the lead only when it is the lead's, and try up to 200 due leads per pass with a daily activity line when all are waiting
2026-09-25 03:16:41 +00:00
Matthew Meszaros
fe7f416a1e
feat: pause and resume a lead from the unibox contact panel, which now lists each campaign with the lead's status and next step or hold, add a Pause follow-ups option to the reply composer that holds the recipient's ticked campaigns once the reply is accepted (counted from a scheduled reply's send time), add Pause lead to the contact Activity tab's campaign cards, end a lead's flow on the router's exclusion and let it decide whether a reply ended it, and stop per-contact send events refetching every other contact's campaign-state preview (issue #681 )
2026-09-24 20:13:56 -07:00
Matthew Meszaros
ccb4a3a0cd
feat: take back a campaign pass the task queue refused so the retry that follows a failed hand-off can seed one that runs
2026-09-24 20:12:29 -07:00
Matthew Meszaros
de7a7c9748
feat: take back a replayed campaign pass the task queue refused and keep its dead letter, seed the next pass on a fresh context when the one after a failed hand-off could not be written, resume a campaign whose mailboxes lack a worker at the earliest reopening, and log that wait under its own daily line
2026-09-24 20:09:55 -07:00
Matthew Meszaros
9dee88bcb2
feat: keep conversations the inbox tagger judges automated (security alerts, verification codes, notifications, bounces, auto-replies) out of Inbox, Unread, mailbox and tag views and the unread badge and list them in the Automated view via a new unibox automated filter and overview counts, map no-reply header verdicts to Notification, and rename the automatic labels to plain words (Interested, Meeting, Needs reply, Follow up, Gone quiet and more) with a migration that renames, merges and prunes the old ones
2026-09-24 20:08:45 -07:00
Matthew Meszaros
720faf3acd
feat: show every workspace custom field as its own input in the New contact dialog and the contact Details tab (collapsed after six, filterable past twelve), suggest existing fields while naming a new one or a bulk-edit key with Use it for near-matches, validate names and duplicates before saving, and send removed or cleared fields as empty so the merge-on-update endpoint actually drops them
2026-09-24 20:01:21 -07:00
Matthew Meszaros
a54e9a3a2f
feat: keep a campaign's pass chain running through every failure (a pass whose hand-off to a worker fails or that errors is followed by another a minute later instead of waiting on the reconciler, retries move their slot, dead-lettered passes replay through the campaign lock), pass over mailboxes no heartbeating worker holds (worker_id now loaded with the sender pool, shown as Reconnecting in the send plan), count a hand-off failure against the lead only when it is the lead's, and try up to 200 due leads per pass with a daily activity line when all are waiting
2026-09-24 19:56:14 -07:00
Matthew Meszaros
46341f1a1d
Merge pull request #684 from warmbly/fix/collapsed-rail-tooltips
...
feat: share one tooltip provider across the collapsed sidebar rail so tab names show after 120ms and instantly between rows, and pad the collapsed nav so the Inbox unread badge is no longer clipped at the top
2026-09-25 02:46:40 +00:00
Matthew Meszaros
85e63208a9
feat: share one tooltip provider across the collapsed sidebar rail so tab names show after 120ms and instantly between rows, and pad the collapsed nav so the Inbox unread badge is no longer clipped at the top
2026-09-24 19:43:47 -07:00
Matthew Meszaros
cf83a13b6f
Merge pull request #678 from warmbly/fix/vendor-authorizing-row-actions
...
feat: keep mailbox imports live and self-explaining, show vendor authorization progress with faster options, and finish sign-in rows through a later admin grant
v0.6.4
2026-09-24 17:15:19 +00:00
Matthew Meszaros
64627de271
feat: resume a sign-in row through a grant only when the grant lookup confirms it is usable on this instance, so a stored grant whose provider is no longer configured does not requeue its rows every minute
2026-09-24 19:10:02 +02:00
Matthew Meszaros
f0861fa129
feat: make the backend drain wait for the import runner itself to stop on the shutdown deadline, resume only sign-in rows an active grant covers (decided in SQL so uncovered rows cannot crowd them out), wait for NATS consumers to close after stopping them, count rows a vendor is authorizing by provider on the import so the admin sign-in button counts and shows only Microsoft rows, keep failed and sign-in imports ahead of connecting ones in the imports menu, and base the pool banner's empty state and warming count on workspace totals only
2026-09-24 18:57:01 +02:00
Matthew Meszaros
755b6155c2
Merge pull request #679 from warmbly/fix/sent-count-and-reply-optout
...
feat: count only email steps in every sent total (contact drawer, Leads view and statuses, campaign progress, guardrails, org conduct, verification evidence, segments, admin, advisor), keep line breaks in synced body text and strip quoted history in any shape, classify delivery failures before out-of-office and tag them as bounces, record statusless failure notices from X-Failed-Recipients as permanent bounces, limit reply and inbox-tag opt-outs to people answering our outreach (never bounces, auto-replies or list mail), and recheck earlier reply opt-outs, lifting with an audit entry only those the message that wrote them no longer supports
2026-09-24 16:49:03 +00:00
Matthew Meszaros
256010725b
feat: count only email steps in every sent total (contact drawer, Leads view and statuses, campaign progress, guardrails, org conduct, verification evidence, segments, admin, advisor), keep line breaks in synced body text and strip quoted history in any shape, classify delivery failures before out-of-office and tag them as bounces, record statusless failure notices from X-Failed-Recipients as permanent bounces, limit reply and inbox-tag opt-outs to people answering our outreach (never bounces, auto-replies or list mail), and recheck earlier reply opt-outs, lifting with an audit entry only those the message that wrote them no longer supports
2026-09-24 09:44:17 -07:00
Matthew Meszaros
561ba07b35
feat: send a deferred import progress event with the latest status and cancel it when a final one goes out, report a hidden import's real status instead of cancelled, rank failed and sign-in rows above authorizing ones in the imports menu and its badge, and count warming and connected mailboxes for the pool banner on the server (warming on the pool plan) rather than from the filtered, paged list
2026-09-24 18:38:47 +02:00
Matthew Meszaros
d8e99877b2
feat: let an update finish work in flight instead of cutting it off, by having the import runner stop claiming on shutdown, hand back rows that never started without counting the claim and finish the rows it is connecting on an uncancelled context, the backend wait up to 45 seconds for those rows and for in-flight connects, the event bus finish the message being handled before it stops reading, and node units, the repository compose file and the installer's stack allow 60 seconds before a forced stop, with the grace period documented for Railway, Docker and Kubernetes
2026-09-24 18:31:06 +02:00
Matthew Meszaros
ac663093c4
feat: label the faster options on a vendor authorization by what they do, Connect all at once (admin sign-in) for the whole domain and Sign in on a row for that mailbox only
2026-09-24 18:24:50 +02:00