2026-09-04 20:14:46 -07:00
..
2026-09-04 04:03:44 -07:00
2026-01-30 08:47:26 +01:00
2026-09-03 01:05:34 -07:00
2026-06-05 06:04:31 +02:00
2026-05-23 16:37:53 +00:00
2026-07-19 10:02:43 +02:00
2026-01-30 08:47:26 +01:00
2026-01-30 08:47:26 +01:00
2026-06-04 09:30:36 +02:00
2026-06-11 08:04:11 +02:00
2026-08-27 03:10:36 -07:00
2026-09-04 04:03:01 -07:00
2026-01-30 08:47:26 +01:00
2026-08-27 03:10:36 -07:00
2026-08-27 03:10:36 -07:00
2026-08-26 21:14:34 -07:00
2026-06-13 07:18:23 +02:00
2026-09-04 04:03:44 -07:00
2026-01-30 08:47:26 +01:00
feat: rebuild the new-campaign wizard with animated step transitions, a numbered stepper, the shared Toggle instead of a broken hand-rolled switch, per-step validation that explains itself and a discard guard, register PopoverMenu's click-outside in the capture phase so dropdowns inside dialogs close on click-away, add a Campaigns back link and clickable breadcrumb crumbs, add a From contacts leads picker with category filter and select-all-matching backed by the bulk add_campaigns path whose SQL now scopes campaigns by organization instead of the caller, and stop self-hosted no-billing deployments presenting as a free trial or plan-metered by exposing billing_enabled on GET /auth/config, showing a Self-hosted badge, hiding Billing and Refer & earn, and reporting AI credits as unlimited with the header gauge and cost copy hidden
2026-08-18 07:48:58 -07:00
2026-07-22 17:04:51 +02:00
2026-07-20 08:17:50 +02:00
feat: rebuild the click-without-open fix on top of the per-link click attribution from #298: a person's click now also counts as an open and a burst that withdraws the click withdraws the open it implied unless a real open is on record, routing readers ignore machine opens as the docs promised, every open gets its own log row and every open and click records the mail client or proxy, browser, device, OS, country, region and city (migration 000124: origin columns on email_link_clicks plus an email_opens table), the tracking service publishes only the address's network in a nullable client_ip field which the consumer resolves with GeoLite and drops, the contact Activity tab shows each open and the origin of opens and clicks, the campaign overview gains a who-engaged-from-where breakdown exposed as engagement in campaign analytics, live open and click events carry occurred_at, client and location, the leads table explains why an open is not always counted, both logs are pruned daily after a year, email_opens joins the export registry, the consumer reads GEODB_PATH optionally, and the guides and API references are updated (fixes #294)
2026-09-03 03:49:44 -07:00
2026-06-14 10:48:06 +02:00
2026-08-29 08:05:11 -07:00
2026-07-19 08:52:56 +02:00
2026-07-19 18:36:31 +02:00
2026-09-04 20:14:27 -07:00
2026-06-05 16:36:34 +02:00
2026-09-04 05:11:47 -07:00
2026-08-31 05:36:24 -07:00
2026-07-19 11:04:58 +02:00
2026-07-02 20:33:44 +02:00
2026-07-02 20:33:44 +02:00
2026-06-30 19:20:08 +02:00
2026-07-19 18:56:55 +02:00
2026-05-23 16:37:53 +00:00
2026-07-19 11:04:58 +02:00
2026-09-03 20:38:27 -07:00
2026-09-04 04:03:01 -07:00
2026-06-01 04:25:14 +02:00
2026-04-03 06:08:52 +00:00
fix: address the review of the notifications work — bound detached alert delivery to a fixed pool that drops and logs rather than spawning a goroutine per event, never echo a transport error that embeds the webhook URL, treat an emptied channel target as cleared so switching transport cannot post Slack payloads to a Discord URL, emit user.registered for invited signups and the worker alert after a successful reassignment, format Stripe amounts by currency exponent, refuse an upgrade while the plan list is still loading instead of silently opening the portal, apply a fixed discount to the annual invoice rather than to each month, convert proration from minor units, contain focus in the nested enterprise dialog, hide the odometer wheels from assistive tech, and drop the last dedicated-IP row from the pricing matrix
2026-09-04 06:33:20 -07:00
2026-01-30 08:47:26 +01:00