Paid add-on. Marketing is licensed separately from the open-source packages. See pricing
Filament screens
The resources and pages Odden Marketing adds to the Odden Filament admin.
Odden Marketing adds its screens to the Odden admin panel by itself when getodden/crm-filament is installed: it registers them through the open package's Odden\Filament\Support\Modules registry, so there is nothing to configure. They live in Odden\Marketing\Filament, with views under the odden-marketing-filament namespace. To leave them out, use OddenPlugin::make()->disableModules('marketing'). Marketing also adds three tabs to the contact screen (Marketing Campaigns & Email Touchpoints, Lead Capture & Form Submissions, Lead Score & Decay History), a Recalculate Intent action to the company table, and a Marketing card to the Executive Overview.
Resources
The resources are in the Marketing navigation group. Sales and Marketing each have an item labelled Email Templates: the Sales one manages SalesEmailTemplate records used by cadences, and the Marketing one manages MarketingTemplate records used by campaigns.
| Resource | Model | Navigation | Pages |
|---|---|---|---|
CampaignResource |
Odden\Marketing\Models\Campaign |
Marketing › Campaigns | list, create, edit |
MarketingTemplateResource |
Odden\Marketing\Models\MarketingTemplate |
Marketing › Email Templates | list, create, edit |
MarketingFormResource |
Odden\Marketing\Models\MarketingForm |
Marketing › Lead Capture Forms | list, create, edit |
MarketingWorkflowResource |
Odden\Marketing\Models\MarketingWorkflow |
Marketing › Marketing Workflows | list, create, edit |
LandingPageResource |
Odden\Marketing\Models\LandingPage |
Marketing › Landing Pages | list, create, edit |
LeadScoringRuleResource |
Odden\Marketing\Models\LeadScoringRule |
Marketing › Lead Scoring Rules | list, create, edit |
NpsSurveyResource |
Odden\Marketing\Models\NpsSurvey |
Marketing › Nps Surveys | list, create, edit |
MarketingSubscriptionResource |
Odden\Marketing\Models\MarketingSubscription |
Marketing › Suppression List | list, create (no edit page) |
MarketingAssetResource |
Odden\Marketing\Models\MarketingAsset |
Marketing › Marketing Assets | list, create, edit |
MarketingEventResource |
Odden\Marketing\Models\MarketingEvent |
Marketing › Marketing Events | list, create, edit |
AdAudienceSyncResource |
Odden\Marketing\Models\AdAudienceSync |
Marketing › Ad Audience Sync Bridges | list, create, edit |
The template editor
A template's blocks are edited with a drag-and-drop editor, the MailEditor field of getodden/mail (version 2.2.1 or newer). The email is shown as it will be sent. Drag a block from the list onto the email, or drag a block to move it. Select a block to change its settings, and use Style options for the less common ones. Every action also has a button and a keyboard shortcut (move up and down, duplicate, delete, and Ctrl or Cmd + Z for undo), so nothing needs the mouse.
- Assets. The editor ships as Filament assets. Run
php artisan filament:assetsafter installing or updating (filament:upgradedoes it too, and runs oncomposer installin a standard Filament app). - Same data. Blocks are saved as the same list of
{type, data}slots as before, so existing templates open as they are. Apply Layout Preset and Insert Reusable Snippet change the blocks in the editor like any other edit. - Not editable here yet. Eight block types are editable in the editor: header, hero, text, button, image banner, feature highlights, spacer and footer. A block of any other type is kept exactly as it is, and can be moved, duplicated or deleted.
- Preview theme. The editor's preview uses the template's Brand & Global Styling tokens as they stand in the form, saved or not, so the colors, font, corner radius and width you see are the ones the email is built with (needs
getodden/mail2.2.1 or newer).
Campaigns
Row actions:
| Action | What it does |
|---|---|
| Preview | Renders the campaign with sample data in a modal. |
| Spam Audit | Runs AuditCampaignDeliverabilityAction and shows the result. |
| Send Now | Shown for draft and scheduled campaigns. Claims the campaign (it becomes Sending; a second click does nothing) and queues a DispatchCampaignJob, which compiles and queues the messages on the queue worker. Refused, with a notification, when the campaign has no list or no postal address is configured. |
| Pick Winner & Deploy | Shown for A/B campaigns that are sending and have no winner yet. Runs EvaluateAbTestWinnerAction, which also sends the winning variant to the remaining audience. |
| AI Copy Assistant | Suggests subject lines with the bound Odden\Marketing\Contracts\SuggestsSubjectLines (by default the template-based SuggestSubjectLinesAction, no AI model) and saves the one you pick to the campaign. |
| Send Test | Sends a proof to the addresses you enter with SendCampaignProofAction, optionally using a contact's data for merge tags. The proof is queued like other marketing mail (see Sending mail), so a queue worker must be running for it to arrive. |
| Duplicate | Creates a draft copy named "Copy of …" (Campaign::duplicateAsDraft()): content, audience, sender, targets, budget and settings are kept; counters, spend, schedule, send times, the A/B outcome and utm_campaign are not. |
The edit page also has Send Test and Duplicate header actions.
Other marketing resources
| Resource | Extra actions |
|---|---|
MarketingTemplateResource |
Layout presets and reusable snippets in the form, Generate AI Variants, Live Preview, Send Test (a one-off preview sent with Mail::html() during the request, not queued like campaign proofs), Evaluate A/B, Revisions, Export HTML, Export MJML, Download ZIP, and Replicate. The presets and the block editor come from getodden/mail, which getodden/crm-marketing requires. |
MarketingFormResource |
Embed Code modal and a public URL column. |
LandingPageResource |
Embed Snippet modal and a public URL column. |
MarketingWorkflowResource |
Visual Journey modal and the Workflow Execution Steps & Branching relation manager. |
MarketingSubscriptionResource |
Restore / Resubscribe for non-subscribed rows and Suppress for subscribed rows. Restoring an address suppressed for a bounce also resets the contact's bounced email status, so the address is checked again instead of staying blocked; restoring one that complained warns first. Hosts can listen for Odden\Marketing\Events\SuppressionLifted to keep a record. |
MarketingAssetResource |
Copy URL for the asset's download link. |
AdAudienceSyncResource |
Sync Now, which runs the bound Odden\Marketing\Contracts\PublishesAdAudience. By default that is SyncAdAudienceAction, which only computes the SHA-256 hashes and records the count; it does not contact an ad platform. Download hashed file gives a CSV for Google, Meta or LinkedIn to upload by hand; see Ad audiences. |
Pages
| Page | URL | What it does |
|---|---|---|
MarketingCockpit (Marketing Cockpit) |
/admin/marketing-cockpit |
Campaign, delivery, open/click, lead and workflow totals, recent campaigns, active forms and submissions, closed-loop metrics (CalculateClosedLoopMetricsAction) and a conversion funnel (AnalyzeConversionFunnelAction). It can send a campaign immediately with DispatchCampaignAction. |
AbmCockpit (ABM Cockpit) |
/admin/abm-cockpit |
Target accounts by tier, with intent scores and buying-committee counts. Recalculate runs CalculateCompanyIntentScoreAction for one company, or for every company that has an account_tier or an intent surge. |
MarketingAttribution (Attribution & ROI) |
/admin/marketing-attribution |
Campaign ROI, attributed pipeline and won revenue, leads and blended cost per lead, under a selectable attribution model: first_touch (default), last_touch, linear, u_shaped, w_shaped or time_decay. |
CampaignBenchmarking (Campaign Benchmarking) |
/admin/campaign-benchmarking |
Side-by-side comparison of selected campaigns against averages. It starts with the four most recently sent campaigns. |
MarketingCalendar (Campaign Calendar) |
/admin/marketing-calendar |
A month view of campaign sends, with previous, next and current month navigation. |
UtmLinkBuilder (UTM Link Builder) |
/admin/utm-link-builder |
Builds a tracked URL from a base URL (it defaults to url('/'), or to a landing page or campaign you select) and UTM source, medium, campaign, term and content. Nothing is saved. |
SenderDomainHealth (Domain Health (SPF/DKIM)) |
/admin/sender-domain-health |
Checks SPF, DKIM, DMARC and MX for a domain with DomainHealthCheckService. The domain defaults to the domain of odden-marketing.defaults.sender_email, and the DKIM selector defaults to odden. |
SenderDomainHealthmakes live DNS lookups (dns_get_record()) each time it renders.
URLs
Resources use filament.admin.resources.{slug}.index, pages use filament.admin.pages.{slug}:
| Class | URL | Route |
|---|---|---|
CampaignResource |
/admin/campaigns |
filament.admin.resources.campaigns.index |
MarketingTemplateResource |
/admin/marketing-templates |
filament.admin.resources.marketing-templates.index |
MarketingFormResource |
/admin/marketing-forms |
filament.admin.resources.marketing-forms.index |
LandingPageResource |
/admin/landing-pages |
filament.admin.resources.landing-pages.index |
MarketingWorkflowResource |
/admin/marketing-workflows |
filament.admin.resources.marketing-workflows.index |
LeadScoringRuleResource |
/admin/lead-scoring-rules |
filament.admin.resources.lead-scoring-rules.index |
MarketingSubscriptionResource |
/admin/marketing-subscriptions |
filament.admin.resources.marketing-subscriptions.index |
NpsSurveyResource |
/admin/nps-surveys |
filament.admin.resources.nps-surveys.index |
MarketingAssetResource |
/admin/marketing-assets |
filament.admin.resources.marketing-assets.index |
MarketingEventResource |
/admin/marketing-events |
filament.admin.resources.marketing-events.index |
AdAudienceSyncResource |
/admin/ad-audience-syncs |
filament.admin.resources.ad-audience-syncs.index |
| Page | URL |
|---|---|
MarketingCockpit |
/admin/marketing-cockpit |
AbmCockpit |
/admin/abm-cockpit |
MarketingAttribution |
/admin/marketing-attribution |
CampaignBenchmarking |
/admin/campaign-benchmarking |
MarketingCalendar |
/admin/marketing-calendar |
UtmLinkBuilder |
/admin/utm-link-builder |
SenderDomainHealth |
/admin/sender-domain-health |
Authorization
Pages and actions check your policies the same way the open resources do (see the Filament admin authorization).
| Page | Requires viewAny on |
|---|---|
| Marketing Cockpit | CampaignResource, MarketingFormResource, MarketingWorkflowResource, ContactResource |
| ABM Cockpit | CompanyResource |
| Attribution & ROI, Campaign Benchmarking, Campaign Calendar, Domain Health (SPF/DKIM) | CampaignResource |
| UTM Link Builder | CampaignResource, LandingPageResource |
Page and board actions
| Page | Method | Checks |
|---|---|---|
| ABM Cockpit | recalculateCompany() |
update on the company |
| ABM Cockpit | recalculateAll() |
update on every target account it would recalculate; if any is denied, nothing is recalculated |
| Marketing Cockpit | sendCampaignNow() |
update on the campaign |
Resource actions
| Resource or page | Actions | Checks |
|---|---|---|
| Campaigns | Send Now, Pick Winner & Deploy, AI Copy Assistant, Send Test (also on the edit page) | update on the campaign |
| Campaigns | Preview, Spam Audit | view on the campaign |
| Campaigns | Duplicate | view on the campaign and create for campaigns (create only on the edit page) |
| Marketing Templates | Send Test (also on the edit page), Apply Layout Preset, Evaluate A/B | update on the template |
| Marketing Subscriptions | Restore / Resubscribe, Suppress | update on the subscription |
| Ad Audience Syncs | Sync Now | update on the sync |
| Companies | Recalculate Intent | update on the company |
Swapping a built-in behaviour
| Contract | Used by | Built-in implementation |
|---|---|---|
Odden\Marketing\Contracts\SuggestsSubjectLines |
AI Copy Assistant on campaigns, and the subject-line helper on templates | SuggestSubjectLinesAction: fixed phrase templates, no AI model. |
Odden\Marketing\Contracts\PublishesAdAudience |
Sync Now on an ad audience sync | SyncAdAudienceAction: computes SHA-256 hashes and records the count; does not contact an ad platform. |
Overriding views
| View | Used by |
|---|---|
odden-marketing-filament::pages.marketing-cockpit |
MarketingCockpit |
odden-marketing-filament::pages.abm-cockpit |
AbmCockpit |
odden-marketing-filament::pages.marketing-attribution |
MarketingAttribution |
odden-marketing-filament::pages.campaign-benchmarking |
CampaignBenchmarking |
odden-marketing-filament::pages.marketing-calendar |
MarketingCalendar |
odden-marketing-filament::pages.utm-link-builder |
UtmLinkBuilder |
odden-marketing-filament::pages.sender-domain-health |
SenderDomainHealth |
Copy a view to resources/views/vendor/odden-marketing-filament under the same relative path to override it. Some actions also render views from Marketing itself, such as odden-marketing::template-preview.