Feature breakdown · built with CraftHQ
Email & in-app notifications
Whole-team time at this build's pace
2 people incl. the product owner, requirements to merge
Estimate at this build's pace, not a measurement of this feature
Users are kept in the loop, and a single configuration setting controls whether customer-facing operational email is sent.
How long a feature this size usually takes
Whole-team time — this build vs a typical team
~23 FP · FP × 6.8 to 9.4 h (ISBSG 2023)
Estimate at this build's pace, not a measurement of this feature
Both figures are whole-team time over the whole lifecycle, so they compare like for like. Ours is this build's pace — about 0.8 hours per function point across the whole build (two people, including the product owner, with requirements and review time). The industry range is an ISBSG project-level figure applied to one feature, so it is indicative.
Workflow
How it moved through the workflow
Select a stage. The build shipped, so every stage is complete; a person approved the merge.
Request
Keep users in the loop automatically, and give the company one control over the operational mail that goes out from every point in the product, without ever blocking sign-in mail.
Questions
Two decisions went to the business before building: whether an assignment change is notified by email or in-app, and whether one configuration setting governs operational mail while security mail stays exempt.
Approved
The product owner signs off the breakdown by moving the story into the approved state, and the build runs against that reference.
Definition of ready
Building
CraftHQ's build agents write the code and the tests together, run as a loop; a failing check halts the work until it passes.
Checks
Three checks run on every pull request: one on the product owner's machine as CraftHQ builds, one on the engineer's machine before review, and a code-quality scan in CI. Merging is gated by the CI check passing and a person's approval, enforced by branch protection.
Review
An engineer reviews the pull request and merges it.
Merged
The pull request is merged to main after a person approves it. Nothing merges without that approval.
Definition of done
Breakdown
The feature breakdown
Business first, then the engineering view. Tab through it.
Overview
The gap it closes
Chasing customers by hand is slow, and mail can go out from many points in a product with no single control over it.
Who uses it
All users receive notifications; a single configuration setting controls whether customer-facing operational email is sent.
User story
As a staff member, I want customers reminded and notified of changes automatically so that work keeps moving without me chasing by hand.
Examples
Example 1
A customer has outstanding work. A reminder is sent automatically, so the staff member does not have to chase it by email.
Example 2
The delivery setting is set to suppress. Customer-facing operational mail is not sent, while one-time codes and password-reset links still go out, and in-app notices still appear.
Dependencies & risks
Depends on
A delivery service for email, mail templates, a notification store for in-app notices, and a reminder job.
Risk & mitigation
Operational mail could go out when it should not, or the control could accidentally block sign-in mail. Reduced by a single configuration setting over customer-facing operational delivery, with security mail (one-time codes, password resets) always exempt, plus a per-flow invite-suppression flag.
How it works
Simplified diagrams of the parts involved, the steps of one request, and where it runs.
Architecture
- 1allow or stop operational email
- 2send reminders
- 3email (operational, plus security mail outside the control)
- 4reads in-app notices
Sequence
- 1an operational event wants to notify
- 2allowed, so send; security mail always sends
- 3deliver the email
- 4write the in-app notice
- 5read in-app notices
Infrastructure
- 1read notices, set controls (authenticate + tenant check)
- 2queue reminders and mail
- 3write in-app notifications
- 4send allowed operational email, and security mail always
Acceptance criteria
Each scenario is written as a Gherkin spec. The Engineering tab shows the test that covers each one, or notes where it was verified by review.
@platform @notificationsFeature: Email and in-app notificationsAs a staff memberI want customers reminded and notified of changes automaticallySo that work keeps moving without me chasing by handThe product sends in-app notifications and emails. A single configuration setting governs customer-facing operational mail across every email site and defaults to suppress; security mail (one-time codes and password resets) always goes out, and an assignment change notifies both the old and the new owner in-app.Background:Given notifications can be sent in-app and by emailRule: A single configuration setting governs operational email, but never security mailScenario: The setting suppresses operational mail at every email siteGiven the delivery setting is set to suppressWhen any part of the product would send a customer-facing operational emailThen no operational email is sent from any email siteScenario: Security mail is sent even when operational mail is suppressedGiven the delivery setting is set to suppressWhen a user needs a one-time code or a password-reset linkThen that security mail is still sentAnd the user is not locked outScenario: In-app notices still appear when operational mail is suppressedGiven the delivery setting is set to suppressWhen an event raises an in-app noticeThen the recipient still sees it in the in-app panelRule: An assignment change notifies both owners in-appScenario: A reassignment notifies the old and the new ownerGiven an item is reassigned from one owner to anotherWhen the assignment changesThen an in-app notification goes to the old ownerAnd an in-app notification goes to the new ownerRule: Reminders and invites are sent, with limitsScenario: A reminder is sent for outstanding work and stops on completionGiven a customer has outstanding workWhen the reminder runsThen the customer is remindedAnd no further reminder is sent once the work is completeScenario: Invites are suppressed by a per-flow configuration flagGiven the invite-suppression flag is setWhen a user would be invited by emailThen the invite email is not sent@edge-casesScenario Outline: Where each notification is deliveredGiven a "<event>" occursWhen notifications are sentThen the delivery is "<channel>"Examples:| event | channel || an assignment change | in-app only || a customer invite | email || a reminder | email || a one-time code | email |
Questions
Questions raised in planning, each with the decision taken.
Should an assignment change be notified by email or in-app?
Assignment changes happen often, so email could flood inboxes; an in-app notice reaches the owners without the noise.
Should there be one configuration setting over all outgoing mail, and does it also stop sign-in mail?
Mail is sent from many points in the product. One control is useful, but if it also stopped one-time codes and reset links, setting it to suppress would lock every user out.
How we sized it
A function point measures what the software does — its inputs, outputs, lookups and the data it stores — regardless of language or how many lines it took. Each counted item is weighted by complexity: a user input counts 3–6 points, an output or report 4–7, a lookup 3–6, data the feature owns 7–10, and data read from elsewhere 5–7.
- The notification store this feature ownsData the feature owns10
- Send an emailOutput or report5
- Set delivery controls across the productUser input4
- Show in-app notificationsLookup4
- Total23
Components touched
Delivery service
Sends email through one service. A single configuration setting governs customer-facing operational mail across every email site; security mail (one-time codes, password resets) is always sent, independently of it, so the setting cannot lock users out.
Mail templates
The templates for invites, reminders and change notices.
Notification store
Holds in-app notifications, including the assignment-changed event to both owners. In-app notices are delivered from the store and are not affected by the email configuration setting.
Reminder job
A background job that reminds customers of outstanding work and stops once the work is complete.
Invite-suppression flag
A configuration flag that stops invite emails when set.
Data touched
Notification storewrite
In-app notifications and their read state.
Mail templatesread
The templates the delivery service renders.
Delivery settingread
The configuration setting (operational mail only) and the invite-suppression flag.
Security decisions
- A single configuration setting governs customer-facing operational email across every email site, so it can be stopped in one place.
- Security mail (one-time codes, password resets) is always sent, independently of the configuration setting, so the switch can never lock a user out of signing in.
- An invite-suppression flag prevents invite emails when set.
Subtasks
- A delivery service with one configuration setting over operational mail and an always-on path for security mail.
- Mail templates for invites, reminders and change notices.
- A notification store with the assignment-changed event to both owners.
- An invite-suppression configuration flag.
How each scenario is verified
- Notifications are sent in-app and by emailVerified by review of the notification delivery path.
- The configuration setting stops operational mail but not security mailA test that the configuration setting stops operational mail across email sites while one-time codes and resets still go out.
- A reminder is sent for outstanding work and stops on completionVerified by review of the reminder path.
- Invites are suppressed by a flagA test over the configuration setting and the enqueue gate.
Notes
- An assignment change is notified in-app only (a product decision), so routine changes do not go out by email.
Risk tier
Logic A person approves every merge. This is a Logic-tier change; it carries automated tests for its rules.
Start here
Want this on your backlog?
Get a free baseline report on one repository, or scope a 3-month pilot measured against what your team’s work costs today.