A webhook can arrive more than once. Use the source system’s stable record or event ID as the matching key, and decide whether a repeat should be ignored or update the existing record.
Write the record and its processing state together where possible. Retry temporary failures with a limit and a visible error queue. Avoid matching people only by name.
Test the same payload twice, then simulate a timeout after the CRM has accepted it. The second attempt should not create a second customer or deal.




