Answer 2xx on receipt and process asynchronously. We give up on a delivery after ten seconds: synchronous processing slower than that counts as a failure and triggers a retry, hence a duplicate on your side even though your first run may have completed.
Not every error is replayed, and that is deliberate. We retry on 408, 429, 500, 502, 503 and 504. Other 4xx responses are not retried: a 400 says the payload does not suit you, a 404 that the address is wrong, and neither becomes right on the fifth attempt. Fix the flow, then resend from the log.
To drop duplicates, use a field of the payload you control, the lead identifier for instance: your template decides what is sent. No idempotency header is added on our side.