Custom SMS Configuration
RainMaker sends a one-time password (OTP) over SMS for three user events: sign-up, forgot password, and account deletion. These messages are delivered through AWS End User Messaging (Amazon SNS SMS) from your deployment's own AWS account.
By default the deployment sends a generic OTP message using AWS's default settings. The custom_sms deployment setting lets you customise the message text per country and attach the identifiers (Sender ID, India DLT details) that many countries require.
SMS delivery is governed primarily by AWS and the destination country's mobile carriers, not by RainMaker. The custom_sms setting only controls the message content and the identifiers RainMaker passes to AWS. The origination identity (Sender ID / toll-free number / short code) and the country-level permissions must be set up separately in the AWS End User Messaging console. Without that, AWS will reject or silently drop the SMS even when custom_sms is configured correctly.
How OTP SMS Works
- A user triggers sign-up, forgot-password, or account deletion.
- RainMaker asks AWS to send the OTP to the user's phone number.
- RainMaker reads the user's country from the phone number (e.g.
+91…→IN,+1…→US,+852…→HK,+86…→CN). - If that country code is present in your
custom_smsconfiguration, RainMaker applies the configured message text and identifiers; otherwise it falls back to a generic default message. - AWS attempts delivery using the origination identity available for that country and the destination country's carrier rules.
If AWS rejects or the carrier drops the message, the user simply receives nothing — the sign-up / forgot-password flow still appears to succeed, and no error is shown in the app. The only place the failure is visible is CloudWatch logs (see Troubleshooting). Always confirm delivery from the logs, not just from the API response.
Why SMS Fails Without Proper Configuration
| Symptom (in CloudWatch) | Cause | Fix |
|---|---|---|
ParameterValueInvalid … senderID … is not valid | The sender_id value is not a valid Sender ID. It must be 1–11 characters, only letters/digits/hyphen, and must start and end with a letter or digit (no spaces, no underscore). A phone/toll-free number (e.g. +18667246978) here is also invalid. | Use a valid Sender ID, or leave sender_id empty for countries that don't support Sender IDs. Never put a phone number in sender_id. |
InvalidParameter: AWS.MM.SMS.EntityId is missing | A template id (event.*.id) is non-empty while entity_id is empty, so RainMaker sends a TemplateId with no matching EntityId. These are India DLT-only fields. This is the most common misconfiguration — teams blank sender_id/entity_id but forget the template ids. | For every non-India country, set entity_id and all three event.*.ids to "". A leftover placeholder like signup_sms_template_id is the usual culprit. |
No origination identity available to send to destination number | There is no active origination identity (Sender ID / toll-free / 10DLC / short code) for that country. | Provision and activate an origination identity for the country in AWS End User Messaging. |
The provided number does not exist or does not belong to the account | The destination number could not be resolved/routed — usually not a real, SMS-reachable mobile (a fake/test number, a landline, or VoIP). | Test with a real mobile you control; verify it's a valid SMS-capable handset (not the config's fault). |
Destination country blocked by SMS protect configuration | The destination country is blocked by your AWS Protect configuration (or it is not on an allow-list). | Set the country to Allow in the Protect configuration's country rules. |
Unknown error attempting to reach phone | The carrier accepted but dropped the message — typically missing country registration (e.g. India DLT, China template registration) or filtered content. | Complete the country's registration and send only approved template content. |
| Nothing sent / message never reaches AWS | Account is in the SMS sandbox (only verified numbers receive SMS) or the monthly SMS spend limit is exhausted. | Move the account to production and/or raise the spend limit. |