The website contact form creates a Lead in the CRM, and until now it decided whether a submission was a duplicate by comparing the email address as a plain string. That was wrong in two opposite directions at the same time, and both were live. A returning prospect asking about something new was filed as a repeat and never became a Lead, so genuinely new interest went into the record as a note instead of the pipeline. Meanwhile one person writing in from x@, x+something@ and a capitalised spelling of the same address became three separate Leads, because nothing tidied the address before comparing it. The fix addresses both, and it is now live.
- Addresses are normalised before they are compared. The address is trimmed and lowercased, and a plus tag is stripped, so a person who uses tagged addresses is recognised as one person. Google accounts additionally ignore dots, so dots are removed for those and only those. That restriction matters more than it looks: for most providers a.b@ and ab@ are two different mailboxes, so applying the rule everywhere would have fixed duplicate records by silently merging two real people, which is a worse failure than the one being fixed.
- A repeat only counts as a repeat if nothing new is being asked. The form asks what the enquiry is about, and those answers are now part of the decision. Ask about something never asked before and it creates a Lead, even from a familiar address. Ask about the same things again and it stays a note on the existing Lead, exactly as before. Asking nothing in particular is treated as its own kind of request rather than as a match for everything.
- The comparison is bounded to six months. Someone returning after half a year is a new opportunity, not a duplicate of an old one.
- Verified by submitting the real form, not by reading the change. Eleven submissions were put through the live form covering both outcomes, each confirmed by which record it actually produced. One of them exists purely as a control: it proves the six month filter really is excluding old records rather than quietly matching nothing, which would have looked identical from the outside and made every other test pass for the wrong reason. All test records were then deleted and their absence confirmed by re-reading the database.