Skip to content

Newsletter

This page is generated from public package documentation in capell-4/packages and the package manifest checked into the source repository.

FieldValue
Composer packagecapell-app/newsletter
Package slugnewsletter
Product groupCapell Marketing
Tierpremium
Bundlenewsletter
Runtime contextsadmin, frontend
Capell version^4.0
Source repositorycapell-app/packages
Source pathpackages/newsletter
Docs sourcepackages/newsletter/docs
Manifestcapell.json

Newsletter manages audiences, subscriptions, consent state, imports, notifications, and public subscription routes.

  • Package: capell-app/newsletter
  • Namespace: Capell\Newsletter\
  • Surfaces: Filament admin, console, HTTP, queue, database
  • Service providers: packages/newsletter/src/Providers/AdminServiceProvider.php, packages/newsletter/src/Providers/NewsletterServiceProvider.php
  • Capell dependencies: capell-app/admin, capell-app/core, capell-app/form-builder, capell-app/frontend, capell-app/tags
  • Adds subscriber capture, consent state, imports, notifications, and public subscription routes for Capell sites.
  • Helps owners build audience workflows without putting newsletter-specific logic into Form Builder or Campaign Studio.
  • Gives developers provider sync and subscription Actions that can connect to email, public actions, and growth workflows.
  • Newsletter manages audiences, subscriptions, consent state, imports, notifications, and public subscription routes.
  • Admin resources: FormMappingResource, ImportBatchResource, NewsletterTagResource, ProviderAudienceResource, ProviderConnectionResource, ProviderInterestMappingResource, SegmentResource, SubscriberResource, SyncAttemptResource.
  • Package setup or maintenance commands.
  • NewsletterServiceProvider registers public routes, admin resources, jobs, listeners, migrations, settings, and translations.
  • Subscription, import, consent, and notification behaviour lives in actions and jobs.
  • Public endpoints route through controllers and should treat all payloads as untrusted input.
AreaPathPurpose
Actionspackages/newsletter/src/ActionsDomain operations. Test these directly where possible.
Datapackages/newsletter/src/DataStructured payloads, form state, view models, and integration data.
Enumspackages/newsletter/src/EnumsPersisted states and Filament option values.
Modelspackages/newsletter/src/ModelsEloquent records owned by the package.
Filamentpackages/newsletter/src/FilamentAdmin resources, pages, widgets, and settings UI.
HTTPpackages/newsletter/src/HttpControllers, middleware, and request handling.
Jobspackages/newsletter/src/JobsQueued work and async side effects.
Providerspackages/newsletter/src/ProvidersRegistration, extension hooks, routes, migrations, and resources.
Resourcespackages/newsletter/resourcesViews, translations, assets, and package resources.
Routespackages/newsletter/routesRoute files loaded by the service provider.
Configpackages/newsletter/configPackage configuration and publishable config.
Databasepackages/newsletter/databaseMigrations, seeders, and settings migrations.
Testspackages/newsletter/testsPackage-level Pest coverage.
  • Resources: FormMappingResource, ImportBatchResource, NewsletterTagResource, ProviderAudienceResource, ProviderConnectionResource, ProviderInterestMappingResource, SegmentResource, SubscriberResource, SyncAttemptResource.
  • Pages: CreateFormMapping, CreateNewsletterTag, CreateProviderAudience, CreateProviderConnection, CreateProviderInterestMapping, CreateSegment, CreateSubscriber, EditFormMapping, EditNewsletterTag, EditProviderAudience, EditProviderConnection, EditProviderInterestMapping, EditSegment, EditSubscriber, and related pages.
  • Widgets: NewsletterOverviewStatsWidget.
  • Settings: NewsletterSettings.
  • Controllers: ConfirmSubscriptionController, ProviderWebhookController, UnsubscribeController.
  • Routes: packages/newsletter/routes/web.php.
  • Jobs: SyncSubscriberToProviderJob.
  • newsletter:sync-retry-due {--limit= : Maximum number of due attempts to requeue} (packages/newsletter/src/Console/Commands/RequeueDueProviderSyncAttemptsCommand.php)
  • Models: ConsentEvent, FormMapping, ImportBatch, ProviderAudience, ProviderConnection, ProviderInterestMapping, ProviderSubscriber, PublicToken, Segment, Subscriber, SyncAttempt.
  • Migrations: 2026_05_10_190861_01_create_newsletter_provider_connections_table.php, 2026_05_10_190861_02_create_newsletter_subscribers_table.php, 2026_05_10_190861_03_create_newsletter_provider_audiences_table.php, 2026_05_10_190861_04_create_newsletter_consent_events_table.php, 2026_05_10_190861_05_create_newsletter_provider_interest_mappings_table.php, 2026_05_10_190861_06_create_newsletter_provider_subscribers_table.php, 2026_05_10_190861_07_create_newsletter_public_tokens_table.php, 2026_05_10_190861_08_create_newsletter_segments_table.php, 2026_05_10_190861_09_create_newsletter_sync_attempts_table.php, 2026_05_10_190861_10_create_newsletter_form_mappings_table.php, 2026_05_10_190861_11_create_newsletter_import_batches_table.php.
  • Config: packages/newsletter/config/capell-newsletter.php.
  • Data objects live in src/Data/; use them for payloads, form state, and view models.
  • Contracts: NewsletterAudienceProvider, NewsletterProviderAdapter, NewsletterSegmentProvider.
  • Listeners: SubscribeFromFormSubmission.
  • Register Capell extension points, routes, migrations, settings, render hooks, and resources from service providers.
  • Adds audience, subscriber, subscription, consent, import, segment, and notification tables.
  • Adds newsletter admin resources and settings.
  • Adds public subscription endpoints and async newsletter processing jobs.
  • Install with composer require capell-app/newsletter in the host Capell application.
  • Run migrations through the host application package install flow.
  • In this repository, verify package changes with vendor/bin/pest; do not use php artisan.

Run package tests from the repository root:

Terminal window
vendor/bin/pest packages/newsletter/tests --configuration=phpunit.xml
  • Treat public routes as untrusted input and keep validation, permission checks, and side effects inside actions or dedicated services.
  • Put behaviour changes in src/Actions/; UI classes, commands, and controllers should call actions instead of owning domain logic.
  • Use package Data classes at boundaries instead of passing anonymous arrays between layers.
  • Use backed enums for persisted values and enum labels for Filament options.