Bu makale şu anda yalnızca İngilizce olarak mevcuttur. Çeviri yakında eklenecektir.
Odoo 19 Marketing Automation: Trigger Library, A/B Testing, Audience Builder
Marketing automation in Odoo 17 was usable but rough around the edges: triggers were a small fixed list, A/B testing required Studio + custom server actions, and audience building meant clicking through filter dropdowns. Odoo 19 rebuilt this module to compete with mid-market platforms (Mailchimp, ActiveCampaign, HubSpot Marketing Hub) on workflow capability while staying integrated with the rest of the ERP.
This article covers what's new and how to actually use it for B2B and B2C scenarios. ECOSIRE has built marketing-automation flows for 20+ Odoo clients across SaaS, eCommerce, and services — the patterns below come from real campaigns.
Key Takeaways
- Trigger library expanded from ~10 stock triggers to 40+ covering CRM, sales, eCommerce, and survey events
- A/B testing is native at the message level (subject line, content, send time, sender)
- Audience builder supports nested AND/OR predicates with relational lookups
- Send-time optimization picks per-recipient time based on historical opens
- Deliverability dashboard surfaces bounce rate, spam complaint rate, list health
- Webhook trigger lets external systems start an automation flow
- Custom triggers can be registered via Python class for ERP-specific events
Trigger library — what's available now
Odoo 17's trigger options were a flat list (record created, record updated, time-based, event date, click on link). Odoo 19 organizes them into categories:
| Category | Example triggers |
|---|---|
| CRM | Lead created, lead stage changed, opportunity won, opportunity lost, no activity for N days |
| Sales | Order confirmed, order delivered, order paid, recurring renewal upcoming |
| eCommerce | Cart abandoned, cart resumed, product viewed N times, wishlist created |
| Subscription | Trial started, trial ending in N days, subscription churned, payment failed |
| Helpdesk | Ticket created, ticket SLA breached, NPS score submitted |
| Survey | Response submitted, score below threshold |
| Custom | Webhook received, Python condition true |
Each trigger has typed inputs (e.g., "no activity for 14 days" with a numeric input) and exposes the triggering record as a context variable available in downstream actions.
A/B testing — native and visual
In Odoo 17, A/B testing email subject lines required:
- Duplicate the campaign
- Send variant A to half the audience
- Send variant B to the other half
- Compare open rates manually
- Repeat for the winning variant on the rest of the list
Odoo 19's native A/B test:
- One campaign with multiple variants
- Audience auto-split (configurable percentage, e.g., 10% each variant + 80% to winner)
- Statistical significance check before declaring a winner
- Auto-send winner to the holdout
Variants can differ on: subject, content, send time, sender, or any combination.
Campaign: Winter Promo
Variant A: Subject "Last chance — 25% off" | Send: 10 AM
Variant B: Subject "25% off ends tonight" | Send: 4 PM
Variant C: Subject "Your discount expires" | Send: 8 AM
Test split: 15% / 15% / 15% (45% sample)
Decision threshold: 95% confidence on open rate
Winner sends to remaining 55%
For lists below 5,000 contacts, statistical significance often won't be reached in a single send — the system surfaces this and lets you choose a tie-breaker rule.
Audience builder — nested predicates
The audience builder in 17 was a flat filter (Match all of: country=US, status=customer). For real campaigns ("US enterprise customers OR EU customers who attended last year's event AND opened the last 3 emails"), you needed Python in a server action.
Odoo 19's builder supports:
- Nested AND/OR groups
- Relational lookups across
res.partner↔crm.lead↔sale.order↔event.attendee - Aggregations ("contacts with at least 3 confirmed orders", "contacts with average order value > $500")
- Saved audiences that update dynamically
Audience: High-value reactivation candidates
ALL OF:
- Type = Customer
- Last order > 90 days ago
- Lifetime value > $5,000
AND ANY OF:
- Opened email in last 30 days
- Visited product page in last 14 days
Audiences are reusable across campaigns and update on a schedule (default daily).
Send-time optimization
For each recipient, Odoo 19 records when they historically open emails (hour-of-day, day-of-week). When you schedule a campaign with "send-time optimization" enabled, each recipient receives at their personal best time within a configurable window.
In benchmarks across three of our clients:
- Open rate: +12 to +28 percent vs fixed-time send
- Click rate: +8 to +18 percent
- Unsubscribe rate: -5 to -10 percent
The model needs ~3 historical sends per recipient to calibrate; for new lists, it falls back to time-zone-aware defaults.
Deliverability dashboard
Email deliverability has compounding consequences (bad sender reputation → more spam folder placements → fewer opens → harder to fix). Odoo 19 surfaces:
- Bounce rate (hard + soft) per campaign + 30-day rolling
- Spam complaint rate (from feedback loops)
- Blocked-by-ISP rate with breakdown per ISP
- Engaged vs disengaged segments (open frequency)
- Recommendations: "remove 1,247 contacts who haven't opened in 12 months"
For SMBs without a dedicated email-deliverability person, this dashboard is the difference between landing in inbox and landing in spam.
Webhook trigger
External systems can start a marketing-automation flow by POSTing to a campaign-specific webhook URL. This unlocks:
- Stripe webhook → trigger renewal-thank-you flow
- Custom inventory system → trigger back-in-stock notification
- Calendar booking tool → trigger meeting-confirmation flow
- Customer survey tool → trigger NPS-detractor recovery flow
The webhook payload must include either an email or a res.partner ID for routing; everything else passes through to the flow as context.
Custom Python triggers
For ERP-specific events that don't fit any built-in trigger, register a Python class:
from odoo.addons.marketing_automation.models.marketing_trigger import MarketingTrigger
class MyCustomTrigger(MarketingTrigger):
_name = 'my_module.custom_trigger'
_description = 'Custom: Lead became sales-qualified'
def evaluate(self, campaign):
# return recordset of partners to enroll
return self.env['crm.lead'].search([
('stage_id.is_qualified', '=', True),
('email_from', '!=', False),
('marketing_enrolled', '=', False),
]).mapped('partner_id')
The marketing module discovers and exposes this trigger in the campaign builder UI.
Migration path from Odoo 17
- Inventory existing campaigns: list all 17 campaigns + their triggers + audiences.
- Map triggers: 17 trigger types map 1:1 to 19 categorized triggers.
- Refactor audiences: flat filters become nested predicates; saved audiences carry over.
- A/B testing: any custom Python A/B logic should be retired in favor of native variants.
- Deliverability cleanup: run the dashboard's "remove disengaged" recommendation pre-migration to clean lists.
- Webhook re-wiring: external integrations using the old webhook structure need URL updates.
Real-world campaign metrics
For a SaaS client running renewal-reminder automation:
| Metric | 17.0 | 19.0 |
|---|---|---|
| Avg open rate | 24% | 36% |
| Avg click rate | 4.1% | 7.2% |
| Renewal lift attributable to email | +9% | +18% |
| Time to build a new campaign | 2-3 hours | 30-45 min |
The campaign-build time drop comes from the predicate audience builder; the open-rate lift comes from send-time optimization plus better A/B testing yielding stronger subject lines.
Frequently Asked Questions
Does Odoo 19 marketing automation work without an external email service?
Odoo 19 ships with built-in SMTP relay options and integrates with Amazon SES, Sendgrid, Mailgun, Postmark, and any custom SMTP. For lists over 10K, an external service is recommended for deliverability and rate-limit reasons. The deliverability dashboard works with any provider.
Can I import audiences from Mailchimp or HubSpot?
Yes via CSV import on res.partner with a marketing_segment_ids column, or via the Odoo connectors for those platforms. The connectors sync both contacts and segments. Audience definitions don't carry over (they live in the source platform); you rebuild them in Odoo's predicate builder.
How does send-time optimization handle time-zone changes?
The recipient's current time-zone (from res.partner.tz) is the primary signal. The historical-open data is normalized to UTC for storage, then converted at send-time. Recipients without a tz set fall back to the company's tz.
What happens to my running 17.0 campaigns during migration?
Pause them before backup. Post-migration on 19, the campaigns and their state migrate; you re-enable them in the new builder. Active enrollments (contacts mid-flow) carry over. Test one campaign with a small audience before bulk re-enabling.
Can custom Python triggers slow down the system?
The trigger evaluator runs on a cron (default every 15 minutes). A trigger that performs heavy queries on every run will cost CPU. Best practice: filter aggressively in the query (use indexed fields, narrow date ranges) and prefer event-based triggers (signal from another model) over polling triggers where possible.
Marketing Automation is a high-leverage upgrade target for Odoo 17 customers because the productivity and result delta is so visible. ECOSIRE's Odoo implementation team has built marketing automation flows for SaaS renewal, eCommerce abandoned-cart recovery, and B2B nurture sequences. We offer a fixed-fee 2-week marketing-automation rollout that includes audience setup, three live flows, and deliverability tuning. Browse our Odoo modules catalog for marketing add-ons that extend the native capability.
Yazan
ECOSIRE TeamTechnical Writing
The ECOSIRE technical writing team covers Odoo ERP, Shopify eCommerce, AI agents, Power BI analytics, GoHighLevel automation, and enterprise software best practices. Our guides help businesses make informed technology decisions.
ECOSIRE
Odoo ERP ile İşinizi Dönüştürün
Operasyonlarınızı kolaylaştırmak için uzman Odoo uygulaması, özelleştirme ve destek.
İlgili Makaleler
Odoo Form Görünümüne Özel Düğme Nasıl Eklenir (2026)
Odoo 19 form görünümlerine özel eylem düğmeleri ekleyin: Python eylem yöntemi, görünüm devralma, koşullu görünürlük, onay diyalogları. Üretimde test edilmiştir.
Odoo'da Studio Olmadan Özel Alan Nasıl Eklenir (2026)
Odoo 19'daki özel modül aracılığıyla özel alanlar ekleyin: model mirası, görünüm uzantısı, hesaplanan alanlar, mağaza/depo dışı kararlar. Kod öncelikli, sürüm kontrollü.
Odoo'da Harici Düzeni Kullanarak Özel Rapor Nasıl Eklenir?
Web.external_layout'u kullanarak Odoo 19'da markalı bir PDF raporu oluşturun: QWeb şablonu, paperformat, action bağlama. Baskı logosu + altbilgi geçersiz kılmalarıyla.