Address Cleanse Feedback Loop Causing a Performance Problem or a Timeout

Summary

When two or more cleanse blocks run independently (not chained) against the same attributes on an entity, each block's output can look like a new, competing input to the other block. For an address with more than one valid cleansed form — for example, a record with both a street component and a PO Box component — this creates a feedback loop: the crosswalk hash keeps changing every time the record is re-cleansed, because each pass alternates which block "wins."

Every time the hash changes, the platform behaves correctly given what it sees: a changed crosswalk value looks like a new/different Location, so a duplicate entity is created and then automatically re-merged by crosswalk. If that Location is a shared reference entity with many linked entities, every oscillation cascades relationship-changed events to all of them — which is what produces intermittent downstream API timeouts.

How to recognize this pattern

Suspect a cleanse feedback loop when you see all of the following on a shared/high-fan-out entity:

  • Intermittent timeouts on inbound integration calls targeting POST /entities, with no obvious payload or load-size cause.
  • The entity's merge tree shows repeated "Merge by crosswalks" / "Automatic merge by crosswalks" events, often seconds apart, each citing a different crosswalk hash under the same source.
  • The entity's Activity Log shows the same attribute flipping back and forth between two values, with alternating source attribution between the two cleansers in question.
  • A large number of otherwise-unrelated entities all show simultaneous relationship-changed events in the same batch — because they all point at the same oscillating reference entity.
  • A prior, older merge in that entity's history (sometimes years earlier) shows the identical signature on a smaller scale — usually not a separate incident, but an earlier, lower-volume occurrence of the same structural issue.

Root cause

In Reltio, a cleanse block doesn't just return a formatted value — its output is also tagged with a crosswalk source, specified by resultingValuesSourceTypeUri in the L3 configuration (for example, a string-function cleanser tags its output as a FunctionCleanser source, while Loqate tags its output as a ReltioCleanser source). Reltio's chain-cleansing documentation describes this so that one cleanser's output can deliberately feed the next cleanser in a defined chain.

That mechanism is useful only when the blocks are actually chained. When they're configured as independent blocks, each one's output can still be picked up by the next block's input selection on the next cleansing pass, because nothing excludes a cleanser-generated value from being treated as ordinary input. For an address with two valid forms (street-only vs. street + PO Box), this means:

  1. Block A reads the raw/street form → produces crosswalk hash A.
  2. Block B independently reads the record (now including Block A's output) → produces a PO-Box-retaining form → crosswalk hash B.
  3. The next cleansing pass, Block A reads the record again (now shaped by Block B's output) → flips back toward hash A.
  4. Repeat indefinitely.

The existing Production configuration contains four independent cleanse blocks:

  • StringFunctionCleanser3

  • StringFunctionCleanser4

  • Loqate — default

  • Loqate — other

Each flip is a real crosswalk change, so Reltio correctly treats it as a signal to create/merge a duplicate — the platform isn't misbehaving; it's being fed contradictory input by its own cleanse configuration.

Think of the address for that one location (1959 NE Pacific St, Seattle) as having two valid “spellings” in the system — one that keeps just the street address, and one that keeps a PO Box detail too. Normally, a single address should always come out the same way after cleanup. But this tenant had four separate cleanup steps that aren’t wired together in order — so sometimes Step A’s output gets fed back into Step B, and Step B’s output gets fed back into Step A, like two editors each “correcting” the other’s draft forever instead of one editor finishing the job and handing it off. Every time that happens, the address flips between its two spellings.

 

Every time it flips, the system thinks it’s looking at two different addresses, creates a duplicate, then merges them back together — and that merge event ripples out and touches every doctor/provider record attached to that address.

The fix: two changes, both required

1. L3 — consolidate into a single AddressCleanseSequence. Replace the independent blocks with one sequence block so cleansing executes once, in a defined order. Reltio's chain-cleansing documentation covers proceedOnSuccess / proceedOnFailure, which control whether execution continues to the next step in the chain.

2. Tenant-level config — enableCrosswalkExclusionForChainCleanse = true. This excludes cleanser-generated crosswalk values from being re-selected as input within that declared chain. It does not disable cleansing or discard a valid cleansed address — it only stops a cleanser's own output from re-triggering the same processing loop.

Order of operations matters for verification, not for safety: enabling the flag without the sequence is inert (not harmful) — it simply does nothing, because there's no chain yet for it to act on. Promote both changes together; promoting only the flag will not resolve an existing feedback loop.

Tenant-level config

Recommended

{
  "optionalParameters": {
    "fullySerializeStartEndCrosswalks": true,
    "tenantSize": "X_LARGE",
    "dataloaderConfig": { "useUDL": true, "groupingEnabled": true },
    "sortCrosswalksInLUDNonAdvanced": true,
    "enableCrosswalkExclusionForChainCleanse": true  <<<<<<====== Change
  }
}

Tenant-level config (optionalParameters)

This is what tells the platform to exclude crosswalk values across a declared cleanse chain so a downstream step doesn’t re-trigger a change upstream.

{
  "optionalParameters": {
    "fullySerializeStartEndCrosswalks": true,
    "tenantSize": "X_LARGE",
    "dataloaderConfig": { "useUDL": true, "groupingEnabled": true },
    "sortCrosswalksInLUDNonAdvanced": true,
    "enableCrosswalkExclusionForChainCleanse": true
  }
}

 

L3 — configuration/entityTypes/Location/cleanseConfig/infos

The above flag only does anything once there’s a chain (the AddressCleanseSequence) for it to apply the exclusion to. So right now the tenant has the safety mechanism switched on but pointed at nothing.

What promoting the L3 change fixes: once the sequence exists in Prod, the flag starts actually blocking the feedback loop. The address stops flipping between its two cleansed forms, so 9K1Kgwz settles on one stable crosswalk hash. With one stable hash, there’s no duplicate Location entity created, so there’s no “automatic merge by crosswalks” event, so there’s no cascade of RELATIONSHIP_CHANGED events to the ~3,100+ HCPs hanging off that hub — which is the load that’s been driving the intermittent POST /entities timeouts. In short: promoting the L3 change is what actually closes the loop; the tenant flag was necessary but not sufficient on its own.

Locate the cleanse block (specifically "infos"): 

"cleanse":
   { "infos": [ ... ], 
     "mappings": [ ... ] } 

 

Do not modify "mappings" or any other Location attributes/survivorship rules. 

Replace the entire "infos" array with the three entries below: 

● AddressCleanseSequence ("useInCleansing": true): Groups all 4 steps in ordered sequence.

● default ("useInCleansing": false): Explicitly disables the inherited standalone Loqate block. 

● other ("useInCleansing": false): Explicitly disables the inherited standalone structured Loqate block. 

(Note: Explicitly setting "useInCleansing": false on default and other is required; simply deleting them will cause Reltio to inherit and run them automatically).

 

Below is the Location entity type’s complete cleanse configuration — the three infos entries, exactly as they’d sit under configuration/entityTypes/Location/cleanseConfig/infos.

[ 
{ 
"uri": 
"configuration/entityTypes/Location/cleanse/infos/AddressCleanseSequence", 
"useInCleansing": true, 
"sequence": [ 
{ 
"chain": [ 
{ 
"cleanseFunction": "StringFunctionCleanser", 
"resultingValuesSourceTypeUri": 
"configuration/sources/FunctionCleanser", 
"proceedOnSuccess": true, 
"proceedOnFailure": true, 
"mapping": { 
"inputMapping": [ 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/Country", 
"mandatory": true, 
"allValues": false, 
"cleanseAttribute": "InputText" 
} 
], 
"outputMapping": [ 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/Country", 
"mandatory": true, 
"allValues": false, 
"cleanseAttribute": "OutputText" 
} 
] 
} 
} 
] 
}, 
{ 
"chain": [ 
{ 
"cleanseFunction": "StringFunctionCleanser", 
"resultingValuesSourceTypeUri": 
"configuration/sources/FunctionCleanser", 
"proceedOnSuccess": true, 
"proceedOnFailure": true, 
"mapping": { 
"inputMapping": [ 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/AddressLine1", 
"mandatory": true, 
"allValues": false, 
"cleanseAttribute": "InputText" 
} 
], 
"outputMapping": [ 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/AddressLine1", 
"mandatory": true, 
"allValues": false, 
"cleanseAttribute": "OutputText" 
} 
] 
}, 
"params": { 
"scrub": "%$\"^!?<>#\n`|/*_,.~:;?(){}@&+=|" 
} 
} 
] 
}, 
{ 
"chain": [ 
{ 
"cleanseFunction": "Loqate", 
"resultingValuesSourceTypeUri": 
"configuration/sources/ReltioCleanser", 
"proceedOnSuccess": true, 
"proceedOnFailure": false, 
"mapping": { 
"inputMapping": [ 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/AddressInput", 
"mandatory": true, 
"allValues": false, 
"cleanseAttribute": "Address" 
} 
], 
"outputMappingRef": 
"configuration/entityTypes/Location/cleanse/mappings/address/outputMapping" 
}, 
"params": { 
"verificationStatusMapping": { 
"Partially Verified": [ 
"V(5).-...-..-(08.|07.|06.|05.|04.|03.|02.|01.|00.)", 
"P(5).-...-..-(08.|07.|06.|05.|04.|03.|02.|01.|00.)", 
"A(5).-...-..-(08.|07.|06.|05.|04.|03.|02.|01.|00.)", 
"V(4).-...-..-(090|091|092|093|094|08.|07.|06.|05.|04.|03.|02.|01.|00.)", 
"P(4).-...-..-(090|091|092|093|094|08.|07.|06.|05.|04.|03.|02.|01.|00.)", 
"A(4).-...-..-(090|091|092|093|094|08.|07.|06.|05.|04.|03.|02.|01.|00.)", 
"V3.-...-..-(09|08|07|06|05|04|03|02|01|00).", 
"P3.-...-..-(09|08|07|06|05|04|03|02|01|00).", 
"V(1|2).*", 
"P(1|2).*" 
], 
"Ambiguous": [ 
"A(1|2).*", 
"A(3).-...-..-(09|08|07|06|05|04|03|02|01|00)." 
], 
"Verified": [ 
"V(5).-...-..-(100|099|098|097|096|095|090|091|092|093|094)", 
"P(5).-...-..-(100|099|098|097|096|095|090|091|092|093|094)", 
"A(5).-...-..-(100|099|098|097|096|095|090|091|092|093|094)", 
"V(4).-...-..-(100|099|098|097|096|095)", 
"P(4).-...-..-(100|099|098|097|096|095)", 
"A(4).-...-..-(100|099|098|097|096|095)", 
"V3.-...-..-(100)", 
"P3.-...-..-(100)", 
"A3.-...-..-(100)" 
], 
"Unverified": [ 
"U.*" 
] 
} 
} 
} 
] 
}, 
{ 
"chain": [ 
{ 
"cleanseFunction": "Loqate", 
"resultingValuesSourceTypeUri": 
"configuration/sources/ReltioCleanser", 
"proceedOnSuccess": true, 
"proceedOnFailure": false, 
"mapping": { 
"inputMapping": [ 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/AddressLine1", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "Address1" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/AddressLine2", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "Address2" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/Country", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "Country" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/SuperAdministrativeArea", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "SuperAdministrativeArea" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/StateProvince", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "AdministrativeArea" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/SubAdministrativeArea", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "SubAdministrativeArea" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/City", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "Locality" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/Neighborhood", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "DependentLocality" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/DoubleDependentLocality", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "DoubleDependentLocality" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/Street", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "Thoroughfare" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/Premise", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "Premise" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/DependentThoroughfare", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "DependentThoroughfare" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/Building", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "Building" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/SubBuilding", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "SubBuilding" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/Zip/attributes/Zip5", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "PostalCode" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/POBox", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "PostBox" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/Organization", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "Organization" 
} 
], 
"outputMappingRef": 
"configuration/entityTypes/Location/cleanse/mappings/address/outputMapping" 
}, 
"params": { 
"verificationStatusMapping": { 
"Partially Verified": [ 
"V(5).-...-..-(08.|07.|06.|05.|04.|03.|02.|01.|00.)", 
"P(5).-...-..-(08.|07.|06.|05.|04.|03.|02.|01.|00.)", 
"A(5).-...-..-(08.|07.|06.|05.|04.|03.|02.|01.|00.)", 
"V(4).-...-..-(090|091|092|093|094|08.|07.|06.|05.|04.|03.|02.|01.|00.)", 
"P(4).-...-..-(090|091|092|093|094|08.|07.|06.|05.|04.|03.|02.|01.|00.)", 
"A(4).-...-..-(090|091|092|093|094|08.|07.|06.|05.|04.|03.|02.|01.|00.)", 
"V3.-...-..-(09|08|07|06|05|04|03|02|01|00).", 
"P3.-...-..-(09|08|07|06|05|04|03|02|01|00).", 
"V(1|2).*", 
"P(1|2).*" 
], 
"Ambiguous": [ 
"A(1|2).*", 
"A(3).-...-..-(09|08|07|06|05|04|03|02|01|00)." 
], 
"Verified": [ 
"V(5).-...-..-(100|099|098|097|096|095|090|091|092|093|094)", 
"P(5).-...-..-(100|099|098|097|096|095|090|091|092|093|094)", 
"A(5).-...-..-(100|099|098|097|096|095|090|091|092|093|094)", 
"V(4).-...-..-(100|099|098|097|096|095)", 
"P(4).-...-..-(100|099|098|097|096|095)", 
"A(4).-...-..-(100|099|098|097|096|095)", 
"V3.-...-..-(100)", 
"P3.-...-..-(100)", 
"A3.-...-..-(100)" 
], 
"Unverified": [ 
"U.*" 
] 
} 
} 
} 
] 
} 
] 
}, 
{ 
"uri": "configuration/entityTypes/Location/cleanse/infos/default", 
"useInCleansing": false, 
"sequence": [ 
{ 
"chain": [ 
{ 
"cleanseFunction": "Loqate", 
"resultingValuesSourceTypeUri": 
"configuration/sources/ReltioCleanser", 
"proceedOnSuccess": true, 
"proceedOnFailure": false, 
"mapping": { 
"inputMapping": [ 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/AddressInput", 
"mandatory": true, 
"allValues": false, 
"cleanseAttribute": "Address" 
} 
], 
"outputMappingRef": 
"configuration/entityTypes/Location/cleanse/mappings/address/outputMapping" 
}, 
"params": { 
"verificationStatusMapping": { 
"Partially Verified": [ 
"V(5).-...-..-(08.|07.|06.|05.|04.|03.|02.|01.|00.)", 
"P(5).-...-..-(08.|07.|06.|05.|04.|03.|02.|01.|00.)", 
"A(5).-...-..-(08.|07.|06.|05.|04.|03.|02.|01.|00.)", 
"V(4).-...-..-(090|091|092|093|094|08.|07.|06.|05.|04.|03.|02.|01.|00.)", 
"P(4).-...-..-(090|091|092|093|094|08.|07.|06.|05.|04.|03.|02.|01.|00.)", 
"A(4).-...-..-(090|091|092|093|094|08.|07.|06.|05.|04.|03.|02.|01.|00.)", 
"V3.-...-..-(09|08|07|06|05|04|03|02|01|00).", 
"P3.-...-..-(09|08|07|06|05|04|03|02|01|00).", 
"V(1|2).*", 
"P(1|2).*" 
], 
"Ambiguous": [ 
"A(1|2).*", 
"A(3).-...-..-(09|08|07|06|05|04|03|02|01|00)." 
], 
"Verified": [ 
"V(5).-...-..-(100|099|098|097|096|095|090|091|092|093|094)", 
"P(5).-...-..-(100|099|098|097|096|095|090|091|092|093|094)", 
"A(5).-...-..-(100|099|098|097|096|095|090|091|092|093|094)", 
"V(4).-...-..-(100|099|098|097|096|095)", 
"P(4).-...-..-(100|099|098|097|096|095)", 
"A(4).-...-..-(100|099|098|097|096|095)", 
"V3.-...-..-(100)", 
"P3.-...-..-(100)", 
"A3.-...-..-(100)" 
], 
"Unverified": [ 
"U.*" 
] 
} 
} 
} 
] 
} 
] 
}, 
{ 
"uri": "configuration/entityTypes/Location/cleanse/infos/other", 
"useInCleansing": false, 
"sequence": [ 
{ 
"chain": [ 
{ 
"cleanseFunction": "Loqate", 
"resultingValuesSourceTypeUri": 
"configuration/sources/ReltioCleanser", 
"proceedOnSuccess": true, 
"proceedOnFailure": false, 
"mapping": { 
"inputMapping": [ 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/AddressLine1", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "Address1" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/AddressLine2", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "Address2" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/Country", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "Country" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/SuperAdministrativeArea", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "SuperAdministrativeArea" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/StateProvince", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "AdministrativeArea" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/SubAdministrativeArea", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "SubAdministrativeArea" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/City", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "Locality" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/Neighborhood", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "DependentLocality" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/DoubleDependentLocality", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "DoubleDependentLocality" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/Street", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "Thoroughfare" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/Premise", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "Premise" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/DependentThoroughfare", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "DependentThoroughfare" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/Building", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "Building" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/SubBuilding", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "SubBuilding" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/Zip/attributes/Zip5", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "PostalCode" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/POBox", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "PostBox" 
}, 
{ 
"attribute": 
"configuration/entityTypes/Location/attributes/Organization", 
"mandatory": false, 
"allValues": false, 
"cleanseAttribute": "Organization" 
} 
], 
"outputMappingRef": 
"configuration/entityTypes/Location/cleanse/mappings/address/outputMapping" 
}, 
"params": { 
"verificationStatusMapping": { 
"Partially Verified": [ 
"V(5).-...-..-(08.|07.|06.|05.|04.|03.|02.|01.|00.)", 
"P(5).-...-..-(08.|07.|06.|05.|04.|03.|02.|01.|00.)", 
"A(5).-...-..-(08.|07.|06.|05.|04.|03.|02.|01.|00.)", 
"V(4).-...-..-(090|091|092|093|094|08.|07.|06.|05.|04.|03.|02.|01.|00.)", 
"P(4).-...-..-(090|091|092|093|094|08.|07.|06.|05.|04.|03.|02.|01.|00.)", 
"A(4).-...-..-(090|091|092|093|094|08.|07.|06.|05.|04.|03.|02.|01.|00.)", 
"V3.-...-..-(09|08|07|06|05|04|03|02|01|00).", 
"P3.-...-..-(09|08|07|06|05|04|03|02|01|00).", 
"V(1|2).*", 
"P(1|2).*" 
], 
"Ambiguous": [ 
"A(1|2).*", 
"A(3).-...-..-(09|08|07|06|05|04|03|02|01|00)." 
], 
"Verified": [ 
"V(5).-...-..-(100|099|098|097|096|095|090|091|092|093|094)", 
"P(5).-...-..-(100|099|098|097|096|095|090|091|092|093|094)", 
"A(5).-...-..-(100|099|098|097|096|095|090|091|092|093|094)", 
"V(4).-...-..-(100|099|098|097|096|095)", 
"P(4).-...-..-(100|099|098|097|096|095)", 
"A(4).-...-..-(100|099|098|097|096|095)", 
"V3.-...-..-(100)", 
"P3.-...-..-(100)", 
"A3.-...-..-(100)" 
], 
"Unverified": [ 
"U.*" 
] 
} 
} 
} 
] 
} 
] 
} 
]

Explanation of JSON

The first entry, AddressCleanseSequence, is the only one actually running ("useInCleansing": true). It defines four steps that execute in a fixed order against each Location record, every time the entity is cleansed:

Step 1 runs StringFunctionCleanser on Country alone. It’s a lightweight pass — no scrub params — that just normalizes the country value and tags its output with the FunctionCleanser crosswalk source. proceedOnSuccess/proceedOnFailure are both true, so the chain always moves on regardless of what happens here.

Step 2 runs StringFunctionCleanser again, this time on AddressLine1, and this is the one carrying the scrub parameter: %$"^!?<>#\n\|/*_,.~:;?(){}@&+=|. That's the literal character set it strips out of the address line — which is exactly the step that was stripping the #character from AbbVie's address in the activity log evidence we looked at earlier. Same deal: output taggedFunctionCleanser`, always proceeds regardless of success/failure.

Step 3 runs Loqate against the single composite AddressInput field. This is literally the old standalone “default” Loqate block, just moved into the chain as this step. Its output is tagged ReltioCleanser. Here proceedOnFailure is false — if Loqate can’t process/verify the address at this stage, the chain stops rather than continuing to step 4. The verificationStatusMapping block under params isn’t about the address text itself; it’s translating Loqate’s internal confidence codes (things like V(5).-...-..-100) into the human-readable buckets Verified, Partially Verified, Ambiguous, Unverified that populate VerificationStatus on the record.

Step 4 runs Loqate a second time, but against the individual broken-out fields (Address1, Address2, Street, Premise, POBox, City, StateProvince, Zip5, and so on). This is the old standalone “other” block, now folded in as the chain’s last step, with the same crosswalk source and the same verification-status mapping.

Documenation

 

 

 

 

 

 

 

 

 

 

 

 

 

Was this article helpful?
0 out of 0 found this helpful

Comments

0 comments

Please sign in to leave a comment.