Environments
What each environment's deployed web app contains right now, read from the live sites. It updates by itself after every deploy, and test cases that need something an environment lacks are hidden there.
Showing the last saved snapshot because the live check is unavailable. Per-browser overrides such as ?features= are not included.
Production
You are testing here- Cases that apply
- 617 of 897
- Build mode
- production
- Deployed bundle
- index-BXrIfCTd.js
Staging
- Cases that apply
- 706 of 897
- Build mode
- staging
- Deployed bundle
- index-BAVZ8pUu.js
Dev
- Cases that apply
- 858 of 897
- Build mode
- development
- Deployed bundle
- index-8DYRL0wu.js
Optional features
Feature flags. Switched on or off per environment.
| Feature | Production | Staging | Dev |
|---|---|---|---|
Brutus AI Brutus home, the copilot, the feed card and the help-centre section. The AI message generator in campaigns works without it. | Off | On | On |
Campaign calendar The /dashboard/campaign-calendar page and its sidebar entry. | Off | On | On |
My Brand The /dashboard/brand page, its sidebar entry and Brand Settings on the company profile. | Off | Off | On |
The WhatsApp Business card in company settings and its checklist item. WhatsApp campaigns and packages work without it. | Off | Off | On |
WhatsApp inbox The Messages inbox and WhatsApp template manager, and their sidebar entry. | Off | Off | On |
Brutus workspace The /dashboard/brutus-workspace page and its sidebar entry. | Off | On | On |
Content plans The /dashboard/content-plans page and its sidebar entry. | Off | Off | On |
Email templates The email template list, editor and sidebar entry. Older builds have them with no flag. | Off | Off | On |
Newer behaviour
Changes that ship with the code. Present once an environment deploys a build that has them.
| Feature | Production | Staging | Dev |
|---|---|---|---|
Contacts tab without Paste / Import, import drafts without AI cleanup The Contacts toolbar is the search box with Filters and Columns on the right, the empty state offers Add Contact only, and the Draft rows for review card has no AI cleanup button (web app PRs #80 and #81, dev 2026-10-07). Importing lives on the Import tab. Older builds have Paste and Import on the Contacts tab (Import opens "Import Contacts from File" with the AI column check) and AI cleanup on draft rows. | Not in build | Not in build | On |
Phone number validation at signup Signup, the signup company step and the Google profile-completion modal check the phone number format (local Zambian numbers, or + and a country code). Older builds only require the field, or a minimum of 10 characters. | On | On | On |
Country-code phone picker in Add Company The Add Company phone field has a country-code picker and accepts international numbers. Older builds use a fixed 260 prefix with at most 9 local digits. | On | On | On |
Pending sender ID shown in Edit Company Edit Company pre-fills a pending sender ID, explains it under the field, and saving without changing it does not resubmit it for approval. | On | On | On |
Audience groups The Audience page has a Groups tab that replaces the Lists and Segments tabs; contacts are added to groups instead of lists. | On | On | On |
Fields & Import tab on the Audience page Custom fields and file import live in the Fields & Import tab of /dashboard/audience/contacts; the old /dashboard/audience/fields and /dashboard/audience/import pages redirect there. | Not in build | Not in build | Not in build |
Import tab with Import with Brutus The Audience page has an Import tab with an "Import with Brutus" / "Classic import" switch: paste, attach or speak, review "What Brutus found" and press Add. Older builds only have the file upload on the Fields & Import tab. | On | On | On |
Import draft rows for review An import job shows a Draft rows for review table where each row can be approved, rejected or left pending. | On | On | On |
Restore a deleted contact The contact detail page has a Restore button that undoes a soft delete. | On | On | On |
Logo background colour in Edit Company Edit Company has a Logo background colour field (hex input, picker and Auto-detect) under the logo, saved to the brand profile. | On | On | On |
Create campaign from a selection Selecting contacts or subscribers shows a Create campaign button that starts a campaign addressed to the selection. | On | On | On |
Cancel a scheduled campaign A Cancel button on Scheduled campaigns (backend allows it since 2026-10-08), with the confirmation "The campaign and its log are kept." (ballo-ads-web-app#110). Not built yet. | Unknown | Unknown | Unknown |
Edit a scheduled campaign An Edit action for Draft, Pending, Scheduled and Paused campaigns (message, recipients, send time) with the title "Edit scheduled campaign" (ballo-ads-web-app#110). Not built yet. | Unknown | Unknown | Unknown |
Why each recipient failed The campaign detail page shows each recipient's outcome (Sent, Retrying, Failed, Not sent yet), a "Why they failed" summary and the reason per recipient from recipients[].failure (ballo-ads-web-app#106, backend ADR-0046). Not built yet: no build has these markers. | Not in build | Not in build | On |
Retry failed recipients A Retry failed button on Partially Failed campaigns (ballo-ads-web-app#107). Needs the delivery report backend on the environment. Not built yet. | Not in build | Not in build | Not in build |
Old Retarget non-responders copy The old confirmation text claiming credits are only spent on delivered messages (ballo-ads-web-app#108). Present until that issue is fixed; cases use requiresAbsent. | On | On | Not in build |
Credit badges on channel selection /dashboard/select-type shows each channel's credit balance and shows the Quick/Detailed switch at every screen width. Older builds hide the switch below 1024px. | On | On | On |
Send time on one-time schedules The schedule step picks a start date AND time (with a timezone note). Older builds pick a date only. | On | On | On |
Recurring schedule guardrails The wizard hides Every minute for SMS and WhatsApp, requires an end date or run limit for minute and hourly schedules, asks Monthly schedules for days of the month, shows the generated schedule, and no longer offers Custom (Cron). | On | On | On |
Recurring schedule confirmation Submitting a minute, hourly or high-volume recurring schedule first shows a "Review the recurring schedule" dialog with the expected daily volume. | On | On | On |
Recipient de-duplication The Audience step normalises phone numbers and removes duplicates as recipients are added, with a Duplicates removed list, and reports duplicates the server removed. | On | On | On |
Skipped-numbers notice Leaving the Audience step pops up the SMS recipients the backend will skip (not valid Zambian mobiles), says no credits are used for them and asks to continue; the summary repeats it. Older builds submit silently and only the Activity log shows the skip. | On | On | On |
Audience check with duplicates The Audience step's Next popup opens with how many people will get the message, lists numbers that will be skipped and duplicates that were removed (974549983, 0974549983 and 260974549983 count once), with Review numbers / Continue. 9-digit numbers show as 260… in the list. | On | On | On |
Audience check with opt-in skips The Audience step's popup asks the backend (POST campaigns/audience-check, BalloAds ADR-0043) which recipients have not opted in to the campaign's channel and lists them in a red "has not opted in to" section, out of the reach. It follows the channel: Email campaigns also name malformed addresses. Needs the backend's CampaignAudienceCheck flag (on for dev, staging and production since 2026-10-08); without it the popup shows no opt-in section. | On | On | On |
Groups as audience sources The Audience step picks from Groups & Segments. Older builds pick from Lists & Segments. | On | On | On |
Publish draft campaigns Draft campaigns get a Publish button (card, summary and detail page) behind a confirmation that shows the recipient count. | On | On | On |
Campaign detail tabs The campaign detail page has Recipients, Activity log and Analytics tabs, and the placeholder 80% / 60% stats are gone from the detail page and summary modal. | On | On | On |
Retarget non-responders Completed campaigns can be re-sent to recipients who did not respond. | On | On | Not in build |
Delete campaigns The campaign detail page can permanently delete a campaign and its log. | On | On | On |
Reference campaigns Campaigns can be pinned as references and listed on a Reference tab in the Ads Library. | On | On | On |
Brutus email template generator The email template list can generate a template with Brutus ("Generate with Brutus", shown only when the brutus flag is on). | On | On | On |
Audience audit fixes (web app PR #73) The Audience page has no counts line above the tabs and keeps each section mounted when you switch tabs; the contacts pager reads "1–15 of N" from the server total; Add, Edit and Quick Add contact validate email and phone inline and show API refusals; the Estimate modal returns a figure; the contact detail page loads for every contact; the import review table shows every extracted column with a per-row edit; campaign audience sources show "N of M eligible". Older builds crash the contact detail page, swallow contact-form errors, show a fake pager and an Estimate modal that never requests. | On | On | On |