Skip to main content

Match profile reference

Every option a match profile can use.

Profile settings

SettingMeaning
Entity typeThe type this profile matches. One profile is active per entity type at a time.
Auto-link thresholdComposite weight at or above which a pair merges unattended. Log2 evidence units. Default 10.0, range 0–100.
Clerical review thresholdComposite weight at or above which a pair is queued for review. Must be at or below the auto-link threshold — enforced when you save. Default 5.0, range 0–100.
Prior match probabilityThe assumed share of candidate pairs that are true matches. Affects only the reported confidence figure — thresholds compare against the composite weight. Default 0.00001.
Minimum agreeing attributesDistinct attributes that must agree before auto-linking, unless a deterministic level settled it. Threshold-independent. Default 1, range 1–20.
ActiveExactly one profile per entity type may be active. Activating one deactivates its siblings atomically.

Comparators

Used by comparison levels to grade how well two values agree.

ComparatorComparesNotes
exactEquality of canonical valuesThe only comparator a deterministic level may use
jaro_winklerString similarity, favouring shared prefixesWell suited to personal names
levenshteinEdit distanceTypos and transcription errors
prefixA leading substringTruncated or abbreviated values
last_nThe final n charactersIdentifiers where only a suffix is retained
phoneticHow values soundTakes a codec — see below
equivalence_setMembership of a known-equivalent groupNicknames and abbreviations, via a named dictionary
token_alignedValues as sets of tokens, order-independentReordered multi-part names
date_equalTwo dates for equality
date_withinTwo dates within a toleranceTakes an amount and a unit
numeric_equalTwo numbers for equality
numeric_withinTwo numbers within a toleranceTakes a delta and a unit
lookup_equalTwo reference-data codesCompares canonical codes, not labels
address_componentOne named part of a composite addressComposite-aware
address_expandWhole addresses, after expansionComposite-aware
null_handlingHow a missing value is treated
multi_valued_bestWraps another comparator across multi-value attributesRarely needed — multi-value attributes are enumerated automatically
Scalar comparators and composite attributes

A scalar comparator applied to a whole composite attribute — an address, a licence — is rejected when the profile is saved. Two entirely different composites would otherwise compare as equal, which over-merges catastrophically. Target a named sub-field instead, or use a composite-aware comparator.

Blocking primitives

Used by blocking strategies to derive candidate-gathering keys.

PrimitiveEmits
exactThe canonical value as a key
prefixA leading substring of the value
phoneticA phonetic encoding — takes a codec
year_ofThe year part of a date
concatOne key combining several child primitives
any_ofThe union of several child primitives' keys
trigram_ginA similarity-based fallback rather than an equality key

Multi-value attributes fan out: one key per value. A composite combines across its children, and is suppressed entirely if every contributing value is suppressed as anonymous.

Blocking strategy fields

A strategy wraps a tree of the primitives above. It accepts four fields, and none of them is fixed after creation.

FieldAcceptsDefaultWhat it does
strategyName1–40 charsNames the strategy, so a profile with several can be reasoned about.
primitiveTreeA tree of primitivesWhich keys this strategy derives. A malformed tree is refused when you save rather than silently gathering nothing.
anonSuppresstrue or falsefalseWhether values too common to be evidence are dropped from this strategy's keys. See below.
sortOrderInteger, 0 or greater0Presentation order among the profile's strategies.

A profile normally carries several strategies. Each derives its own keys, and a record is a candidate if any of them matches — so strategies add recall rather than narrowing each other.

Turn anonSuppress on for strategies keyed on a common value

It defaults to off, which means a strategy blocking on a surname alone will gather every Smith in the tenant as a candidate for every other Smith. That is not wrong — they genuinely share the key — but it is expensive and produces nothing the scoring can use.

With suppression on, values that appear too often to distinguish anyone stop producing keys for that strategy. Leave it off for strategies keyed on something already selective, such as a national identifier or a postcode combined with a surname.

Phonetic codecs

CodecNotes
soundexClassic, aggressive; high recall, low precision
dmetaphoneDouble metaphone; handles non-English name origins substantially better

These two are the complete set. A codec name outside this list emits no keys at all — silently producing a blocking strategy that never gathers anything.

Survivorship strategies

Choose the winning value per attribute after a merge.

StrategyWinnerWinners per group
source_priorityThe value from the highest-ranked source system1
most_recentThe most recently updated value. Engine default when no rule is set.1
oldest_valueThe value from the earliest contributing record1
maxThe numeric or ordered maximum1
minThe numeric or ordered minimum1
frequencyThe most common value across contributors1
aggregationEvery distinct value, deduplicatedMany

Rules apply per (attribute, value type) group, so a multi-value attribute with usage types resolves each type independently — one winning home address and one winning work address, not one address overall.

aggregation is the right choice for genuinely multi-value attributes such as email and phone, where collapsing to a single winner loses real data.

Comparison ladders. Each rung carries its comparator, its two probabilities, and the weight the platform derives from them.

Comparison levels

A comparison level — a rung of a ladder — is what grades one attribute. These are the fields each rung accepts.

FieldAcceptsDefaultChangeableWhat it does
attributeName1–100 chars. A plain attribute name, or a dotted path into a compositeNoWhich attribute this rung grades. address.postalCode targets a sub-field; a sub-field that the composite does not declare is refused when you save. A rung cannot be moved to a different attribute — create a new one.
levelName1–40 charsYesThe rung's label, as in exact, phonetic, mismatch.
levelOrderInteger, 0 or greaterYesPosition in the ladder. The engine walks in ascending order and takes the first rung that fits, so ordering is behaviour, not presentation.
comparatorUp to 40 chars, or emptyYesHow the two values are graded. Leaving it empty marks the catch-all rung that records a disagreement.
comparatorConfigAn object{}YesThat comparator's own settings. The shape differs per comparator — see Comparators.
mProbability0 to 1YesHow reliably this rung fires when two records really are the same.
uProbability0 to 1YesHow often it fires by pure coincidence.
isDeterministictrue or falsefalseYesSettles the pair on its own, regardless of the total. Legal only with the exact comparator.

The weight is not yours to set

There is no weight field, and its absence is deliberate. The platform computes it from the two probabilities when you save the rung:

matchWeight = log2(mProbability / uProbability)

If the interface accepted a weight, the number on screen could disagree with the number the engine scores with. Instead you state what you believe about the evidence — how reliable the agreement is, and how often it happens by chance — and the weight follows.

Three further values are returned but never set: the resolved sub-field, the resolved attribute, and the weight itself.

Rules the platform enforces

  • Levels are ordered; the engine takes the first that fits.
  • Every ladder must end in a catch-all level, which is what records a disagreement. Without it a mismatch contributes nothing rather than counting against the pair.
  • A level may be marked deterministic only when its comparator is exact.
  • A ladder may target a composite sub-field using dotted notation. A sub-field that does not exist is rejected when the profile is saved, rather than silently scoring nothing.
  • An edit must change at least one field; an empty change is refused rather than accepted as a no-op.

Next


Last verified against commit 315eb047 (2026-08-03)