Skip to content

Risk Scoring

Every signal behind the score, what it is worth, and why it lands where it does.

The score is a sum. Shield runs a fixed set of checks against a payment, each one that matches adds its own number of points, and the total is capped at 100. There is no model, no training data and no drift: the same payment scores the same today and next year.

Which means a score is explainable. Every payment records the exact list of signals that fired, and this page is what each one of them costs.

The bands, and what they are not

ScoreBand
0 to 20Low
21 to 50Medium
51 to 80High
81 to 100Critical

These are labels for reading a list at a glance. The decision comes from your thresholds, not from the band, so a payment at 62 is high whether your block threshold is 70 or 60, and only one of those refuses it.

Where the payer is coming from

SignalFires whenPoints
Proxy or VPNThe IP is a known proxy or VPN exit40
IP and timezone disagreeThe browser timezone maps to a different country than the IP35
IP and phone disagreeThe payer's phone country is not the IP country30
Datacenter IPThe IP belongs to a hosting provider20
Three or more countriesIP, phone, currency, browser language and timezone point at three or more countries15
IP and language disagreeThe browser language region is not the IP country10
Unknown operatorA mobile money prefix that matches no operator for the resolved country5

These are the signals that need browser data, which is why a payment made through your own server-to-server integration triggers fewer of them than one through a hosted page.

Whether the request came from a browser at all

SignalFires whenPoints
Headless screenThe reported screen resolution starts at 0x020
Bot user agentThe user agent matches HeadlessChrome, PhantomJS, SlimerJS, Selenium or WebDriver5
No device signalsNo browser data was sent with the charge3

Three points, deliberately

A charge with no browser data is also exactly what a legitimate server-to-server integration looks like. It nudges the score and never carries it. Ordinary HTTP clients like curl, Postman, axios or requests are not in the bot list for the same reason.

How fast the same identifier is moving

Every attempt is counted in a ten minute sliding window, per identifier. Only the higher of the two levels fires on each dimension.

DimensionElevated atPointsCritical atPoints
IP address5 attempts2510 attempts50
Card BIN3 attempts255 attempts45
Device fingerprint5 attempts208 attempts45
Email3 attempts205 attempts40
Phone3 attempts205 attempts40

Two more patterns come out of the same window. Card amount probing is worth 45 and fires when one card BIN is tried at three or more different amounts, which is what a carding script looks like from the outside. Multi merchant is worth 25 and fires when one IP has hit three or more different Wajub merchants.

These counters are not scoped to you

A phone number, an email, an IP or a card BIN carries one counter across the whole platform. A script working through a list of cards against five different merchants exhausts its budget everywhere at once, and the sixth merchant it tries sees a payment that is already critical before anything else is looked at.

What the platform remembers about this payer

Reputation is a score from -100 to 100, held per email, per phone and per device, and shared across every merchant on the platform. It moves on real outcomes.

EventReputation
A dispute lost-30
A dispute won+10
A payment that went through+2, capped at +20

Keys expire after 90 days without activity, which is the decay: nobody is on a permanent list because of one bad month. Below -5 an identifier is suspect, below -20 it is bad, and the flag is worth points accordingly.

SignalPoints
Device with bad reputation35
Phone with bad reputation30
Email with bad reputation25
Device or phone suspect15
Email suspect10

Alongside them sits SIM swap, worth 40. Shield keeps the devices each phone number has been seen on over the last 30 days, and flags a payment when the number arrives on a device that is not among them. It is the most useful signal there is on mobile money, and it only exists when a fingerprint was sent.

What the identifiers themselves look like

SignalFires whenPoints
Disposable emailThe domain is a known throwaway provider30
Email seen 10 times in 24 hoursCounted across the platform30
Suspicious top level domainThe domain ends in one of the cheap bulk registered TLDs15
Email first seen under an hour agoThe platform met this address this hour15
Name does not match the emailThe customer's name shares nothing with the local part, and the local part looks random15
Email seen 5 times in 24 hoursCounted across the platform15
Email never seen beforeThe platform has no record of this address10
Phone never seen beforeThe platform has no record of this number10

The two first-seen signals are why an ordinary new customer does not start at zero. Both are platform wide, so a customer new to you but not to Wajub triggers neither.

What the card is

SignalFires whenPoints
Three declines in 24 hoursOn the same phone, card or BIN35
Issuer country is not the IP countryThe card was issued elsewhere than the payer is sitting35
Issuer country is not the phone countryThe card was issued elsewhere than the phone belongs20
Prepaid or virtual cardNo issuer KYC behind it15
Elevated risk brandAmex, Diners, JCB or Discover15
Issuing bank looks prepaidThe issuer name contains prepaid, virtual, gift or reloadable15

Only the first eight digits of a card number ever reach the risk engine, and nothing longer is stored.

What you and your history say

SignalFires whenPoints
Customer tagged high riskYou marked them30
Three or more disputesOpen, under review or lost, on this customer25
Amount is 10 times your averageOver your last 30 days, from 5 payments up35
Amount is 5 times your averageSame basis20
Customer tagged medium riskYou marked them15
One or two disputesOn this customer10

The tagging is the one place your own system feeds the score directly. Set risk_flag to high or medium in the payment's metadata, and Shield reads it on that payment. The same key on the customer's own metadata applies to every payment they make, and there only high is honoured.

The two scores that are not computed

Two things bypass the arithmetic entirely and force the score to 100, which refuses the payment on any threshold that can be set.

A blocklist match, on your own list, while the list is switched on.

A sanctions match, against the platform watchlist, on every plan and whether or not you have configured Shield. Sanctions screening is not a feature you buy.

What the Rules page shows you

The Shield, Rules page lists the signals with a name, a description and a severity label. That list is a description of what protects you, not a set of switches: you cannot turn a signal off, change what it is worth, or add one. Weights are platform wide and tuned by Wajub.

The severity words on that page, and in the flag detail on a payment, are labels for reading. The score is built from the points on this page and nothing else.

What did you think of this content?