Payment links need an order identifier
A customer paid to extend a rental. The payment could not be matched to any rental, so the system kept counting them as overdue.
What happened
A reusable payment link for a fixed price add on. The automation matched the payment back to the customer record by email address, which works right up until someone pays with a different one.
They did. The payment succeeded, the record was never updated, and the customer stayed on course to be chased for a late return and charged a penalty, having already paid.
Why email matching fails
It looks reliable and is not. People pay from a personal address when the order used a work one. They use whatever their payment wallet has stored. A partner pays on their behalf. The billing address on the card belongs to somewhere they lived three years ago.
None of that is unusual behaviour. Any matching strategy that assumes one person has one address will fail regularly.
The fix
Collect something at checkout that identifies the record. Most hosted checkout products support custom fields. Make one required, and choose something the customer definitely knows and can type correctly:
- An order or booking reference, if you gave them one they still have
- A delivery postcode, which is short, memorable and usually unique enough
Then match on that field first and fall back to email, rather than the other way round.
Fail loudly when matching fails
Ours did the right thing and reported that no record matched. But it did so at normal priority in a routine notification, so it read like ordinary noise and was scrolled past.
Money that arrives and cannot be attributed is an exception, not information. Raise it at high priority, and include everything a human needs to resolve it without opening a dashboard: the name on the payment, the amount, the billing details and the time.
The general rule
Any inbound event that must be joined to an existing record needs the join key carried on the event itself. Reconstructing it from incidental attributes works in testing, because in testing the same person uses the same details every time.
Need help with any of this?
These notes are free and always will be. If you would rather someone just set it up, or you are stuck on something similar, get in touch at hello@opsira.io.