MS365 Calendar Sync
by Syntax & Sabotage https://praetorx.net , Lars Weiler https://praetorx.net$ 92.30
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Calendar (calendar)
• Discuss (mail) |
| Community Apps Dependencies | Show |
| Lines of code | 2052 |
| Technical Name |
praetorx_ms365_calendar |
| License | OPL-1 |
| Website | https://praetorx.net |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Calendar (calendar)
• Discuss (mail) |
| Community Apps Dependencies | Show |
| Lines of code | 2052 |
| Technical Name |
praetorx_ms365_calendar |
| License | OPL-1 |
| Website | https://praetorx.net |
MS365 Calendar Sync
Loop-safe bidirectional Microsoft 365 Calendar & Teams sync — webhook-driven, multi-company, built for Odoo 19
Extends Odoo’s built-in Microsoft Calendar with origin tracking that breaks the update loop, MS Graph webhooks for push-based sync, Teams meetings with join URLs, and a conflict resolution UI for when both sides change the same event. Single-tenant Azure AD — no Microsoft publisher verification required. Per-user opt-in, multi-company credentials, German UI.
praetorx.net | Syntax & Sabotage
Core Features
A sync_origin field on every event distinguishes user edits from sync-originated writes, breaking the update loop at the record level. A SHA-256 field hash suppresses no-op writes on both sides.
MS Graph change notifications deliver updates within seconds. Subscriptions auto-renew before their 3-day expiry. 15-min cron fallback catches anything missed.
Create Teams meetings from any calendar event. Join URL prominently displayed with one-click access and chatter notification.
When both sides change the same event, a side-by-side comparison lets you pick the winner — no data lost silently.
Per-company Azure AD credentials override the global config. Client secrets are encrypted at rest via the praetorx_base security layer. Single-tenant app — no Microsoft publisher verification required.
Users enable sync individually. Webhook subscriptions are created and managed automatically per user.
Technical Reference
| Capability | How It Works |
|---|---|
| Origin Tracking | sync_origin field distinguishes user edits from sync writes — breaks update loops at the record level |
| Change Detection | synced_field_hash (SHA-256) + ms_change_key (ETag) detect real changes vs. no-ops |
| Webhooks | MS Graph subscriptions with HMAC clientState validation, 3-day lifetime, auto-renewal cron |
| Delta Polling | Cron fallback every 15 min for users without recent webhook activity |
| Conflict Detection | _detect_pull_conflicts() flags events modified on both sides within sync window |
Use Cases
CRM meetings sync to Outlook automatically. Teams join links for every client call.
Helpdesk appointments with Teams join links. No more “where’s the meeting link?” emails.
Different M365 tenants per subsidiary. Each company manages its own Azure AD app.
Full audit trail of all sync operations. Origin tracking shows who changed what and from where.
Screenshots
Per-User Sync Configuration
Each user enables MS365 sync independently. Toggle, authorize via OAuth, and choose sync direction — no global switch, no admin bottleneck.
Teams Meeting Integration
Enable the “Online Meeting” flag on any Odoo event — a Teams meeting is created on Microsoft’s side and the join URL is surfaced in Odoo with a one-click join button.
Setup Guide
- Odoo 19.0 (Community or Enterprise)
- Python 3.10+ with
requests(usually pre-installed) - Modules:
calendar,microsoft_calendar,praetorx_base(free) - Azure AD tenant with app registration access
No Enterprise dependency. Works on Community, Enterprise, and Odoo.sh.
- Go to Azure Portal → Azure Active Directory → App registrations → New registration
- Set supported account type to Single tenant (your org only)
- Add API permissions:
Calendars.ReadWrite,OnlineMeetings.ReadWrite - Create a client secret — copy the value immediately (shown only once)
- Note the Application (client) ID and Directory (tenant) ID
Detailed step-by-step guide included in the module: static/description/azure_ad_setup.md
- Install the module from Apps menu (search “MS365 Calendar”)
- Settings → Integrations → Microsoft Outlook → enter Client ID + Secret
- For multi-company: Settings → Microsoft Calendar → Multi-Company section
- Each user goes to Preferences → MS365 Calendar Sync → enable toggle
- Webhook subscription is created automatically for that user
- Sync starts immediately — changes in either direction propagate in seconds
Calendar User: Enable sync, create Teams meetings, view own sync status, resolve conflicts on own events.
System Administrator: Configure Azure AD credentials, manage webhook subscriptions, view all sync operations.
FAQ
microsoft_calendar which is included in Odoo Community 19. No Enterprise license required.Release History
v19.0.1.4.2 — April 2026
Current Release
- App Store listing polish: accurate scope statements, webhook latency clarified (push-based vs. real-time), single-tenant Azure AD surfaced
v19.0.1.4.1 — April 2026
- App Store listing (v4.1 template) + screenshots, icon, banner
v19.0.1.4.0 — April 2026
- Multi-company Azure AD credentials (
ms365_client_id,ms365_client_secret,ms365_tenant_idonres.company) - Company-level token refresh with per-company secrets
- Tenant-specific auth/token endpoints
v19.0.1.3.0 — April 2026
- Teams meeting creation with
isOnlineMeetingflag - Join URL read-back and prominent join button on event form
- Conflict resolution UI with side-by-side comparison
- Resolution actions: keep Odoo version or apply Outlook version
v19.0.1.2.0 — April 2026
- Webhook controller with HMAC
clientStatevalidation - Subscription model with 3-day lifetime and auto-renewal
- Cron fallback: delta poll every 15 min for missed webhooks
- Per-user sync toggle with automatic subscription management
v19.0.1.1.0 — April 2026
- Full sync engine with origin-aware push/pull
- Change detection via
synced_field_hash(SHA-256) andms_change_key(ETag) - Conflict detection for events modified on both sides
- Azure AD app setup guide
v19.0.1.0.0 — April 2026
Initial Release
- Module scaffold extending
microsoft_calendar - Origin tracking (
sync_originfield) to break update loops - Teams meeting fields:
is_teams_meeting,teams_meeting_url - Calendar event form with sync status and Teams fields
- Unit tests for origin tracking behavior
You May Also Like
Made with ♥ by Syntax & Sabotage
Anbieter: Lars Weiler · Impressum · support@syntaxandsabotage.io
Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module