Communications
Email, messaging, campaigns, audiences, notifications, and organization communications for DivisionDesk.
About
Central communications system for DivisionDesk organizations. Create targeted communications using organization and membership audiences, manage email delivery and campaigns, support operational notifications, and provide shared communication services to other DivisionDesk packages.
Features
- Email campaigns
- Membership-aware audiences
- Organization-aware recipient targeting
- Email delivery management
- Operational notifications
- Communication history
- Reusable communication services
- DivisionDesk package integrations
What's New in 1.4.28
Fixes the Core 4.6.58 update lifecycle contract while retaining reusable mailing lists, dynamic All Members, multi-list campaign selection, CSV/manual recipient management, and recipient deduplication.
View full package changelog
## 1.4.26 - 2026-09-25
- Fix Cubicle update lifecycle: add Lifecycle::update() and run schema/endpoints/seeding during module upgrades.
# Communications 1.4.25 QA
- Added Mailing Lists management with manual recipients and CSV import.
- Added dynamic All Members audience representing everyone on the Membership Manager roster with a usable email address.
- Campaigns can combine All Members and multiple custom lists; duplicate email addresses are resolved once.
- Existing newsletter, Camp, role, manual, suppression, unsubscribe, scheduling, recurrence, analytics, and delivery flows remain in place.
# Communications 1.4.24 — Initial chat hydration performance
## 1.4.24
- Removed the unconditional browser GET to `communications-chat.php?after=0&read=0` during initial public-page load.
- Returning visitors with an existing live-chat cookie are hydrated server-side while the page is generated.
- Visitors without an existing chat cookie start with an empty client state and do not call the chat endpoint until chat is opened/used.
- Existing later chat requests, SSE, long-poll fallback, unread handling, and send behavior remain unchanged.
# Communications 1.4.23 — Member-admin alert authentication
- Staff alert badge/count endpoint now accepts Core unified authenticated principals, so a signed-in member with an assigned administrative role is not incorrectly returned 401 merely because they are not using a separate admin-account login. Permission enforcement remains `communications.inbox`.
## 1.4.23
- Newsletter subscriber audiences can target any active Core newsletter list; recipients are resolved at send time so scheduled and recurring campaigns honor current opt-ins/opt-outs.
- Campaigns now excludes `status=system` transactional/module-generated notification records from the user campaign workspace while preserving their deliveries and analytics.
- Added true recurring campaigns: daily, weekly, monthly by day-of-month or ordinal weekday, and yearly schedules with optional start date and end-by-date/end-after-count controls.
- Recurring campaigns create an immutable child run for each occurrence; recipients are resolved when the run is due, each run retains its own delivery history, and the parent campaign rolls email engagement up across runs.
- Added recurring campaign pause/resume/edit/reuse actions and clear next-send/run-count display. A recurrence that fails preflight is automatically paused rather than generating repeated failed runs every scheduler pass.
- Improved Campaigns visual hierarchy with consistent inline SVG navigation/channel/action icons, compact icon actions, schedule badges, and clearer scheduled/recurring filtering.
- Added send-time `{{communications.upcoming_events}}` dynamic content. The composer has a calendar insert control; published future Core Events are rendered when the email actually sends, so recurring event digests stay current without rebuilding the campaign.
- Campaign performance now exposes per-occurrence run history for recurring campaigns while retaining parent-level rolled-up open/click analytics. Added explicit End recurrence alongside Pause/Resume.
## 1.4.20
- Added Reuse for every saved campaign. Reuse copies campaign content, audience, channels and topic into a new unsaved campaign while deliberately excluding delivery history, analytics, status, approval and schedule.
- Added Edit for draft, scheduled and pending-approval campaigns; sent/queued history remains immutable.
- Reuse/Edit are permission-gated by `communications.compose`.
## 1.4.18 — 2026-09-09
- Redesigned Communications navigation with a dedicated module sidebar for faster access to Campaigns, Inbox, Templates, Deliverability, Providers, Live Chat, Staff Alerts and Status.
- Reorganized the Campaigns screen around a dashboard-first workflow: summary cards and campaign history appear first; **New Campaign** opens the composer only when needed.
- Added campaign status tabs and live search without changing campaign persistence, delivery, scheduling or approval behavior.
- Added per-campaign email engagement summaries directly in Campaigns: unique opens, total opens, open rate, unique clicks, total clicks and click rate.
- Added a campaign performance modal with deliveries, email deliveries, failures and engagement metrics.
- Campaign engagement reads the existing Communications tracking data that already feeds Core Analytics; no second tracking pipeline was introduced. Unique counts remain first-observed-per-delivery, while total counts include repeat tracking observations.
- Preserves all 1.4.17 delivery, transactional attachment, open/click tracking and Analytics event behavior.
## 1.4.17 — 2026-09-08
- Preserves existing first/unique `communications.email.opened` and `communications.email.clicked` analytics events.
- Records every valid tracking request as `communications.email.open_observed` / `communications.email.click_observed` so repeat engagement can be reported without inflating unique open/click rates.
- Provider tracking events are recorded on every valid request for short-term diagnostics; normalized Core Analytics remains the long-term reporting store.
- Adds a read-only email campaign/delivery directory method used by Core Analytics for campaign and recipient labels.
- Retains 1.4.16 attachment-capable transactional email delivery unchanged.
## 1.4.14 — 2026-09-04
- Added **Send Now (Don’t Save)** for one-off broadcasts that should be delivered and tracked without creating a saved campaign record.
- Added Delete actions for old campaigns. Completed delivery history is retained for analytics while pending delivery work is cancelled safely.
- **Save & Send Now** and draft **Send** now start a small immediate delivery batch in the web request instead of waiting entirely on the next scheduler interval; larger sends continue through Core's durable queue.
- Added a 60-second Communications queue-recovery job that recreates missing durable Core jobs for queued deliveries.
- Retains automatic parent campaign completion, open/click tracking, and the canonical tracked **Visit our website** footer link.
- Campaign actions update the Campaigns panel over AJAX without requiring a page refresh.
## 1.4.13
- Reworked the campaign composer around a clear normal workflow: Save Draft, Save & Schedule, or Save & Send Now.
- Moved Email Test, Preflight Analysis, and Full Deliverability Test into an optional Testing & Deliverability section so test utilities no longer look like the primary send workflow.
- Added in-place campaign-list refresh after save/schedule/send so newly saved campaigns appear immediately without a browser refresh.
- A saved draft now keeps its campaign ID in the composer; subsequent saves update that draft instead of inserting another campaign. A server-side submission token also makes duplicate AJAX/form submissions idempotent, preventing two rows even if the submit handler fires twice.
- Added a New Campaign action to deliberately clear the current saved draft and begin another campaign.
- Save & Send Now persists and queues the campaign in one action; Save & Schedule requires an explicit scheduled date/time. Approval-required campaigns are saved into the approval workflow rather than sent directly.
## 1.4.12
- Campaign status now advances from `queued` to `sent` after all deliveries complete, or `failed` after terminal delivery failure, instead of remaining permanently queued.
- Every tracked HTML email now receives a canonical `Visit our website` link immediately beside the open-tracking pixel; the link is routed through Communications click tracking.
## 1.4.11 — 2026-09-04
### Fixed
- Campaign test emails now create a Communications delivery record before MIME generation and receive the same signed per-delivery 1×1 open pixel and tracked links as bulk campaign deliveries.
- Bulk campaign tracking decoration now happens after the unsubscribe/footer HTML is assembled, so the final HTML MIME body contains the tracking pixel.
- `Tracking::decorateHtml()` now independently honors open-tracking and link-tracking flags instead of applying both whenever either was enabled.
- Test-send success/failure is recorded through Communications delivery/analytics events so real SMTP test messages can verify send → open → click behavior.
### Improved
- Campaign composer wording now clearly exposes `All active Membership Manager members in my scope` as the full scoped bulk-email audience and explains Camp, role, and manual targeting.
# Communications 1.4.10
- Preserves signed 1x1 open-pixel analytics for Communications email delivery.
- Adds independent open-pixel and link-tracking controls (`disable_open_tracking`, `disable_link_tracking`) while preserving `disable_tracking` as the master opt-out.
- Keeps first-open/first-click Analytics recording behavior unchanged.
- Core-owned email paths that bypass Communications still require the Core transactional-mail bridge and are not intercepted by this module alone.
# DivisionDesk Communications 1.4.9
- Added site-specific branding to every browser push notification.
- Push titles now include the configured Core site name rather than generic DivisionDesk branding.
- Uses the site's configured logo as the notification icon and favicon/logo as the badge when available.
- Preserves module-supplied images, icons, badges, and actions instead of overwriting them.
- Adds a default `Open` notification action when a destination URL exists and the browser/OS supports actions.
- Improved service-worker click handling for relative and subdirectory URLs.
- Retains all 1.4.2–1.4.8 concurrency, Campaigns, service-worker, VAPID, encryption, delivery, and URL-prefix fixes.
# DivisionDesk Communications 1.4.8
- Fixed browser-push links receiving the DivisionDesk installation prefix twice.
- Central push URL normalization is now idempotent: URLs already beginning with Core `basePath()` are preserved.
- Social Media alert URLs are no longer pre-expanded before the centralized normalization step.
- Retains all 1.4.2–1.4.7 performance, Campaigns, service-worker, VAPID, encryption, and push-delivery fixes.
# DivisionDesk Communications 1.4.7
- Fixed browser-push links dropping the DivisionDesk installation prefix on subdirectory sites.
- Centralized site-local push URL normalization through Core `Url::to()`.
- Social Media push alerts now explicitly normalize their inbox destination before delivery.
- Staff alert fallback links are also normalized through Core URL handling.
- Fully-qualified external URLs and special schemes remain unchanged.
- Retains all 1.4.2–1.4.6 performance, Campaigns, service-worker, VAPID, and Web Push delivery fixes.
# DivisionDesk Communications 1.4.6
- Fixed Web Push deliveries failing with `Undefined array key "urgency"` when a notification omitted an explicit urgency value.
- Social Media push alerts now explicitly use `urgency=normal` and a 24-hour TTL.
- Normalized ephemeral P-256 X/Y coordinates to exactly 32 bytes before Web Push payload encryption.
- Retains the 1.4.5 VAPID-key fix, 1.4.4 base-path service-worker fix, 1.4.3 Campaigns JS fix, and 1.4.2 concurrency fixes.
# DivisionDesk Communications 1.4.5
- Fixed Web Push enrollment failures caused by invalid-length VAPID P-256 keys.
- Generated EC X/Y coordinates and private scalar are now left-padded to exactly 32 bytes before base64url encoding.
- Push subscription discovery now validates the stored VAPID public key and returns a precise setup error if it is invalid.
- Retains the 1.4.4 service-worker base-path fix, 1.4.3 Campaigns JS fix, and 1.4.2 polling/session-lock fixes.
# DivisionDesk Communications 1.4.4
- Fixed Web Push service-worker registration on installations hosted below the domain root.
- Push subscription discovery now uses Core `Url::to()` so the service worker resolves inside the active DivisionDesk installation, e.g. `/new_test_site/public/divisiondesk-push-sw.js`.
- Retains the 1.4.3 Campaigns JavaScript rendering fix and 1.4.2 polling/session-lock fixes.
# DivisionDesk Communications 1.4.3
- Fixed raw JavaScript appearing as visible text at the bottom of the Campaigns screen.
- Moved Campaigns UI JavaScript from a large inline heredoc to `communications-campaigns.js`.
- Public endpoint setup now deploys and validates that asset automatically.
- Retains Communications 1.4.2 lightweight polling/session-lock fixes.
# DivisionDesk Communications 1.4.2
- Generated high-frequency alert-count, chat, and inbox API endpoints now use Core lightweight bootstrap.
- These endpoints release the PHP session immediately and skip unrelated full add-on boot work, preventing long-poll/chat traffic from blocking normal admin pages.
- Works with Core 4.6.8 single-flight alert polling to prevent request pile-ups on shared hosting.
# Changelog
## 1.4.1
- Added normalized Core Analytics events for campaign queueing, notification queueing, delivery sent/delivered/failed/suppressed, email sent/opened/clicked/failed, live-chat start/inbound messages, and staff replies/internal notes.
- Email-open Analytics is explicitly low-confidence and click Analytics medium-confidence; member/campaign context is included when available.
- Added a Social Media alert event bridge: when Social push notifications are enabled, new external social comments/messages/mentions are pushed immediately to active admin Web Push subscriptions.
- Social push delivery does not create duplicate onsite alerts; Social Media remains the canonical global alert provider.
# Communications Changelog
## 1.4.0
- Replaced fixed chat polling with SSE-first transport and automatic long-poll/short-poll fallback for shared hosting.
- Added signed 1x1 email open tracking and safe HTTP(S) click tracking for Communications deliveries.
- Email opens/clicks now update delivery timestamps and Core Analytics signals.
- Preserved unread chat state when the widget is closed.
# DivisionDesk Communications Changelog
## 1.3.0 — 2026-08-15
### DivisionDesk notification-center integration
- Unread Communications staff alerts appear in the main DivisionDesk Administration notification bell.
- The bell is hidden when there are no unread alerts.
- Clicking a Communications alert marks that alert read and opens the exact related conversation.
- Communications registers its Web Push enrollment with Core so administrators are prompted at the top of Administration when browser notifications are available but not enabled on the current device.
- Existing Inbox unread badges, email alerts, push alerts and optional SMS staff alerts remain available.
## 1.2.5 — 2026-08-15
### Messaging usability
- Fixed the admin Inbox so long conversations scroll inside the message pane instead of expanding the whole page.
- Conversation list and current thread now own independent scroll regions.
- Reply composer remains anchored at the bottom of the current conversation.
- Mobile Inbox keeps a bounded scrollable conversation list and a dedicated thread viewport.
- Replaced the very short single-tone notification beep with a softer, longer two-tone chat chime.
- The improved notification sound is used consistently for new messages on both the staff Inbox and visitor chat.
## 1.2.4 — 2026-08-15
### Live messaging workflow
- Live chat requires the visitor's name and email address.
- A staff chat reply that remains unread for two minutes is emailed to the visitor; active visitors who read it in chat do not receive a duplicate email.
- Visitor name is now required before starting live chat so staff can distinguish conversations.
- Visitor chat persists across public-page navigation; an open chat reopens on the next page, while an intentionally closed chat remains closed.
- Visitor chat polls automatically and plays a short sound when a genuinely new staff reply arrives.
- Communications Inbox is now a two-pane live messaging workspace with all conversations visible beside the current thread.
- Conversation list and current thread refresh automatically without page reload.
- Admin receives a short sound when a genuinely new inbound message arrives.
- Replies, internal notes, status changes, assignments and conversation switching are fetch-driven.
- Conversation list shows visitor name, latest-message preview, channel, status and unread count.
- Open/pending, all, and resolved conversation views are available without overwhelming the default screen.
## 1.2.3 — 2026-08-15
### Staff message alerts
- New live chat, website-form and inbound SMS messages can notify staff automatically.
- Communications Inbox shows a live unread badge in DivisionDesk administration.
- On-site staff alerts link directly to the conversation.
- Email alerts are sent for new conversations by default; Advanced can email every inbound message.
- Browser push can be enabled independently on each staff device.
- Optional SMS alerts can be sent to configured staff numbers.
- Opening a conversation marks its associated staff alerts read.
- Staff Alerts settings save with fetch and include plain-language readiness/help.
## 1.2.2 — 2026-08-15
### Critical fix
- `communications-chat.php` and all other generated Communications public endpoints are now ensured whenever the module registers.
- Upgraded installations self-heal if an earlier update did not regenerate public endpoints.
- Removed suppressed writes from endpoint generation.
- Endpoint generation now fails loudly when `public/` is unavailable/unwritable or a generated file cannot be written.
- Final required-file verification runs before endpoint generation returns success.
- Existing generated files are rewritten only when contents differ.
### Regression tests
- Fresh endpoint generation.
- Upgrade simulation beginning from the pre-chat endpoint set.
- Missing-chat self-healing.
- Idempotent regeneration.
- Failure-path test proving an invalid public path no longer silently succeeds.
## 1.2.1 — 2026-08-15
### Critical upgrade fix
- Replaced the old single-table `Schema::ensure()` shortcut with a sequential migration ledger.
- Existing Communications installations now run every missing migration in natural version order instead of returning early when the original templates table already exists.
- Live-chat migration `003_live_chat.php` therefore runs correctly during module update, not only on fresh installs.
- Migration failures are transactional where supported and identify the exact migration that failed.
- Schema completion is checked after migrations.
### Packaging
- `addon.json` and `manifest.json` explicitly declare `package_type: module`.
- Version bumped to 1.2.1 so it cannot collide with the rejected/staged 1.2.0 package history.
## 1.2.0 — 2026-08-15
### Completed
- Site-wide live chat is automatically injected on public pages when Communications is enabled; no floating widget placement is required.
- Chat uses a speech-bubble icon, fetch-driven history/send/poll, secure guest session cookie, unread badge, mobile full-screen UI, office hours/away message, identity requirements, optional avatar/accent and path exclusions.
- Chat conversations and staff replies are fully integrated with the Communications Inbox.
- Contact/Message widget now provides Contact Card and fetch-driven Inline Form layouts; obsolete Floating Button layout removed.
- SMS provider validation now includes stored secrets; Providers includes real SMS test, segment count and administrator-configured approximate cost.
- Web Push VAPID key generation is exposed when the required runtime library is available.
- Reports include normalized provider callback outcomes.
- System Status page explicitly reports operational, configuration-required, dependency-required, disabled and unsupported-external-workflow states.
### Compatibility
- Requires DivisionDesk Core 3.6.4 for automatic public-page integration.
- Coordinated DivisionDesk Server 1.11.4 adds bounded independent DKIM verification and DMARC evaluation via aligned DKIM.
## 1.1.4 — 2026-08-14
### Fixed
- Full Deliverability create/status calls allow up to 20 seconds for bounded DivisionDesk Server analysis.
- Rebuilt directly from the publisher-validated Communications 1.1.2 package to eliminate staging ambiguity from the rejected 1.1.3 package.
## 1.1.2 — 2026-08-14
### Improved
- Deliverability modal now displays **Test Coverage** separately from Inbox Probability.
- Unavailable SpamAssassin and reputation checks are shown as `Not checked`/`Unable to check` rather than visually implying failure.
- Authentication shows evidence-aware states: Pass, Fail, Signature Present, Policy Present, or Unknown.
- Content & Links now includes a detailed reputation-query report showing provider, tested IP/domain, DNS response, interpretation and query.
- Reputation results distinguish **Clear**, **Listed**, and **Unable to Check**.
- Recommendations explain excluded/unavailable signals instead of treating them as negative delivery evidence.
## 1.1.1 — 2026-08-14
### Fixed
- Deliverability results now render as a true fixed overlay instead of appearing at the bottom of the Campaigns page.
- Mobile view becomes a full-screen sheet with scrollable details.
- Page scrolling is locked while the modal is open.
- Restored the `TestEmail::send(..., $options)` signature needed to attach the secure live-test correlation header.
- Live status displays mailbox-poll warnings instead of silently waiting forever.
## 1.1.0 — 2026-08-14
### Added
- Instant campaign Preflight Analysis.
- Full Deliverability Test through `mailtest@divisiondesk.com`.
- Secure DivisionDesk Server create/status test workflow.
- Actual campaign is sent through the site's configured SMTP transport with a correlation header.
- Responsive circular Inbox Probability gauge with gradual deep-red → red → orange → yellow → green progression.
- Large desktop modal becomes a full-screen mobile sheet.
- Live polling states: sending, waiting, received/analyzing, complete.
- SpamAssassin, authentication, blocklist, structure, content/link and recommendations tabs.
- Fetch-driven workflow; Campaign composer never reloads during testing.
### Changed
- Inbox Probability is explicitly presented as a DivisionDesk estimate, not a receiving-provider guarantee.
## 1.0.7 — 2026-08-14
### Fixed
- Fixed Campaign fetch actions returning Administration HTML before JSON.
- AJAX Campaign requests now authenticate/authorize without rendering `AdminUi::start()` first.
- CSRF verification is handled inside the JSON request error path.
- AJAX responses are explicitly JSON and `Cache-Control: no-store`.
### Diagnostics
- If a future fetch request receives non-JSON content, DivisionDesk shows a short excerpt of the actual HTTP response instead of directing the administrator to a server log that may contain no error.
## 1.0.6 — 2026-08-14
### Fixed
- Fixed `SMTP host and a valid envelope/From email are required` when Core has a valid From address but the optional envelope sender is blank.
- Empty `envelope_from` now correctly falls back to Core `from_email`.
### Changed
- Campaign **Send Email Test** and **Save Campaign** now use `fetch()` and display success/errors in place.
- Transport/validation errors no longer refresh the Campaigns page or clear the composer.
- Non-AJAX fallback restores posted campaign fields after a server-rendered error.
- Submit buttons show a busy state and duplicate submissions are prevented.
### UX direction
- Fetch/AJAX-style in-place actions are the preferred DivisionDesk interaction model where practical.
- User-entered form data should survive errors rather than returning to blank forms.
## 1.0.5 — 2026-08-14
### Fixed
- Fixed campaign test failure `List-Unsubscribe must be HTTPS or mailto.`
- Core relative/base-path URLs are no longer inserted directly into email headers.
- HTTPS web requests automatically establish a canonical DivisionDesk public site URL for Communications.
- Background campaign jobs reuse the stored canonical HTTPS site URL.
- Local/LAN/non-HTTPS installations fall back to a standards-valid `mailto:` List-Unsubscribe target instead of emitting an invalid relative URL.
- `List-Unsubscribe-Post: List-Unsubscribe=One-Click` remains limited to actual HTTPS unsubscribe endpoints.
- Avoids duplicating the Core base path when building absolute unsubscribe URLs.
### Diagnostics
- Communications Providers and Deliverability now show whether bulk email is using HTTPS one-click unsubscribe or the mailto fallback.
## 1.0.4 — 2026-08-14
### Fixed
- Communications now reads the existing DivisionDesk Core **Email Delivery** configuration for SMTP and From settings.
- Campaign Email Test no longer incorrectly reports SMTP as unconfigured when Core SMTP is already working.
- SMTP password is consumed from Core Mailer configuration; Communications no longer expects a duplicate `communications.smtp.password`.
- Blank EHLO/HELO remains blank in configuration and is resolved automatically by the mail transport at connection time.
- Campaign and queued email failures now identify the specific missing Core Email Delivery setting.
### Changed
- Communications → Providers no longer presents a second SMTP configuration form.
- The Providers page shows Core email readiness/status and links directly to the global Email Delivery page.
- Communications-owned provider settings are now limited to SMS and Web Push.
## 1.0.3 — 2026-08-14
### Fixed
- Fixed Campaigns buttons appearing to do nothing with Chrome error `An invalid form control with name='push_url' is not focusable`.
- Push URL, image, icon and badge fields now accept DivisionDesk template variables such as `{{site.url}}` without HTML5 URL validation blocking form submission.
- **Send Email Test** now uses `formnovalidate` so hidden/unrelated campaign channel fields cannot prevent a transport/template test from reaching PHP.
## 1.0.2 — 2026-08-14
### Fixed
- Built-in templates now self-heal if a previous installation or upgrade left `communications_templates` empty.
- Added upgrade migration 002 so 1.0.2 reliably invokes the idempotent template seeder after upgrading.
- Module registration, Campaigns, and Templates defensively restore missing built-ins without overwriting existing customized templates.
- Corrected Campaign list column rendering for topic, channels, schedule, deliveries and actions.
### Added
- Rebuilt Campaigns as a polished multi-channel composer.
- Template selection now immediately loads the template subject, styled HTML, plain-text version, SMS text and push payload into the composer.
- Rich HTML email editor with formatting controls and HTML-source toggle.
- Sandboxed email preview and push-notification preview.
- Immediate single-recipient SMTP campaign test using the production Communications email builder, including multipart HTML/text, Date, Message-ID, List-Unsubscribe and one-click unsubscribe headers.
- Improved channel cards/tabs, SMS character count, audience/timing controls and contextual deliverability guidance.
- Redesigned Template Library with cards, statistics, editor, and Restore Missing Built-ins control.
- Upgraded built-in Newsletter, Receipt, Donation Receipt, Announcement, Official Notice, Events, Dues Renewal, Welcome, Login Code, Application Status and Contact Response templates with polished inline email styling.
### Compatibility
- Requires DivisionDesk Core 3.6.0 or newer; Core 3.6.1 is recommended.
## 1.0.1 — 2026-08-14
### Fixed
- Fixed fresh installation failure: `SQLSTATE[HY000]: General error: 1 no such table: communications_templates`.
- Communications now ensures its schema exists before seeding built-in templates.
- Install, enable and update entry points are safe against a partially completed 1.0.0 installation.
- Existing `CREATE TABLE IF NOT EXISTS` migration statements make recovery non-destructive.
### Compatibility
- Works with DivisionDesk Core 3.6.0 and newer.
- Core 3.6.1 separately corrects the generic module lifecycle ordering for all modules.
## 1.0.0 — 2026-08-14
### Added
- Multi-channel campaign model for Email, SMS, Push and on-site delivery.
- Membership Manager audience adapter with active-member, Camp and role targeting.
- Shared background delivery jobs using DivisionDesk Core 3.6 Job Queue.
- Multipart HTML/plain-text email construction with Date, Message-ID, Reply-To, List-ID, List-Unsubscribe and one-click unsubscribe headers where appropriate.
- Non-transactional email footer with physical/site address and unsubscribe link.
- Email header-injection safeguards.
- Deliverability Center with SMTP, sender, SPF and DMARC checks plus DKIM guidance.
- Suppression system for opt-outs, provider failures and invalid destinations.
- Built-in communication templates: Newsletter, Receipt, Donation Receipt, Announcement, Official Notice, Event Announcement, Event Reminder, Registration Confirmation, Dues Renewal, Welcome, Login Code, Application Status and Contact Response.
- SMS provider abstraction with Twilio, Amazon SNS and Telnyx outbound adapters.
- Normalized Twilio errors for invalid, landline/non-SMS, unreachable and opted-out numbers.
- Automatic permanent SMS suppression for selected permanent provider failures.
- STOP/START handling for inbound SMS.
- Incoming SMS webhook/conversation handling for Twilio and Telnyx.
- Standards-oriented Web Push subscription database and service worker.
- VAPID Web Push adapter integration point.
- Rich push payload model: title, body, URL, image, icon, badge, actions, tag, TTL, urgency and require-interaction.
- Unified Conversations Inbox for website/contact/SMS messages.
- Public Contact Us / Website Messaging system.
- Member Communication Preferences page.
- Contact, Announcement and Communication Preferences widgets.
- NotificationService API for other DivisionDesk modules to queue transactional or bulk notifications.
- Notification Rule trigger/action foundation.
- Provider settings using Core encrypted Secret Vault.
- Delivery reports, provider-event history and configurable retention foundation.
### Security
- Provider secrets are encrypted by Core 3.6 Secret Vault.
- Twilio webhook signatures are validated before incoming events are trusted.
- Telnyx Ed25519 webhook verification is supported when a public verification key is configured.
- Email header values reject CR/LF injection.
### Compatibility
- Requires DivisionDesk Core 3.6.0 or newer.
Release History
2026-10-01T23:07:19+00:00
Fixes the Core 4.6.58 update lifecycle contract while retaining reusable mailing lists, dynamic All Members, multi-list campaign selection, CSV/manual recipient management, and recipient deduplication.
2026-09-25T21:57:46+00:00
Adds reusable mailing lists, CSV/manual recipient management, a dynamic All Members audience, multi-list campaign selection, and email deduplication while preserving the existing campaign delivery pipeline.
2026-09-25T21:48:39+00:00
Adds reusable mailing lists, CSV/manual recipient management, a dynamic All Members audience, multi-list campaign selection, and email deduplication while preserving the existing campaign delivery pipeline.
2026-09-14T22:11:04+00:00
Fixes staff-alert polling for authenticated members with administrative roles by using Core unified-principal authentication while retaining communications.inbox permission enforcement.
2026-09-13T06:32:27+00:00
Fixes staff-alert polling for authenticated members with administrative roles by using Core unified-principal authentication while retaining communications.inbox permission enforcement.