# Marketing Automation All in One with Lead Scoring

> Marketing automation driven by lead score: crossing a threshold enrols a lead, removes it, or moves it to another branch, with a reason logged.

- **What it is:** Marketing automation driven by lead score: crossing a threshold enrols a lead, removes it, or moves it to another branch, with a reason logged.
- **For:** Marketing
- **Odoo versions:** 16.0, 17.0, 18.0, 19.0, 20.0 - Community and Enterprise
- **Runs on:** Odoo.sh or Odoo you host yourself - not Odoo Online, which accepts no third-party apps
- **Price:** 287 EUR, one-time, on the Odoo Apps Store
- **Technical name:** bambooforge_ma_scoring
- **Not for:** Said before you buy, because it is the half that decides whether the app fits:; Re-enter a lead sitting on a line every run: triggers fire on the crossing between last seen and now.; Let a brand-new lead drop below a line on its first day.
- **Manual:** https://docs.bambooforge.dev/bambooforge_ma_scoring/
- **Live demo:** https://demo20.bambooforge.dev/odoo/action-bambooforge_ma_scoring.action_bf_journey_score_event
- **Store page:** https://apps.odoo.com/apps/modules/20.0/bambooforge_ma_scoring
- **Manual last updated:** 2026-10-15

---
# Marketing Automation All in One with Lead Scoring

An add-on for **BambooForge Lead Scoring** and **BambooForge Marketing
Automation** (17.0). A lead score that crosses a line moves the lead:
into a journey, out of one, or onto another branch - with a log that
says why.

## Triggers

On a journey whose audience is *Leads/Opportunities*, a **Score
triggers** tab. Each trigger is one line and one action:

- **Score reaches N** - fires when the score goes from below N to N or
  above.
- **Score drops below N** - fires when the score goes from N or above
  to below N.
- **Grade becomes X** - fires when the grade changes to X.

and does one of:

- **Enrol in this journey** - the lead joins at the first step.
- **Remove from this journey** - the running participant is exited.
- **Move to step** - the running participant is put on the chosen step
  (due after that step's delay). A lead not yet in the journey is
  enrolled first. This is how a lead that goes Hot jumps to the
  fast-track branch of the same journey.

Two switches per trigger:

- **Once per lead** (default on) - fire once per lead, ever. Off: every
  time the line is crossed.
- **Enrol again** - enrol a lead who already finished or left this
  journey. Off: only leads never in the journey are enrolled (unless
  the journey itself allows rejoin and the lead is still running).

## Crossings, not levels

Every lead remembers the score and grade the triggers last saw. A
trigger fires on the **crossing** between last seen and now - a lead
sitting at 80 does not re-enter *reaches 50* every ten minutes. A lead
seen for the first time can *reach* a line and can *become* a grade,
but can never *drop below* one: a brand-new lead at 0 does not "drop
below 10" on its first day.

## When it runs

- A cron every 10 minutes, on the leads whose score or grade moved
  since last seen - found with one SQL pass, not a scan of the table.
- **Evaluate now** on the journey's triggers tab.
- **Evaluate score triggers** on a lead (for the rep who does not want
  to wait).

## The log

*Marketing Automation ▸ Score events*: one row per firing - lead,
journey, trigger, score before and after, grade before and after, the
action, the participant, and a note (*enrolled*, *moved to 'Fast
track'*, *not enrolled: already finished or left*, …). The lead shows
**Journeys** and **Score events** buttons; the journey shows **Score
events**; each trigger shows how often it fired.

A failing trigger never stops the others: the error is logged, the
event is not written, and the lead stays a candidate for the next run.

## Technical notes

- Uses Marketing Automation 1.9.0's `_enroll_records(records,
  rejoin=)` and the participant's `_schedule(step)`; Lead Scoring's
  stored `lead_score` / `lead_grade_id`. Nothing is copied.
- Three fields on `crm.lead`: score seen, grade seen, evaluated.
- Community only. No Enterprise module, no external service.

## How we make sure it works

Before every release, **20 automated checks** run against this app on Odoo 16, 17, 18, 19 and 20.
Among them:

- Without rejoin a finished lead is not enrolled again.
- Enrol on a running lead is a no op with a note.
- Jump on a lead not in the journey enrols first.
- Threshold equal to the score is reached not dropped.
- A stopped journey fires nothing but marks seen.

The complete list is in the source you receive.

## What it does not do

Said before you buy, because it is the half that decides whether the app fits:

- Re-enter a lead sitting on a line every run: triggers fire on the crossing between last seen and now.
- Let a brand-new lead drop below a line on its first day.

## Install

1. Copy `bambooforge_ma_scoring` into your addons path and update the app list, or install the ZIP from the Odoo Apps Store.
2. Install **Marketing Automation Suite: Lead Score Journeys**.
3. Open **Score events**.

## Questions people ask

****Which Odoo versions does it run on?****

Odoo 16.0, 17.0, 18.0, 19.0, 20.0, on the series you buy it for; each series is its own listing.

****Community or Enterprise?****

Both. It needs no Enterprise app.

****What does it need?****

The standard Web; lead scoring, marketing automation (BambooForge) must be installed first app. No extra Python package.

****Where does it show up?****

Under the **Score events** menu.

****Does anything leave my server?****

No. It makes no call outside your Odoo server: no telemetry, no licence check, no third-party service.

****What happens if I uninstall it?****

Odoo drops the app's own tables and fields; the standard records it worked on (contacts, orders, products) stay as they are.
