Paid add-on. Marketing is licensed separately from the open-source packages. See pricing
AI features
The AI subject-line assistant and account briefings included with Odden Marketing, how to turn them on with your own Anthropic key, and what the model is sent.
Odden Marketing includes AI features. They are part of the package: there is nothing extra to buy or install, and they need no separate license. They run on your own Anthropic key, so nothing about them is billed by Odden, and with no key every feature falls back to a built-in version.
| Feature | What it does | Without a key |
|---|---|---|
| AI subject lines | The AI Copy Assistant in the campaign editor suggests subject lines for a topic, tone, and audience. | Suggestions from a fixed set of phrases |
| AI account briefing | A short written summary at the top of a contact or company: what has happened recently and what needs attention. | A rule-based summary |
| AI copy review | Reads a campaign's subject and body before it is sent and lists what to look at: claims that need backing, wording that may need a disclaimer, unclear passages, and (when you give it your brand guidelines) where the copy departs from them. | A fixed list of risky wording (superlatives, guarantees, health and earnings claims, named competitors, shouting) |
The subject lines work wherever Marketing is installed. The briefing also uses deals when getodden/crm-sales is installed, and tickets when getodden/crm-service is.
Turn it on
Set your key in the environment:
ODDEN_AI_API_KEY=sk-ant-...That is all. The panel (getodden/crm-filament) asks the container for the AI implementations, so the AI Copy Assistant and the AI Briefing start using the model with no change to your code.
| Setting | Env | Default |
|---|---|---|
odden-pro.ai.api_key |
ODDEN_AI_API_KEY |
none: AI off |
odden-pro.ai.model |
ODDEN_AI_MODEL |
claude-haiku-4-5-20251001 |
odden-pro.ai.base_url |
ODDEN_AI_BASE_URL |
https://api.anthropic.com |
odden-pro.ai.timeout |
ODDEN_AI_TIMEOUT |
20 seconds |
odden-pro.ai.max_calls_per_hour |
ODDEN_AI_MAX_CALLS_PER_HOUR |
60 (per workspace) |
odden-pro.ai.cache_minutes |
ODDEN_AI_CACHE_MINUTES |
60 |
odden-pro.ai.briefing_detail |
ODDEN_AI_BRIEFING_DETAIL |
titles |
Publish the config file with php artisan vendor:publish --tag=odden-pro-config. On a multi-tenant host such as Odden Cloud the settings are read on every call, so each workspace's own key is the one used.
What the model is sent
- Account briefing: the record's scores, counts of deals and tickets, and the type, title, and date of its 15 most recent activities. Never the record's name, email address, or phone number: the model writes
{{subject}}and the name is put in afterwards. Withbriefing_detail=notesit also gets the first 300 characters of each activity's text, which makes a better briefing and also sends whatever people wrote there. Leave it ontitlesunless the owner of the key is comfortable with that. - Subject lines: the topic, tone, and audience typed in the panel.
- Copy review: the campaign's subject, its body as plain text (the first 8,000 characters, with no markup or styles), and your brand guidelines if you supply them (the first 4,000 characters). Nothing about the recipients is sent.
Text from the CRM is passed as data inside tags, and the instructions tell the model never to follow instructions found in it. Customers write some of that text, so the model never decides anything: the briefing's sentiment badge stays the built-in rule-based one, and everything the model writes is stripped to plain text and length-limited before it is shown.
Copy review is advice, not a gate
The review never blocks a send and never changes the campaign. It lists findings by severity (high, medium, low) with a suggested fix, optional before-and-after rewrites for the most serious ones, and a separate list of claims to check with someone qualified. It is not legal advice, and the fixed-rule version it falls back to only looks for a short list of wording.
In the panel it is the Review Copy button on each campaign. Anyone who can view the campaign can use it, and the result is kept for ten minutes while the copy is unchanged. To have it check against your brand voice, set your guidelines as plain text:
MARKETING_BRAND_GUIDELINES="Warm and plain. Say email, not e-mail. No exclamation marks. Never promise results."That is odden-marketing.brand_guidelines in the config, so a multi-tenant host can set it per workspace. To use the review from your own code, resolve Odden\Marketing\Contracts\ReviewsCampaignCopy from the container:
$review = app(ReviewsCampaignCopy::class)->execute($campaign->subject, $html, $brandGuidelines);When AI is not used
Any of these returns exactly what the built-in version would have: no key set, the hourly cap reached, the provider unreachable or slow, an error or a refused key, or a reply that is not the expected JSON. The panel never shows an AI error. A failure is logged, never with the key.
Cost protection
The key belongs to you, so there are two guards on it: an hourly cap per workspace (max_calls_per_hour), and a briefing cache keyed on everything sent to the model, so an unchanged record is not summarised twice.