A rejected message was refused by the gateway before sending (invalid number, unsupported destination, blocked content) and costs nothing; a failed message was accepted by a carrier that then could not deliver it, and is billed.
The distinction is about where the message stopped. Rejection happens at the gateway, synchronously, with an error code you can act on immediately: fix the number, remove the prefix, change the text. Failure happens later, at the carrier, with a carrier code: unknown subscriber, barred, filtered, network error.
Billing follows the attempt: rejected messages were never attempted and are free; failed ones were, and every operator charges for the attempt.
At SMSMeteor: rejected rows are listed in the import report or returned individually in batch responses; failed messages carry carrier_code and a plain-English failure_reason.
