One shared server routine handles everything that follows a stage finishing: the customer progress email, the internal notification, the per-stage automation rules, and the 'that was the last build stage' congratulations. A database-enforced claim guarantees a single send.
Also called: customer progress email · stage finished notification · got the same email twice
- 1The first caller to see the transition inserts a claim row on a unique index; everyone after gets duplicate:true and sends nothing
- 2The claim is taken BEFORE the automation engine and before the customer email, because both are outbound and neither is retractable
- 3If the finished stage is the LAST build stage, the 'project completed' congratulations email takes over from the generic stage update — one action, one customer message
- 4Reopening a checkpoint releases the claim, so finishing the stage again can notify again
- 5Customer progress emails are gated by their own granular Settings toggle, not the org master switch
Customers were getting the same 'your stage is complete' email twice: two tabs open on one job each decided the stage had just finished, and a builder retrying a save that looked stuck sent it again. No check inside a browser can fix that, because each browser is correct about what it saw. The send is claimed once, centrally, so the second attempt finds it already taken. Reopening a checkpoint releases the claim, because otherwise fixing the work and ticking it again would leave the customer never hearing that it finished the second time.
- Duplicate customer emails from multiple tabs or retries
- Progress emails silently dead behind an org switch nobody flipped
- One-shot notification after a reopen
See it on your own jobs
Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.
or keep browsing features →