Part 1 · Communicating and meeting
Calendar
The team's calendar: schedule a meeting, invite people, send a real invitation, cancel cleanly and sync with Nextcloud or Google.
The Calendar application keeps each person's schedule and the team's. You schedule a meeting there, invite attendees, open a video room and see who has answered. It serves everyone, from management setting up a steering committee to the assistant booking a customer call. The concrete result: a meeting that exists in one place for Symbifox, for everyone's personal calendar and for the guest who receives it in their own mailbox.
Overview#
A meeting is a calendar event: a subject, a time slot, attendees, a location or a video call address. Each attendee answers the invitation, and their answer (yes, maybe, no, awaiting) is counted on the form. Alongside that answer sits the meeting status, which says whether the meeting itself is going ahead: tentative, confirmed or cancelled. The two are independent, since a confirmed meeting can include guests who have backed out.
Symbifox takes Odoo's calendar and adds four things. Invitations carry the calendar file that recipients add to their own calendar, plus a link to their invitation page, and they are written in the guests' language. A meeting is cancelled instead of deleted, which notifies guests and frees the slot without erasing the record. A Nextcloud Talk video room opens in one step, next to the Odoo room. Finally, the calendar syncs both ways with Nextcloud and Google, and you can view it from the mobile app.
The application borders several others. A meeting's preparation, agenda and report live in Meetings. Slots that customers book themselves come from Appointments. Time off entered in the calendar turns on the out-of-office reply in Email, and a meeting in progress also arms notification silencing there.
Here is the demo calendar, in week view.

In the toolbar, the arrows and Today move the period, and the Week selector switches to day, month or year. The buttons at the top of the screen switch between the grid and the list view. The side panel holds the month mini-calendar and the Attendees section. Your own calendar is checked there, Everybody's calendars adds the team's, and Add Attendees overlays one person's calendar. You create a meeting by dragging the mouse over a slot, or with New.
Configuration#
Access and permissions#
Anyone with an internal session has a calendar and sees colleagues' calendars overlaid. No specific permission group needs to be assigned: privacy is set meeting by meeting, with the field provided for it, and a private meeting shows only its time slot to others.
Sync and video room settings are reserved for general administrators, under Settings. The list of remote calendars is kept in the technical settings, where each configuration names the person who owns the calendar.
Settings#
Go to Calendar › Configuration › Settings. The top of the screen shows the two syncs shipped with Odoo, Outlook Calendar and Google Calendar. Below them, three blocks come from Symbifox.
Nextcloud Talk asks for your Nextcloud address, the service account that creates rooms and its app password. Test connection (creates throwaway room) creates a disposable room to check everything before use. Nextcloud Calendar Sync sets the default calendar that receives meetings created in Symbifox, along with the relay address and its secret. It also opens the list of calendars through Configure Calendar Sync. Google Calendar Sync takes the authorization client's ID and secret, and shows the redirect address to register with Google. Each person then connects their own account from their preferences.

Base data#
Reminders are the only data to prepare before you start. Seven are shipped: five on-screen notifications (fifteen minutes, thirty minutes, one hour, two hours, one day) and two emails (three hours, six hours). Add one if your organization wants another, for example the evening before.
Two kinds of data are optional. Tags classify meetings and colour them in the grid. Remote calendars are declared once per person and per synced calendar; see Connect a Nextcloud calendar.
Getting started#
This walkthrough schedules a steering committee at Boréal Services-conseils, gives it a video room and sends the invitation to the attendees.
- Open Calendar › Calendar. The current week appears.
- Drag the mouse over the slot you want, enter “Steering committee” and open the full form.
- Check the Start and Duration, then enter the Location if needed.
- In Attendees, add the people to invite.
- Under Videocall URL, select Nextcloud Talk or Odoo meeting. The room address fills in on its own.
- In Reminders, choose a notification, for example fifteen minutes before.
- Save, then select the email invitation button above the attendee list, and send the proposed message.
Result: the meeting fills the slot in your grid and in each attendee's grid. The answer count shows zero yes, zero maybe and zero no, plus the number of guests awaiting. Each guest receives an invitation they can add to their own calendar and answer.
Common tasks#
Schedule a meeting#
Quick create is enough for a slot; the full form is for when there are guests.
- Open Calendar › Calendar.
- Drag the mouse over the slot, or select New.
- Enter the subject, then open the full form.
- Fill in the Start, the Duration or All Day, the Location and the Description.
- Optional: choose the Privacy and add Tags.
- Save.
Result: the meeting appears in the grid, in the colour of its source calendar.

Invite attendees and send the invitation#
The invitation sent from Symbifox carries the calendar file and, when there is only one outside guest, a link to their answer page.
- Open the meeting.
- In Attendees, enter the name or address of each person to invite.
- Save.
- Select EMAIL. The composer opens on a pre-written message, in the company's colours.
- Review, adjust if needed, then send.
Result: each guest receives a message in their language, with the meeting as an attached file. The answer count updates as they reply.
Send the invitation by text message#
A short reminder works better by text for someone you cannot reach by email.
- Open the meeting.
- Select SMS.
- Review the proposed message: title, date, time and link, kept within the length of a single text.
- Send.
Result: attendees with a mobile number receive the text. See SMS, calls and SIP phone for the rest of text messaging.
Nudge a guest who has not shown up#
When someone is missing, a brief note beats a phone call.
- Open the meeting in progress.
- Select POKE.
- Review the proposed message, which mainly restates where to join the meeting.
- Send.
Result: guests receive a short note, in their language. No calendar file is attached: the meeting has not changed, and attaching one would read as a reschedule.
Open a video room#
Two rooms are available: Odoo's and Nextcloud Talk's.
- Open the meeting, or the quick create window.
- Under Videocall URL, select Odoo meeting or Nextcloud Talk.
- The room address fills in the field. Save.
Result: the address travels in invitations and reminders; each attendee joins the room by following it. The Talk room is public: anyone who has the address can enter.
Set a meeting's status#
The status says whether the meeting is going ahead, regardless of what guests have answered.
- Open the meeting, or select its tile in the grid.
- Set the Status: Tentative while it is not certain, Confirmed once it is settled.
- Save.
Result: a tentative meeting appears hatched in the grid, which sets it apart at a glance. A meeting without a status carries no mark: Symbifox never assumes a confirmation that nobody gave.
Cancel a meeting#
Deleting a meeting notifies nobody and leaves it in each guest's calendar. Cancelling does the three useful things at once.
- Open the meeting and select Cancel the meeting.
- Enter a reason if needed.
- Read the list of guests who would be notified: it excludes the organizer and people without an address.
- Check Send a cancellation notice if you want to write to the guests. The box starts cleared.
- Select Cancel the meeting.
Result: the tile stays in place, struck through, and the slot becomes free again for booking. The notice removes the entry from guests' calendars instead of redrawing it. Delete becomes available again on a meeting that is already cancelled.
Respond to an invitation#
Your answer is for the organizer, and it travels all the way to their calendar.
- Open the meeting from your grid.
- Under the attendee list, give your answer: yes, maybe or no.
- An outside guest instead follows the link in their invitation and answers from the invitation page.
Result: the answer count updates on the form. Declining does not remove the meeting from your grid.
Move or extend a meeting#
A drag in the grid is enough, but on its own it notifies nobody.
- Drag the tile to its new slot, or pull its edge to lengthen it.
- Confirm the scope if the meeting is recurring.
- Select the email invitation button to write to the guests.
Result: the invitation sent again carries the same identity as the first one, so guests' calendars move the entry instead of adding a second one.
Create a recurring meeting#
A committee that meets every week is entered once.
- Open the meeting and check Recurrent.
- Choose the repetition and its end.
- Save.
- To change a single date later, open the occurrence and choose the scope offered.
Result: all occurrences appear in the grid. An occurrence pulled out of its series remembers the slot it held, which lets guests' calendars move the right one.
Set up reminders#
Reminders are shared across the whole database, but you choose them meeting by meeting.
- To add a reminder to the shared list, go to Calendar › Configuration › Reminders, then select New.
- Choose the type, notification or email, then the delay and its unit.
- Save.
- On a meeting, select the reminders you want in the Reminders field.
Result: each attendee receives the notification at the chosen delay. On a phone, you can snooze the notification or mark it as seen from the mobile app.
Prepare the agenda and the report#
Preparation starts from the meeting itself and continues in another application.
- Open the meeting.
- Select Créer OdJ (create agenda) to open a linked agenda, or Créer compte rendu (create report) to open the meeting report.
- Optional: in the preparation section, set the Responsable de l'OdJ (agenda owner) and the Responsable du CR (report owner), or check Sans ordre du jour formel (no formal agenda).
Result: the meeting links directly to its two documents. Writing, sending and tracking them are described in Meetings.
Connect a Nextcloud calendar#
Sync works both ways: what is created on one side appears on the other.
- Go to Calendar › Configuration › Settings, then select Configure Calendar Sync.
- Select New and name the configuration.
- Fill in the Nextcloud address, the calendar path, the account and its app password.
- Set the person who owns the calendar and choose the sync direction.
- Select Test Connection, then Pull from Remote.
- Save.
Result: meetings from the remote calendar appear in Symbifox, in the chosen colour, and those created here go to Nextcloud. A sync pass catches up on differences every fifteen minutes.
Connect your Google calendar#
Each person connects their own account, once an administrator has registered the authorization.
- Open your preferences from your avatar, then the Google Calendar tab.
- Select Connecter Google Calendar (connect Google Calendar).
- Allow access in Google's window.
- Optional: enter your other Google addresses in the field provided, so that Google does not send your own invitations back to you.
Result: your Google calendar and Symbifox's stay in step. Deconnecter (disconnect) cuts the link from Symbifox; removing the authorization completely is done in your Google account.
View your calendar on a phone#
The Symbifox mobile app has a calendar tab and a tasks tab.
- Open the mobile app and go to the calendar tab.
- Choose day view or week view.
- Open a meeting to see its agenda and report, confirm your attendance or add a guest.
- On a reminder, snooze it or mark it as seen.
Result: both reminder actions and your answer to the invitation go back to Symbifox. The badge on the grid gives the number of deadlines for each day, without cluttering the hours. See Mobile apps and browser extension.
The menus, one by one#
Calendar: the application. It has only two entries, the grid and the configuration.
Calendar › Calendar: the Meetings grid, described in the overview. You switch between day, week, month and year, and between grid and list. The side panel filters by attendee. At the top of a meeting form are Créer OdJ, Créer compte rendu and the Activities counter, then Cancel the meeting. The body brings together the subject, schedule, recurrence, location, video call address with its two room buttons, tags, privacy, organizer and description. Beside it are the status, the reminders, the attendees with the three buttons EMAIL, SMS and POKE, and the answer count. Further down come the meeting preparation section and the linked activities.
Calendar › Configuration: the grouping entry for the two settings. Selecting it directly reopens the meetings grid (screenshot m134.png).
Calendar › Configuration › Settings: the Calendar Settings page, shown earlier. It brings together Odoo's two syncs and Symbifox's three blocks.
Calendar › Configuration › Reminders: the Calendar Alarm list, with the Type column, the delay and the Unit. The seven shipped reminders appear there: five on-screen notifications and two emails. A reminder's form is screenshot m136_form.png.

Reference#
Fields of the Meeting form#
| Field | Description | Required or default |
|---|---|---|
| Meeting Subject | The title shown in the grid and in the invitation. | Required |
| Start, Duration | The time slot. All Day replaces the duration. | Required |
| Recurrent | Opens the repetition settings and their end. | Cleared |
| Location | A place or an address. The part recognized as a web address becomes a link. | Optional |
| Videocall URL | The room address, typed in or set by one of the two buttons. | Optional |
| Tags | Classify the meeting and colour it. | Optional |
| Privacy | Public, private or per the organization's default; combines with the displayed availability. | Default |
| Organizer | The person who owns the meeting. | The person who creates it |
| Status | Whether the meeting is going ahead: tentative, confirmed or cancelled. Separate from the guests' answers. | Empty |
| Cancellation reason | Why the meeting is not happening; shown to guests only if a notice is sent. | Optional |
| Reminders | Notifications chosen from the shared list. | Empty |
| Attendees | The people invited, with the count of their answers. | The organizer |
| Description | The text included in the invitation. | Optional |
Fields of the Reminder form#
| Field | Description | Required or default |
|---|---|---|
| Type | On-screen notification or email. | Required |
| Remind Before | The number of units before the start. | Required |
| Unit | Minutes, hours or days. | Required |
Fields of a synced calendar configuration#
| Field | Description | Required or default |
|---|---|---|
| Calendar Name | The configuration's name in Symbifox. | Required |
| Remote service (badge at the top of the form) | Nextcloud or Google. | Required |
| Nextcloud URL, CalDAV Path | The server address and the calendar path. | Required for Nextcloud |
| Nextcloud User, App Password | The calendar account and its app password, stored encrypted. | Required for Nextcloud |
| Google Calendar ID | The target calendar at Google. | Required for Google |
| Calendar Owner (Odoo) | The person in whose calendar the meetings appear. | Required |
| Sync Direction | The allowed direction: one way, the other, or both. | Required |
| Odoo Color | The colour of meetings that come from this calendar. | Optional |
| Last Sync, Last Sync Status | The timestamp and result of the last pass. | Computed |
Reports and exports#
The application prints no report. It produces a calendar file, attached to invitations and cancellation notices, which opens in any calendar software. The list view exports to a spreadsheet like any Symbifox list.
Automations#
Remote calendars are polled every fifteen minutes, and a full pass runs every six hours to catch anything missed. In the other direction, a meeting created or edited in Symbifox goes to the remote calendar on save. Reminders go out at the chosen delay. On phones, two checks every minute pick up snoozed reminders and push notifications to the device. Finally, a meeting in progress can turn on notification silencing by itself and, for time off, the out-of-office reply. Both are described in Email.
Public pages and portal#
One public page exists: the invitation page, where an outside guest sees the meeting and answers without signing in. Its address identifies the invited person, so it must not be passed on. A second address handles the return from Google authorization and is never opened by hand.
Modules that extend this application#
Four modules complete Odoo's calendar. The first handles invitations and cancellation.
The second opens video rooms outside Odoo.
The third brings the calendar to phones.
The fourth connects the calendar to outside services.
Understanding#
The most important point is the meeting's identity. A calendar invitation carries an identifier, and that is how the recipient's software recognizes the meeting. Without a stable identifier, each send describes an unknown meeting. The recipient then gains one more copy instead of seeing the one they already have move. So Symbifox sets a lasting identifier on each meeting and reuses it for every later send. Where a remote calendar has already assigned one, its identifier wins: a single meeting cannot have two identities.
Alongside the identifier, a revision counts changes. It moves forward only on a material change, meaning the time, the place or the title. A typo fixed in the description is not a reschedule. Bumping the revision for it would train guests' calendars to ask for their answer again for nothing.
Cancellation exists because deletion notifies nobody. Three effects happen together. The meeting is marked cancelled and its tile stays in place, because a calendar that loses the entry can no longer answer “what was I supposed to do at ten?”. Availability goes back to free, which truly returns the slot to booking. And an optional notice tells the guests. The notice starts cleared because a sent message cannot be recalled. Setting the status by hand has the same effect on availability, including when the cancellation comes from outside calendar software.
Meeting status and guest answers are two different things. A tentative meeting is hatched in the grid rather than faded. Odoo already dims every meeting awaiting an answer, which is almost an entire calendar, so a paler shade would have gone unnoticed.
The answer page link appears only with a single outside guest, because the link acts as an identity. Given to a group, the first person to open it would answer for everyone. Likewise, the invitation is written in the guests' language when they share one, and in the organizer's otherwise, because a single message goes out to the whole list.
On the sync side, every write carries a mark of its origin, which stops a meeting from bouncing endlessly between the two calendars. A meeting that disappears from the remote calendar is removed here, so do not delete lightly. Pushed meetings carry their time zone; otherwise they would shift in the reader's calendar. Finally, tasks from Project do not appear in the calendar grid. Their deadlines are too numerous and would cover the meetings; the mobile app shows only their count per day.
Troubleshooting#
| Symptom | Likely cause | Fix |
|---|---|---|
| The guest received the message, but nothing was added to their calendar. | The invitation was sent from another screen, without the calendar file. | Open the meeting and select the email invitation button above the attendee list. |
| A moved meeting shows up twice in the guest's calendar. | Their calendar received two invitations with different identities, one of them from before the stable identifier existed. | Ask the guest to delete the old entry, then send the invitation again from the meeting. |
| The Talk room button produces no address. | The Nextcloud address, the service account or its password is missing. | Go to Calendar › Configuration › Settings, fill in the three fields, then select Test connection (creates throwaway room). |
| Cancel the meeting is not offered. | The meeting is recurring, or it is already cancelled. | On a series, edit the occurrence and choose the scope. On a meeting already cancelled, Delete is available again. |
| The slot stays busy after a cancellation. | The status was changed without going through cancellation, and availability stayed busy. | Open the meeting and set its availability to free. |
| A meeting created in Nextcloud does not appear. | The sync pass has not run yet, or the configuration is in error. | Open the calendar's configuration, read the result of the last pass and select Pull from Remote. |
| Google sends an invitation back to the organizer. | Another address of the Google account is not declared. | In your preferences, Google Calendar tab, add your other Google addresses. |
See also#
- Meetings, for the agenda, the report and decision tracking.
- Appointments, for the slots customers book themselves.
- Email, for received invitations, out-of-office and notification silencing.
- Discuss, for video calls started outside the calendar.
- SMS, calls and SIP phone, for sending text messages.
- Nextcloud and Collabora, for the service that hosts calendars and Talk rooms.
- Mobile apps and browser extension, for the calendar on your phone.