This website requires JavaScript.
Explore
Help
Sign In
starred
/
warmbly
Watch
1
Star
0
Fork
0
mirror of
https://github.com/warmbly/warmbly.git
synced
2026-10-08 08:02:13 +00:00
Code
Issues
Packages
Projects
Releases
Wiki
Activity
Files
fd940d905b9e90cd2acd5ceea60967be246c656d
warmbly
/
internal
/
app
/
campaign
T
History
Matthew Meszaros
043d877b58
feat: let one organization per instance verify a custom tracking host across mailbox and campaign tracking domains (database trigger plus 409 tracking_domain_taken on save, verify, sending-domain apply and bulk setup; the sweep leaves a held host unverified), and re-verify tracking domains on the destination after a workspace import
2026-10-04 03:22:02 -07:00
..
duplicate_name_test.go
feat: add Delete and Duplicate campaign actions to the dashboard (issue
#185
): every campaign row and the detail header get a ⋯ menu (Edit, Duplicate, Start/Pause, Delete) plus a Delete card at the bottom of Settings, all permission-gated with a confirm that spells out what goes; DELETE /campaigns/:id is now organization-scoped instead of user_id-scoped so teammates can delete, runs in one transaction that also deletes the campaign's pending tasks and cancels a wakeup tick claimed at that moment (campaign_tasks only nulls its link, so those rows kept firing), removes attachment objects and publishes CAMPAIGN_DELETED so a teammate's open detail page is sent back to the list; new POST /campaigns/:id/duplicate copies the campaign row as a draft with steps and their branch graph rewired onto new step ids, tags, folders, senders with rotation reset, A/B variants, advanced settings and attachments (quota-checked, blobs undone if the copy fails) and none of the leads, progress, logs, counters, ramp level, guardrail trip or past dates, naming it (copy)/(copy N) inside the 50 byte cap without splitting runes; a claimed campaign tick whose campaign vanished now ends the chain instead of staying active forever; covered by TestLiveCampaignLifecycle* against real SQL, RemapBranchTargets and duplicateName unit tests and a react-query vitest for the list cache, with API reference, endpoint map and campaigns guide updated
2026-08-25 08:54:51 -07:00
estimate_live_test.go
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
2026-09-29 05:14:07 -07:00
handlers.go
feat: let one organization per instance verify a custom tracking host across mailbox and campaign tracking domains (database trigger plus 409 tracking_domain_taken on save, verify, sending-domain apply and bulk setup; the sweep leaves a held host unverified), and re-verify tracking domains on the destination after a workspace import
2026-10-04 03:22:02 -07:00
lead_cc.go
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
2026-09-29 09:53:27 -07:00
send_plan_cache_test.go
feat: run the send-plan coalescing walk on a bounded caller-independent context and let a canceled getOrCompute waiter return its own ctx.Err() promptly without affecting the shared flight
2026-10-03 06:49:24 +00:00
send_plan_cache.go
feat: run the send-plan coalescing walk on a bounded caller-independent context and let a canceled getOrCompute waiter return its own ctx.Err() promptly without affecting the shared flight
2026-10-03 06:49:24 +00:00
send_plan_snapshot.go
feat: guard campaign send-plan snapshot writes against version regression so a late older planner walk cannot overwrite a newer snapshot
2026-10-03 12:03:49 +00:00
service.go
feat: compute each active campaign's send plan in a background snapshotter (internal/app/campaign) stored in campaign_send_plan_snapshots so GET /campaigns/:id/send-plan serves a stored snapshot instead of walking the planner on the request
2026-10-03 11:04:22 +00:00