Pack contents: UEMOA
In short
Section titled “In short”Two packs follow the rules shared by the eight states of the West African Economic and Monetary Union (UEMOA: Benin, Burkina Faso, Côte d’Ivoire, Guinea-Bissau, Mali, Niger, Senegal and Togo), in francs CFA (XOF). A workspace whose jurisdiction is one of those states sees them first in the rule library:
uemoa-emi1.1.0 (8 rules): e-money issuers and mobile money (Orange Money, Wave, MTN MoMo, Moov Money).uemoa-bank1.0.0 (8 rules): banks and microfinance institutions.
uemoa.cash_report (UE1) is in both, so there are 15 different rules. All are post-event except
uemoa.sim_swap_payout, which runs in a real-time decision. Every rule arrives
switched off, and every rule has a French name and description.
Several rules reuse a core, Ghana or Nigerian rule by reference with UEMOA amounts.
uemoa.emi_balance_cap needs the wallet’s balance after each transaction: send it as
balance_after in the transaction’s attributes. Transactions without it are skipped. See
Sending transactions.
All rules at a glance
Section titled “All rules at a glance”| Key | Library | Name | Pack | Mode · action | Alert about | Severity · score |
|---|---|---|---|---|---|---|
uemoa.cash_report |
UE1 | Cash transaction at or above the CENTIF reporting threshold | uemoa-emi |
post-event · alert | customer | low · 20 |
uemoa.linked_cash_daily |
UE2 | Several cash operations in a day above XOF 9 million together | uemoa-emi |
post-event · alert | customer | medium · 50 |
uemoa.emi_monthly_topup |
UE3 | E-money top-ups above the BCEAO monthly cap | uemoa-emi |
post-event · alert | customer | medium · 45 |
uemoa.emi_balance_cap |
UE4 | E-money balance above the BCEAO cap | uemoa-emi |
post-event · alert | account | medium · 40 |
uemoa.split_cash_in_agents |
UE5 | Cash-in split across many agents | uemoa-emi |
post-event · alert | customer | high · 70 |
uemoa.cash_out_after_cash_in |
UE6 | Cash-out right after cash-in | uemoa-emi |
post-event · alert | customer | high · 60 |
uemoa.sim_swap_payout |
UE7 | Payout soon after a SIM swap | uemoa-emi |
real-time · block | customer | critical · 85 |
uemoa.wallet_outside_union |
UE8 | Mobile money transfer outside the UEMOA | uemoa-emi |
post-event · alert | customer | medium · 40 |
uemoa.cash_report |
UE1 | Cash transaction at or above the CENTIF reporting threshold | uemoa-bank |
post-event · alert | customer | low · 20 |
uemoab.linked_cash_daily |
UEB1 | Several cash operations in a day above XOF 9 million together | uemoa-bank |
post-event · alert | customer | medium · 50 |
uemoab.special_examination |
UEB2 | Large operation by a new or high-risk customer | uemoa-bank |
post-event · alert | customer | medium · 45 |
uemoab.cash_50m |
UEB3 | Cash operation of XOF 50 million or more | uemoa-bank |
post-event · alert | customer | high · 60 |
uemoab.cash_debt_payment |
UEB4 | Debt paid in cash above XOF 5 million | uemoa-bank |
post-event · alert | customer | high · 60 |
uemoab.deposit_structuring |
UEB5 | Cash deposits just below the CENTIF threshold | uemoa-bank |
post-event · alert | customer | high · 70 |
uemoab.transfer_outside_union |
UEB6 | Large transfer outside the UEMOA | uemoa-bank |
post-event · alert | customer | medium · 35 |
uemoab.pep_large |
UEB7 | PEP transaction above XOF 10 million | uemoa-bank |
post-event · alert | customer | high · 70 |
The uemoa-emi pack (8 rules)
Section titled “The uemoa-emi pack (8 rules)”UEMOA e-money issuers and mobile money (in French: UEMOA : émetteurs de monnaie électronique et mobile money), version 1.1.0.
Typologies for e-money issuers (EME) and mobile money in the eight UEMOA states (Orange Money, Wave, MTN MoMo, Moov Money), in francs CFA: the CENTIF cash threshold, linked cash operations, the BCEAO e-money balance and monthly top-up caps, smurfing through agents, cash-out right after cash-in, SIM-swap payouts and wallet transfers outside the Union. Several rules reuse core and Ghana rules by reference. Values come from SpeculaPro’s research of BCEAO texts: confirm each with the BCEAO, the Commission Bancaire and your CENTIF before go-live.
Sources the pack cites:
- BCEAO Décision n°021 du 21 décembre 2023 fixant les montants seuils (loi uniforme LBC/FT/FP)
- BCEAO: textes LBC/FT (instructions 001, 002 et 003-03-2025)
- BCEAO Instruction n°020 du 8 octobre 2026 modifiant l’Instruction 008-05-2015 (plafonds de monnaie électronique)
uemoa.cash_report
Section titled “uemoa.cash_report”Cash transaction at or above the CENTIF reporting threshold · library UE1 · Cash reporting threshold · alert about the customer · severity low, score 20
In French: Opération en espèces atteignant le seuil de déclaration à la CENTIF.
Cash transactions of XOF 15,000,000 or more must be reported to the CENTIF (BCEAO Décision n°021 of 21 December 2023, art. 8, under the uniform AML/CFT/PF law). Reuses the core cash rule with the UEMOA threshold. Confirm with your CENTIF.
Reuses the logic of core.large_cash (from core) with the parameters below; only the values differ.
| Parameter | Meaning | Default |
|---|---|---|
threshold |
Cash threshold (base currency) | 15,000,000 |
Explanation shown to analysts: Cash transaction of {{txn.base_currency}} {{txn.amount}} at or above the {{txn.base_currency}} {{params.threshold}} CENTIF cash reporting threshold.
uemoa.linked_cash_daily
Section titled “uemoa.linked_cash_daily”Several cash operations in a day above XOF 9 million together · library UE2 · Linked cash operations · alert about the customer · severity medium, score 50
In French: Plusieurs opérations en espèces dans la journée dépassant 9 millions FCFA au total.
Several cash operations by the same customer in one day that together exceed XOF 9,000,000, none of them alone: the customer must be identified (BCEAO Décision n°021, art. 3), and splitting cash this way is a structuring indicator.
| Parameter | Meaning | Default |
|---|---|---|
threshold |
Together above (base currency) | 9,000,000 |
min_ops |
Operations in the day, at least | 2 |
Explanation shown to analysts: {{= int(features.ops_a_24h + features.ops_b_24h) }} cash operations totalling {{txn.base_currency}} {{= features.sum_a_24h + features.sum_b_24h }} in 24 hours, above {{txn.base_currency}} {{params.threshold}} together.
Expression
txn.type in ['cash_in', 'cash_out'] && txn.channel in ['agent', 'cash', 'momo'] && txn.amount <= params.threshold && features.sum_a_24h + features.sum_b_24h > params.threshold && features.ops_a_24h + features.ops_b_24h >= double(params.min_ops)uemoa.emi_monthly_topup
Section titled “uemoa.emi_monthly_topup”E-money top-ups above the BCEAO monthly cap · library UE3 · E-money cap breach · alert about the customer · severity medium, score 45
In French: Rechargements de monnaie électronique au-dessus du plafond mensuel BCEAO.
Money loaded on a customer’s e-money accounts at one issuer over 30 days above the BCEAO cap: XOF 10,000,000 a month, and XOF 15,000,000 from 2 November 2026 (Instruction n°020 of 8 October 2026 amending Instruction 008-05-2015, art. 31). The rule applies the cap in force on the transaction’s date, so it switches by itself on 2 November. Distributors and merchants acting professionally are exempt: list their segments or account types.
| Parameter | Meaning | Default |
|---|---|---|
monthly_limit |
Monthly cap today (base currency) | 10,000,000 |
monthly_limit_new |
Monthly cap from the date below (base currency) | 15,000,000 |
new_limit_from |
New cap applies from (YYYY-MM-DD, by the transaction’s date; empty: never) | 2026-11-02 |
exempt_segments |
Exempt customer segments | ["agent", "distributor", "merchant"] |
exempt_account_types |
Exempt account types | ["agent", "merchant"] |
Explanation shown to analysts: {{txn.base_currency}} {{features.in_30d}} loaded in 30 days, above the {{txn.base_currency}} {{= params.new_limit_from != ‘’ && txn.date >= params.new_limit_from ? params.monthly_limit_new : params.monthly_limit }} monthly e-money cap.
Expression
txn.direction == 'in' && !(customer.segment in params.exempt_segments) && !(account.type in params.exempt_account_types) && features.in_30d > (params.new_limit_from != '' && txn.date >= params.new_limit_from ? params.monthly_limit_new : params.monthly_limit)uemoa.emi_balance_cap
Section titled “uemoa.emi_balance_cap”E-money balance above the BCEAO cap · library UE4 · E-money cap breach · alert about the account · severity medium, score 40
In French: Solde de monnaie électronique au-dessus du plafond BCEAO.
A wallet whose balance after the transaction is above the BCEAO cap per identified customer and issuer: XOF 2,000,000, and XOF 4,000,000 from 2 November 2026 (Instruction n°020 of 8 October 2026). The rule applies the cap in force on the transaction’s date, so it switches by itself on 2 November. Needs the balance after the transaction in txn.attributes.balance_after; transactions without it are skipped. Distributors and merchants are exempt.
| Parameter | Meaning | Default |
|---|---|---|
max_balance |
Balance cap today (base currency) | 2,000,000 |
max_balance_new |
Balance cap from the date below (base currency) | 4,000,000 |
new_limit_from |
New cap applies from (YYYY-MM-DD, by the transaction’s date; empty: never) | 2026-11-02 |
exempt_segments |
Exempt customer segments | ["agent", "distributor", "merchant"] |
exempt_account_types |
Exempt account types | ["agent", "merchant"] |
Explanation shown to analysts: Balance of {{txn.base_currency}} {{txn.attributes.balance_after}} after this transaction, above the {{txn.base_currency}} {{= params.new_limit_from != ‘’ && txn.date >= params.new_limit_from ? params.max_balance_new : params.max_balance }} e-money cap.
Expression
'balance_after' in txn.attributes && double(txn.attributes.balance_after) > (params.new_limit_from != '' && txn.date >= params.new_limit_from ? params.max_balance_new : params.max_balance) && !(customer.segment in params.exempt_segments) && !(account.type in params.exempt_account_types)uemoa.split_cash_in_agents
Section titled “uemoa.split_cash_in_agents”Cash-in split across many agents · library UE5 · Smurfing through agents · alert about the customer · severity high, score 70
In French: Dépôts d’espèces répartis entre de nombreux agents.
Cash-ins through several Orange Money, Wave, MTN or Moov agents in a day adding up to a large sum: smurfing through the distribution network. Reuses the Ghana rule with a franc CFA threshold.
Reuses the logic of gh.split_cash_in_agents (from gh-psp) with the parameters below; only the values differ.
| Parameter | Meaning | Default |
|---|---|---|
min_agents |
Distinct agents in 24h | 3 |
min_total |
Total cash-in in 24h (base currency) | 3,000,000 |
Explanation shown to analysts: Cash-ins via {{features.agents_24h}} different agents totalling {{txn.base_currency}} {{features.cash_in_24h}} in 24h.
uemoa.cash_out_after_cash_in
Section titled “uemoa.cash_out_after_cash_in”Cash-out right after cash-in · library UE6 · Wallet used as pass-through · alert about the customer · severity high, score 60
In French: Retrait juste après un dépôt.
Cash deposited at one agent and withdrawn at another within two hours: a wallet used as a pass-through, typical of mule wallets and of moving cash across a border. Reuses the Ghana rule with a franc CFA threshold.
Reuses the logic of gh.cash_out_after_cash_in (from gh-psp) with the parameters below; only the values differ.
| Parameter | Meaning | Default |
|---|---|---|
min_amount |
Minimum cash-in (base currency) | 500,000 |
ratio |
Cash-out as share of cash-in | 0.8 |
Explanation shown to analysts: {{txn.base_currency}} {{features.cash_in_2h}} cashed in and {{txn.base_currency}} {{features.cash_out_2h}} cashed out within 2 hours.
uemoa.sim_swap_payout
Section titled “uemoa.sim_swap_payout”Payout soon after a SIM swap · library UE7 · SIM swap · real-time, answers block · about the customer · severity critical, score 85
In French: Paiement peu après un changement de carte SIM.
SIM-swap fraud: the fraudster takes over the customer’s number, receives the codes and empties the wallet. Reuses the Ghana rule with a franc CFA threshold.
Reuses the logic of gh.sim_swap_payout (from gh-psp) with the parameters below; only the values differ.
| Parameter | Meaning | Default |
|---|---|---|
sim_change_hours |
Hours since the SIM swap | 48 |
threshold |
Payout at or above (base currency) | 100,000 |
Explanation shown to analysts: SIM swapped {{customer.hours_since.sim_swap}} hours before this payout of {{txn.base_currency}} {{txn.amount}} (rule window: {{params.sim_change_hours}} hours).
uemoa.wallet_outside_union
Section titled “uemoa.wallet_outside_union”Mobile money transfer outside the UEMOA · library UE8 · Cross-border mobile money · alert about the customer · severity medium, score 40
In French: Transfert mobile money hors de l’UEMOA.
A wallet transfer to or from a country outside the eight UEMOA states at or above the amount: cross-border mobile money corridors outside the BCEAO’s area are a placement and cash-courier risk, and fall under the exchange regulations.
| Parameter | Meaning | Default |
|---|---|---|
member_countries |
UEMOA member countries (ISO codes) | ["BJ", "BF", "CI", "GW", "ML", "NE", "SN", "TG"] |
min_amount |
Amount at or above (base currency) | 500,000 |
Explanation shown to analysts: {{txn.base_currency}} {{txn.amount}} by mobile money to/from {{txn.counterparty_country}}, outside the UEMOA.
Expression
txn.channel == 'momo' && txn.amount >= params.min_amount && txn.counterparty_country != '' && !(txn.counterparty_country in params.member_countries)The uemoa-bank pack (8 rules)
Section titled “The uemoa-bank pack (8 rules)”UEMOA banks (in French: UEMOA : banques), version 1.0.0.
Typologies for banks and microfinance institutions in the eight UEMOA states, in francs CFA, from the uniform AML/CFT/PF law and BCEAO Décision n°021 of 2023: the CENTIF cash threshold, linked cash operations, special examination of large operations, very large cash payments, cash payment of debts, structuring below the cash threshold, transfers outside the Union and PEP activity. Several rules reuse core and Nigeria rules by reference. Values come from SpeculaPro’s research: confirm each with the BCEAO, the Commission Bancaire and your CENTIF before go-live.
Sources the pack cites:
- BCEAO Décision n°021 du 21 décembre 2023 fixant les montants seuils (loi uniforme LBC/FT/FP)
- BCEAO: textes LBC/FT (instructions 001, 002 et 003-03-2025)
- BCEAO Instructions 231/07/2024 and 233/07/2024 (cash declarations, cash payment of debts)
uemoab.linked_cash_daily
Section titled “uemoab.linked_cash_daily”Several cash operations in a day above XOF 9 million together · library UEB1 · Linked cash operations · alert about the customer · severity medium, score 50
In French: Plusieurs opérations en espèces dans la journée dépassant 9 millions FCFA au total.
Several cash operations by the same customer in one day that together exceed XOF 9,000,000, none of them alone: the customer must be identified (BCEAO Décision n°021, art. 3), and splitting cash this way is a structuring indicator.
| Parameter | Meaning | Default |
|---|---|---|
threshold |
Together above (base currency) | 9,000,000 |
min_ops |
Operations in the day, at least | 2 |
Explanation shown to analysts: {{= int(features.ops_a_24h + features.ops_b_24h) }} cash operations totalling {{txn.base_currency}} {{= features.sum_a_24h + features.sum_b_24h }} in 24 hours, above {{txn.base_currency}} {{params.threshold}} together.
Expression
txn.type in ['deposit', 'withdrawal'] && txn.channel in ['cash', 'branch', 'atm', 'agent'] && txn.amount <= params.threshold && features.sum_a_24h + features.sum_b_24h > params.threshold && features.ops_a_24h + features.ops_b_24h >= double(params.min_ops)uemoab.special_examination
Section titled “uemoab.special_examination”Large operation by a new or high-risk customer · library UEB2 · Special examination (unusual large operation) · alert about the customer · severity medium, score 45
In French: Opération importante d’un client récent ou à risque élevé.
Operations of XOF 10,000,000 or more that are unusually complex or have no apparent economic purpose need a special examination (BCEAO Décision n°021, art. 4). Software can’t judge purpose: this flags such amounts by high-risk customers, customers onboarded recently, or paid to a new counterparty, for the analyst to examine.
| Parameter | Meaning | Default |
|---|---|---|
threshold |
Amount at or above (base currency) | 10,000,000 |
new_customer_days |
Customer for at most (days) | 90 |
ratings |
High-risk ratings | ["high", "unacceptable"] |
Explanation shown to analysts: {{txn.base_currency}} {{txn.amount}} by a customer rated {{customer.risk_rating}}, onboarded {{customer.age_days}} days ago: at or above {{txn.base_currency}} {{params.threshold}}, to examine.
Expression
txn.amount >= params.threshold && (customer.risk_rating in params.ratings || customer.is_high_risk || (customer.age_days >= 0 && customer.age_days <= params.new_customer_days) || (txn.has_counterparty && counterparty.is_new_for_customer))uemoab.cash_50m
Section titled “uemoab.cash_50m”Cash operation of XOF 50 million or more · library UEB3 · Cash reporting threshold · alert about the customer · severity high, score 60
In French: Opération en espèces de 50 millions FCFA ou plus.
Cash or bearer payments of XOF 50,000,000 or more get a special examination even in normal conditions (BCEAO Décision n°021, art. 4). Reuses the core cash rule.
Reuses the logic of core.large_cash (from core) with the parameters below; only the values differ.
| Parameter | Meaning | Default |
|---|---|---|
threshold |
Cash threshold (base currency) | 50,000,000 |
Explanation shown to analysts: Cash transaction of {{txn.base_currency}} {{txn.amount}}: at or above {{txn.base_currency}} {{params.threshold}}, special examination required.
uemoab.cash_debt_payment
Section titled “uemoab.cash_debt_payment”Debt paid in cash above XOF 5 million · library UEB4 · Prohibited cash payment · alert about the customer · severity high, score 60
In French: Dette payée en espèces au-delà de 5 millions FCFA.
Paying a debt in cash above XOF 5,000,000, in one or several linked operations, is prohibited (BCEAO Instruction 233/07/2024; payments between private individuals acting outside a profession are exempt).
| Parameter | Meaning | Default |
|---|---|---|
threshold |
Above (base currency) | 5,000,000 |
types |
Transaction types that settle a debt | ["loan_repayment", "bill_payment", "payment"] |
Explanation shown to analysts: {{txn.type}} of {{txn.base_currency}} {{txn.amount}} paid in cash, above the {{txn.base_currency}} {{params.threshold}} limit for paying debts in cash.
Expression
txn.type in params.types && txn.channel in ['cash', 'branch', 'agent'] && txn.amount > params.thresholduemoab.deposit_structuring
Section titled “uemoab.deposit_structuring”Cash deposits just below the CENTIF threshold · library UEB5 · Structuring / smurfing · alert about the customer · severity high, score 70
In French: Dépôts en espèces juste sous le seuil CENTIF.
Cash deposits just below XOF 15,000,000, repeated within 48 hours and together above it: structuring to avoid the CENTIF cash report. Reuses the Nigerian deposit-structuring rule with the UEMOA threshold.
Reuses the logic of ngb.deposit_structuring (from ng-bank) with the parameters below; only the values differ.
| Parameter | Meaning | Default |
|---|---|---|
threshold |
Threshold being avoided (base currency) | 15,000,000 |
margin |
Just below = within (0.1 = 10%) | 0.1 |
min_count |
Deposits in 48 hours, at least | 3 |
Explanation shown to analysts: {{features.deposits_48h}} cash deposits totalling {{txn.base_currency}} {{features.deposit_sum_48h}} in 48 hours; this one ({{txn.base_currency}} {{txn.amount}}) is just below the {{txn.base_currency}} {{params.threshold}} threshold.
uemoab.transfer_outside_union
Section titled “uemoab.transfer_outside_union”Large transfer outside the UEMOA · library UEB6 · Cross-border value · alert about the customer · severity medium, score 35
In French: Transfert important hors de l’UEMOA.
A transfer to or from a country outside the eight UEMOA states at or above the amount: transfers outside the Union fall under the UEMOA exchange regulations and are a layering channel. The default amount is a starting point, not a regulatory value.
| Parameter | Meaning | Default |
|---|---|---|
member_countries |
UEMOA member countries (ISO codes) | ["BJ", "BF", "CI", "GW", "ML", "NE", "SN", "TG"] |
min_amount |
Amount at or above (base currency) | 10,000,000 |
Explanation shown to analysts: {{txn.base_currency}} {{txn.amount}} to/from {{txn.counterparty_country}}, outside the UEMOA.
Expression
txn.amount >= params.min_amount && txn.counterparty_country != '' && !(txn.counterparty_country in params.member_countries)uemoab.pep_large
Section titled “uemoab.pep_large”PEP transaction above XOF 10 million · library UEB7 · Politically exposed person · alert about the customer · severity high, score 70
In French: Opération d’une PPE au-delà de 10 millions FCFA.
A politically exposed person’s transaction at or above the threshold: the uniform law requires enhanced due diligence for PEPs, national and foreign. Reuses the core PEP rule.
Reuses the logic of core.pep_threshold (from core) with the parameters below; only the values differ.
| Parameter | Meaning | Default |
|---|---|---|
threshold |
Threshold (base currency) | 10,000,000 |
Explanation shown to analysts: Customer is a PEP; transaction of {{txn.base_currency}} {{txn.amount}} is at or above {{txn.base_currency}} {{params.threshold}}.
Also in this pack, described above:
| Key | Library | Name |
|---|---|---|
uemoa.cash_report |
UE1 | Cash transaction at or above the CENTIF reporting threshold |