Dynamic Two-Way SMS Routing for Twilio, Telnyx & More
by Corvus Nexus Technologies LTD https://corvusnexus.co.uk$ 369.12
In-App PurchasesTurn provider callbacks into secure, traceable Odoo conversations
Map provider payloads, validate webhooks, register multiple receiving numbers, route replies to CRM or contacts, preserve unmatched conversations, and diagnose every callback from one inbound foundation.
What changes after installation
Every callback becomes accountable
Configurable routing policy
Choose CRM, partner, or fallback Inbox targets and define lead selection and fallback behavior.
Payload parser mapping
Map sender, receiver, body, provider ID, status, media, discriminator, and test payloads.
Multiple gateway numbers
Assign labels, colors, access, defaults, routing context, and per-number behavior.
Webhook security
Use tokenized callback URLs, optional signatures, provider headers, and duplicate detection.
Fallback SMS Inbox
Retain unmatched senders as useful threads instead of discarding a valid reply.
Operational diagnostics
Search populated logs, inspect normalized values, routing results, duplicates, and processing errors.
Odoo 19 · Two-way SMS infrastructure
Corvus SMS Inbound
Turn provider callbacks into organized Odoo conversations
Receive replies through tokenized webhooks, match the destination number, route each message to the right business context, and keep unmatched traffic visible in SMS Inbox.
What breaks without an inbound layer?
Outbound messages may leave Odoo correctly, but customer replies arrive in provider-specific formats. Multiple receiving numbers complicate ownership, delivery callbacks can be confused with messages, and an unmatched reply can disappear into a technical log.
One routing policy
Choose last outbound document, CRM lead, contact or SMS Inbox, with explicit fallbacks.
One operational trail
Retain payloads, parsed values, duplicate evidence, status and processing notes.
A complete two-way SMS foundation
Tokenized webhooks
Each gateway receives a unique inbound URL and token, with controlled regeneration.
Payload mapping
Map sender, destination, body, media, provider ID and event ID from nested payloads.
Webhook hardening
Optional HMAC signatures, timestamp age checks and duplicate suppression.
Number registry
Manage labels, colors, defaults, user access, country preference and limits per number.
SMS Inbox fallback
Keep a conversation thread even when no lead or contact can be selected confidently.
Status callbacks
Reuse the inbound endpoint for delivery events and update SMS/tracker state.
1. Define where replies belong
Settings expose primary target, fallback target, CRM lead strategy, missing-record actions, inbox policy and the global fallback sender number. Administrators can make routing predictable instead of embedding one client-specific assumption.
- Continue the last outbound conversation.
- Choose the latest or designated SMS lead.
- Post to contact chatter.
- Use SMS Inbox or discard explicitly.
2. Map the provider webhook
Enable inbound support, copy the generated callback URL, and map the provider's sender, recipient, text, media and message identifiers. A shared endpoint can classify inbound messages and delivery-status events through configured discriminator values.
Webhook token: identifies the gateway without exposing an Odoo login. Rotate it if the URL is disclosed.
3. Register every business number
The number registry connects inbound destination matching with outbound sender continuity. Give each number a useful label and color, control eligible users, set defaults and country preferences, and optionally enforce hourly or daily limits.
Companion chatter and floating interfaces reuse this identity so operators know which number owns each conversation.
4. Diagnose the full callback trail
Inbound logs keep the gateway, raw numbers, payload and headers, provider IDs, duplicate relation, processing state and routing note. The parser wizard lets administrators test a sample payload before enabling live callbacks.
5. Never lose an unmatched reply
SMS Inbox stores one conversation per normalized phone identity, tracks unread and total messages, links a contact when available, and preserves activity that cannot safely be assigned to another record.
Parser, security and routing evidence
Classify and protect callbacks
Separate inbound/status values, suppress replays within the configured window and match provider HMAC rules.
Prove field extraction before live traffic
Verify sender, receiving number, body and provider identifiers from a controlled payload.
Understand duplicate suppression
Compare a replay with the original event rather than processing the same customer message twice.
Keep the reply on the business record
When policy resolves a CRM destination, the inbound message appears in the customer's working context with direction and number metadata.
How the inbound engine works
1. Identify
Token selects the gateway and destination selects its number.
2. Validate
Signature and duplicate rules protect the event.
3. Route
Contact, last outbound, lead and fallback policies select the target.
4. Notify
Chatter, inbox, notifications, logs and bus events are updated.
Gateway compatibility and provider responsibility
Important: Inbound SMS is not supported through Odoo IAP. Inbound messages require a third-party provider that explicitly supports inbound webhooks and inbound callbacks, plus an active inbound-capable package, sender/receiver setup, and sufficient provider balance.
There is absolutely no warranty that a custom gateway will work out of the box. APIs differ in authentication, payload paths, signatures, delivery statuses, media formats and regional rules; minor adjustments may be required.
Telnyx and LoopMessage have been tested for inbound and outbound SMS/MMS workflows. Corvus Nexus Technologies LTD is not an official partner, reseller or representative of any SMS/MMS provider and does not sell carrier service, phone numbers or delivery guarantees.
After purchase, you may ask us to configure one specific gateway without an additional service charge. Provider fees, custom provider development, telecom compliance and third-party guarantees are excluded.
Dedicated inbound SMS demo
This video is for Corvus SMS Inbound only. It explains how inbound SMS is configured, how webhooks are secured, how payload mapping and routing are set, and how inbound conversations are handled in Odoo.
Use this after reading the module guide for a complete end-to-end setup and verification flow.
Watch on YouTubeProfessional Services
Implementation
Installation, routing and team rollout.
Gateway setup
Webhook mapping and provider integration.
Customization
Odoo development, migration and DevOps.
Training & support
Operator training, diagnostics and optimization.
Support and Contact
Corvus Nexus Technologies LTD
corvusnexus.co.uk
support@corvusnexus.co.uk
+44 740 4228172
Corvus module ladder
Build the complete Corvus SMS experience
Corvus SMS Inbound provides one focused layer. Choose the complete Corvus SMS Suite when the deployment also needs configurable gateways, inbound routing, MMS, workspace tools, structured chatter, floating conversations, real-time notifications, translation, enrichment, and campaigns.
Corvus MMS Base
Add provider-independent MMS requests, secure expiring attachment URLs, composer media, and inbound attachment context to the Corvus two-way messaging stack.
View on Odoo AppsCorvus SMS Workspace
Choose the correct business number, understand SMS length, attach MMS media or voice, work Inbox threads, clean active chatter without erasing evidence, and keep open records synchronized.
View on Odoo AppsCorvus SMS Suite
Combine gateway transport, inbound routing, MMS, operator workspaces, structured chatter, floating messaging, real-time notifications, AI tools, and optional translation, enrichment, and campaign workflows.
View on Odoo AppsShared suite demonstration
See the complete SMS/MMS workflow
This video demonstrates the broader Corvus suite, not only Corvus SMS Inbound. It helps buyers understand how gateway setup, inbound routing, operator surfaces, messaging enhancements, and follow-up work fit together.
Open on YouTubeOfficial inbound SMS module walkthrough: setup, webhook and parser configuration, routing policy, and inbound conversation flow.
Version and compatibility
Release history
| Version | Compatibility | Status |
|---|---|---|
| 19.0.1.0.1 | Odoo 19.0 | Current documented release |
| Documentation revision | 2026-07-24 | Hero, feature coverage, suite links, video, and FAQ refreshed |
Only verified release information is listed. Technical version semantics remain controlled by the module manifest.
Important questions
Frequently asked questions
What is a webhook?
It is the HTTPS callback that a provider calls when an inbound message or status event occurs. The module parses and routes that request into Odoo.
Why does each gateway have a token?
The random token makes the callback URL difficult to guess and lets Odoo resolve the intended gateway without exposing provider credentials.
Can one gateway manage several receiving numbers?
Yes. Each number can carry its own label, color, access and routing context while sharing the gateway.
What happens when no CRM or partner match exists?
The configured fallback policy applies; a dedicated SMS Inbox thread can retain the conversation for later routing.
Will every custom provider work immediately?
No. Payloads, signatures and delivery rules differ, so parser mapping or a small provider-specific adjustment may be required.
Implementation, integration, and support
Gateway and webhook configuration · Odoo SMS/MMS implementation · custom provider integration · migration · DevOps · training · troubleshooting · maintenance
corvusnexus.co.uk  support@corvusnexus.co.uk
+44 740 4228172
Corvus Nexus Technologies LTD is not an official partner, reseller, or representative of any SMS/MMS provider. Provider accounts, network service, credentials, fees, sender registration, consent, and legal compliance remain the customer's responsibility. Custom gateways may require adjustment.
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
CRM (crm)
• Discuss (mail) • Calendar (calendar) • Contacts (contacts) |
| Community Apps Dependencies | Show |
| Lines of code | 7117 |
| Technical Name |
corvus_sms_inbound |
| License | See License tab |
| Website | https://corvusnexus.co.uk |
Corvus SMS Inbound
Two-way SMS routing, multiple gateway numbers, webhook security, parser testing, inbox fallback and delivery-status handling for Odoo 19.
Module summary
corvus_sms_inbound turns the dynamic outbound gateway supplied by eis_sms_apis into a two-way messaging system. Each gateway receives a tokenized inbound URL. Provider payload fields are mapped in the gateway form, the receiving number is matched to a gateway-number record, and a routing policy decides whether the reply belongs on the last outbound document, a CRM lead, a contact, or an SMS Inbox thread.
The module also keeps a permanent inbound log, detects duplicate callbacks, supports optional HMAC signature verification, processes delivery-status events, and preserves the sender-number identity used for outbound replies.
Dependencies and prerequisites
Install these Odoo applications before this module:
- eis_sms_apis — the published Corvus dynamic outbound gateway foundation.
- mail — chatter, notifications and bus services.
- crm — lead routing and SMS-thread ownership.
- web — backend views and client services.
You also need an account with an SMS provider, a provider-owned sending/receiving number, and an HTTPS Odoo address reachable by that provider. Provider charges, number rental, registration and telecom compliance are external to this module.
Installing the dependencies
- Copy each addon into an Odoo addons path.
- Restart Odoo only when your normal deployment process requires it.
- Open Apps, update the Apps list, and install eis_sms_apis.
- Confirm that SMS Gateways opens and that at least one gateway can be configured before installing the inbound layer.
Installing Corvus SMS Inbound
- Place corvus_sms_inbound in the same addons path.
- Update the Apps list.
- Search for Corvus SMS Inbound and click Install.
- Open Settings and confirm that the SMS Routing application section is available.
- Open the SMS gateway list and confirm that Numbers, Inbound and Guide pages are available on a gateway form.
Configure the routing policy
Open Settings, locate SMS Routing, and decide what the system should do before you expose the webhook to a provider.
- Set Primary Target:
- Last Outbound continues the conversation on the document that most recently sent SMS to this number.
- CRM Lead selects a lead belonging to the matched contact.
- Contact posts on the contact chatter.
- SMS Inbox keeps the conversation in its dedicated inbox thread.
- Set a Fallback Target for cases where the primary target cannot be found.
- If CRM is used, select the lead strategy: latest lead, the lead marked as the SMS thread, or the lead found from the last outbound SMS.
- Configure the actions for a missing last outbound message, missing lead and missing contact. Each condition can use the fallback, create an appropriate record where supported, use SMS Inbox, or discard the event.
- Decide whether unlinked inboxes are allowed. If not, choose whether Odoo creates a contact or discards the unmatched message.
- Optionally set the global fallback sender number used when user and company defaults do not resolve one.
- Save Settings.
Configure an inbound gateway
Open SMS Gateways, remove the default Active filter if you need to review all built-in templates, then open the gateway that will receive live traffic.
Capability and callback
- Enable Supports Inbound.
- Copy the computed Inbound Callback URL. It follows /sms/inbound/<token> and identifies this gateway without exposing an Odoo user password.
- Use Regenerate Token only when replacing a compromised or retired URL. The old URL stops identifying the gateway after regeneration.
- If one provider endpoint carries both incoming messages and delivery status, enable Use Inbound for Status and configure the event discriminator.
Payload field mapping
Map provider paths to Odoo values. Nested JSON paths are supported by the parser logic; use the exact path found in the provider payload.
- From Parameter — customer/sender number.
- To Parameter — your receiving gateway number.
- Text Parameter — SMS body.
- Media Parameter — media URL collection used by the MMS companion layer.
- Message ID Parameter — provider message identifier.
- Webhook Event ID Parameter — stable event identifier used for idempotency when available.
For a shared inbound/status endpoint, configure the alert field and the values that mean “incoming message” or “status update.” Provider status names are then mapped to Odoo delivery states through the gateway status mapping.
Webhook security
The random URL token is the minimum identification mechanism. If your provider supports signed callbacks, enable signature verification and configure:
- signature header name;
- secret shared with the provider;
- HMAC algorithm and optional prefix;
- whether the raw body or another payload representation is signed;
- timestamp header and maximum accepted age, when supplied by the provider.
Keep tokens and secrets out of screenshots, tickets and public documentation. Signature settings must match the provider byte-for-byte; an incorrect payload mode is a common cause of valid callbacks being rejected.
Configure multiple gateway numbers
The Numbers page is both the inbound receiving-number registry and the outbound sender-number policy.
For each provider number:
- Enter a clear label that operators will recognize in chatter and composers.
- Enter the provider number and verify its normalized value.
- Choose a display color to distinguish number tabs and message context.
- Set sequence and active state.
- Mark one default number per gateway when appropriate.
- Restrict Allowed Users if the number belongs to a team or region.
- Add country prefixes when the number should be preferred for matching destinations in specific countries.
- Configure hourly or daily limits when sender-number throttling is required.
The effective outbound default is resolved from the user default, company default, global default, and then the first eligible active number. Limits and user access are checked before the number is used.
Test payload mapping before go-live
Use Test Inbound Parser from the gateway form. This tool parses sample data without requiring a provider to send a real message.
- Paste a representative JSON payload supplied by the provider.
- Paste representative headers when testing signature or header-dependent behavior. Never paste a production secret into shared documentation.
- Run the parser preview.
- Confirm sender, recipient, body, message ID, event type and gateway number.
- Check whether the test would match an existing duplicate.
- Correct gateway paths and repeat until every extracted value is accurate.
Do not activate a production webhook while the receiving number or body parses as empty. A successful HTTP response alone does not prove correct routing.
How an inbound SMS is processed
When the provider calls the tokenized route, Odoo follows this sequence:
- Identify candidate gateways from the token.
- merge query, form, JSON or raw-body values;
- classify the event as inbound SMS or delivery status;
- verify the optional HMAC signature;
- compute a duplicate key and compare it with recent logs;
- match the receiving number to sms.gateway.number;
- normalize the sender and find a contact;
- apply the configured primary and fallback routing policy;
- post the message to the selected chatter and maintain SMS Inbox continuity;
- create inbound sms.sms and mail.notification records;
- send bus events so installed suite interfaces can refresh; and
- mark the inbound log as processed or record a useful error.
SMS Inbox
SMS Inbox is the safe conversation fallback. It stores one thread per normalized phone identity, links a contact when available, tracks total and unread counts, and records the latest message.
Open a thread to read its chatter history. The base module supplies inbox records and unread state; companion modules add richer chatter tabs, floating chat, desktop alerts and email notifications.
Inbound logs and diagnostics
Open Inbound SMS Logs when a callback is missing, duplicated or routed to an unexpected destination.
Review:
- gateway and raw sender/recipient values;
- provider message and webhook event IDs;
- payload and header snapshots;
- received, processed or error status;
- duplicate flag and original log reference; and
- processing note explaining the selected route or failure.
Use the log search filters to separate processed, duplicate and error traffic. Open the duplicate reference to compare the replay with the original event; open error records to read the payload and processing note together.
Inbound and outbound messages in chatter
Inbound records use direction inbound and state received. Outbound records retain their normal sending/delivery states. The associated gateway number is written to SMS and chatter metadata, allowing companion interfaces to show the receiving/sending identity and separate customer replies from staff messages.
Delivery-status callbacks
Status events locate the existing status record through the provider message ID and gateway. The handler then updates sms.status, the linked tracker and the linked sms.sms state. If inbound and status traffic share one callback URL, the configured discriminator must classify both event types reliably.
Security and access
Administrators manage gateways, logs, parser tests and number policy. Internal users can work with SMS Inbox and read gateway numbers according to access. A number's Allowed Users list further controls who can select it for outbound work. Treat the public webhook as an internet-facing integration: use HTTPS, rotate exposed tokens, enable provider signatures where possible, and retain logs according to your privacy policy.
Troubleshooting
- Provider receives 404 or gateway is not found
- Copy the current callback URL again. Confirm that the token belongs to an active gateway and that the public hostname reaches this Odoo database.
- Log exists but sender, recipient or body is blank
- The payload path is wrong. Paste the same payload into the parser and map the nested provider field exactly.
- Signature validation fails
- Compare header name, algorithm, prefix, secret, payload mode and timestamp tolerance with the provider's signing documentation.
- A callback is marked duplicate
- Check provider event/message IDs and the idempotency window. Replayed events are intentionally suppressed when they produce the same deduplication key.
- Message routed to the wrong record
- Review the primary target, lead strategy, missing-target actions, last outbound history, contact phone normalization and receiving-number match.
- Users cannot select a sender number
- Check active state, allowed users, quota counters, and user/company/global defaults.
Limitations and provider responsibility
Gateway APIs and webhook formats differ. Custom gateways are not guaranteed to work without adjustment. Telnyx and LoopMessage have been tested for inbound and outbound SMS/MMS workflows, but Corvus Nexus Technologies LTD is not an official partner, reseller or telecom provider for them or any other SMS provider.
Odoo IAP inbound support is not provided by this module. Inbound SMS (and MMS inbound) requires a third-party SMS/MMS provider that supports inbound webhooks/callbacks, plus an active inbound-enabled package and valid provider balance/credits on that gateway. MMS inbound is also only available through compatible third-party gateway setups, never through Odoo IAP.
After purchase, Corvus Nexus Technologies LTD can assist with configuring one specific gateway without an additional service charge. This does not include provider fees, custom development, number procurement, telecom compliance work or a guarantee of third-party delivery.
Professional Services
Corvus Nexus Technologies LTD provides Odoo SMS/MMS implementation, gateway and webhook setup, provider mapping, custom integration, version/data migration, deployment support, team training, troubleshooting and ongoing optimization.
Support and Contact
Corvus Nexus Technologies LTD Proprietary License v3.0 1. LICENSE AND OWNERSHIP This software and all associated documentation (the “Software”) is the exclusive property of Corvus Nexus Technologies LTD (“Licensor”). By downloading, installing, or using the Software, you accept a non-exclusive, non-transferable, non-sublicensable, non-assignable license limited to the terms below. 2. LICENSE GRANT The Licensor grants you a personal license to use this Software only for your internal business operations. The license is valid only for: 1) one (1) production Odoo database, and 2) one (1) dedicated test/sandbox database tied to the same deployment context. No other production instance may use this licensed copy. 3. AUTHORIZED USES ONLY You may use the Software only in unmodified form on the authorized databases. You may not: 1) copy, redistribute, sublicense, lease, rent, lend, transfer, or resell the Software; 2) use the Software on additional production databases, whether for internal affiliates or separate legal entities, without a separate license; 3) publish, expose, or distribute this Software as a service or product; 4) modify, decompile, reverse engineer, disassemble, de-obfuscate, adapt, or create derivative works from the Software; 5) use any part of the code, architecture, workflow, or implementation concepts commercially without written permission from the Licensor; 6) repackage, mask, or remove licensing, copyright, or authorship notices. 4. THIRD-PARTY USE IS PROHIBITED You may not offer, integrate, or sell this Software to end users under a different brand or package, or create a derivative commercial module, plug-in, or integration based on it, without written permission from the Licensor. 5. INTELLECTUAL PROPERTY All rights not expressly granted in this license remain reserved by the Licensor. You acquire no ownership interest in the Software. All trademarks, copyrights, trade secrets, and know-how remain with the Licensor. 6. WARRANTY DISCLAIMER THE SOFTWARE IS PROVIDED “AS IS” AND “AS AVAILABLE,” WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE. THE LICENSOR DISCLAIMS ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUALITY, SECURITY, NON-INFRINGEMENT, CONTINUITY, OR OPERATIONAL RELIABILITY. 7. NO LIABILITY ASSUMPTION To the maximum extent permitted by law, the Licensor shall not be liable for any indirect, incidental, special, consequential, punitive, exemplary, or economic damages, including loss of profits, data, revenue, goodwill, business opportunity, or downtime. 8. LIABILITY LIMITATION Your sole and exclusive remedy for any valid claim is limited to the net license income actually received by the Licensor from the sale/acceptance of the Software to you, after deduction of all applicable taxes, value-added taxes, and Odoo App Store fees and commissions. No other damages, claims, demands, penalties, or compensation shall be payable. 9. INDEMNITY You shall defend, indemnify, and hold harmless the Licensor, its owners, and directors from all claims, losses, liabilities, and costs arising from your misuse, misconfiguration, unauthorized use, breaches, or third-party reliance on your use of the Software. 10. TERMINATION This license is immediately terminated on any breach. Upon termination, you must cease use, delete all copies, remove all copies from all systems, and provide written confirmation of compliance if requested. 11. JURISDICTION AND ENFORCEMENT This license is governed by the laws of England and Wales. Any dispute shall fall under the exclusive non-exclusive jurisdiction of the courts of England and Wales. The parties may, in good faith, attempt informal resolution before commencing court proceedings. 12. COMPULSORY TERMS This License is not negotiable. If any term is held unenforceable, it will be severed only to the minimum extent required by law, and all remaining terms remain in full effect.
Please log in to comment on this module