Quick Start Guide

1. Add a new calendar (in "Calendar" App)

add calendar

2. Add contact info

contact info

3. Select Calendar, Apply and Click "Edit Template"

calendar settings

4. Add appointment slots

add appointment slots

5. Save the template

save template

6. Enable sharing

enable sharing

7. Get appointments page URL

get page url

Timezones

Your calendar's timezone is used as the base and appointment time will be converted to visitors' local time at their end.

Example: 12:00PM America/New_York timezone appointment based in New York

local timezone

Customize Public Page

GDPR Compliance

Any text in the "GDPR Compliance" field will trigger the "GDPR" checkbox to display. The checkbox can be hidden by checking the "GDPR text only (no checkbox)" option.

A checkbox with plain text (no html) or any html/links without a checkbox will work as is. However, if you need to include the checkbox and certain html or a link to your privacy policy, please read on: For the link to work properly, you should separate it from the <label> element, and the <label>'s "for" attribute MUST be set to "appt_gdpr_id". Example:

<label for="appt_gdpr_id">Some text </label><a href="PRIVACY_POLCY_URL">Privacy Policy</a><label for="appt_gdpr_id"> some more text.</label>

Appointment Title

If an event title/summary starts with the "_" character then the title will be displayed next to or below the time in the form. For example: _Language Lessons will be displayed as "Language Lessons"

Title Template

Following template tokens can be used to customize the Appointment Title:
%N - Attendee name
%O - Organization Name
%P - Page Name (as shown/set in page list sidebar)
%T - Mask Token (first three letters of name + semi-random token)
For example, a template like %N (%O) will set new appointments title to something like John Smith (Good Org)

Style Override

Insert custom <style></style> element to override default page style. Try something like this, for example:

<style>
#header{
    background: transparent !important;
}
#content{
    background: linear-gradient(to bottom, #ff00cc, #333399) !important;
}
#body-public #content {
    min-height: 100%;
}
form{
    background:whitesmoke;box-shadow: 3px 3px 25px 0px rgba(0,0,0,0.75);
}
.srgdev-ncfp-form-header{
    border-bottom: 3px solid #961AB1;
}
</style>
* Don't forget to style confirmation and error pages

Email Settings

Email the Attendee when the appointment is modified and/or deleted - Attendees will be notified via email when their upcoming appointments are updated or deleted in the calendar app or via some other external mechanism. Only changes to Date/Time, Status or Location will trigger the "Modified" notification.

Email Me when an appointment is updated - A notification email will be sent to you when an appointment is booked via the public page or an upcoming appointment is confirmed or canceled via the email links.

Skip email validation step - When this option is selected, the "... action needed" validation email will NOT be sent to the attendee. Instead, the "... Appointment is confirmed" message will be sent immediately, and the "All done" page will be displayed upon submission of the form.

useDefaultEmail - Most Nextcloud instances won't have the configuration required to allow sending of emails on behalf of organizers. Therefore, the default email address set in the Mail Settings is used, and the organizer's address is included in the "Reply-To:" header field. If your Nextcloud configuration supports sending emails on behalf of individual users, Admins can override the 'useDefaultEmail' directive with this command: occ config:app:set appointments useDefaultEmail --value no

Additional Email Text - this text is appended as a paragraph at the end of validation and confirmation emails. Currently only pain text is allowed and included HTML will be escaped.

Additional ICS file description - this text (no HTML please) will be appended to the end of the event's "DESCRIPTION" property.

Time slot mode

Weekly Template - this mode allows you to set up a weekly template and it will be automatically repeated.

Destination Calendar (Weekly Template) - Booked/pending appointments will be placed into this calendar.

Check for conflicts in… - these calendars will also be checked for conflicts, in addition to the Destination Calendar.

Appointment Properties - Duration: if you set multiple duration options for an appointment, then visitors can choose between them. Title: if this is set then the title will be displayed next to or below the time in the form.

Subscriptions Sync Interval - When linked (subscribed) calendars are selected for conflict checks, the appointments app can pull data from remote servers before checking for scheduling conflicts. It is impractical to pull the data on every request, as this will increase processing time, especially if multiple remote calendars are selected. Nextcloud (like many other calendar systems) has a cache synchronization mechanism to facilitate timely updates. This option is provided just in case you feel Nextcloud is not refreshing the data often enough.

Simple mode - Use the provided "Add Appointment Slots" dialog to add "available" time slots. Recurrence is not supported in this mode.

Main Calendar - when you create new appointments, they are added here and are shown on the your public page(s). It is recommended to create a separate calendar.

Calendar for booked appointments - if this calendar is different from the main calendar, an appointment will be moved here once booked.

External mode - Use Nextcloud's Calendar App or any other CalDAV-compatible client to add "available" timeslots. Most recurrence rules are supported in this mode. Two calendars are required: a "Source Calendar" to keep track of your availabile timeslots, and a "Destination Calendar" for booked appointments.

Source Calendar (External mode) - Any event with "Show As" a.k.a. "Time As" a.k.a. "Free/Busy" a.k.a. "Time Transparency" set to "Free" (RFC5545 specs "TRANSP:TRANSPARENT") will be available for booking through the public form. Most recurrence rules are supported. See also... Require "Appointment" category.

Destination Calendar (External mode) - Booked appointments will be added here. In addition to booked appointments, any events in this calendar marked as "Busy" will be considered as conflicts and these slots will be prevented from appearing as available in the public form. See also... Require "Appointment" category.

Optimize recurrence (External mode) - If recurrent events are used in the "Source Calendar", the start (DTSTART) date will be pushed forward occasionally to improve performance.

Require "Appointment" category (External mode) - When this option is selected, only events with the "Category" set to "Appointment" (in English) will be considered.

Auto-fix "Source" timeslots (External mode) - Some calendar apps do not allow users to set the Free/Busy parameter, resulting in timeslots not being available for booking. If this option is enabled AND the first character of the Description/Notes is "_", then the Free/Busy will be set to "Free" and the "Appointment" category will be added automatically when a new event is created in the "Source" calendar.

Talk App Integration

Talk rooms/conversations can be automatically created when an appointment is confirmed. FLOATING timezones are not supported.

Guest password - when this option is selected, Talk rooms will be password protected. An automatically generated pseudo-random password will be sent to attendees along with a room/meeting link.

Customize email text - you can override default the email message. There are two tokens available, {{url}}, and if you use password protection, {{pass}}. These will be replaced with the room URL and the password, if used.

For example:

Please use this link {{url}} for our meeting.
Your password is: {{pass}}

will look similar to this:

Please use this link https://my_domain.com/index.php/call/to6d6y4e for our meeting.
Your password is: dj984jjr

"Meeting Type" form field - when this option is enabled, a <select> drop-down similar to the one below will be added to the form. If a visitor selects an 'In-person' meeting, a Talk room will NOT be created for this appointment.


Type change email text - if this field is not empty and has two tokens {{link_text}} (can contain any text) and {{new_type}} (MUST be new_type), then this text will be attached to the email and attendees will be able to change their meeting type simply by clicking on the link {{link_text}}.

For example, this:

Click {{here}} to change your appointment type to {{new_type}}.

will look similar to this:

Click here to change your appointment type to Online (audio/video).

Talk rooms will be created and deleted automatically when a meeting type changes.


Redirect to a Custom "All Done" Page After Confirmation

Redirect Confirmed URL - when a URL is specified here, visitors will be redirected to the URL after they confirm their email address. A base64 encoded d=... query parameter containing a JSON object will be added to the URL. The final URL for https://your-cool-domain.com/finish.html might look something like this: https://your-cool-domain.com/finish.html?d=eyJpbml0aWFsQ29uZmlybSI6dHJ1ZSwiaWQiOiI4YjhkOD...

When the d=... param data is base64 decoded, the JSON object might be similar to this:

{
    "initialConfirm": true,
    "id": "8b8d87915a32bc4f48eb14439cd52cef",
    "name": "Bruce Banner",
    "dateTimeString": "Wednesday, April 13, 2022, 10:30 AM EDT"
}
"initialConfirm" - is set to "true" ONLY on initial confirmation. If a user reloads the page or clicks the "Confirm" button in the email again, this will be set to "false"
"id" - a unique hex-encoded 128bit number. (only set when the "Generate ID" option is checked)
"name" - Visitor name from the form. (only set when the "Include Form Data" option is checked)
"dateTimeString" - Localized date-time string in the visitor's language (only set when the "Include Form Data" option is checked)


iFrame/Embedding

1. If the iframe is under a different, domain use occ to set allowed Frame Ancestor Domain: php occ config:app:set appointments "emb_afad_YourUserName" --value "your.domain.com" 2. Email confirm/cancel buttons need to be redirected.
Use occ to set the base URL for the host page with a query parameter at the end of the URL: php occ config:app:set appointments "emb_cncf_YourUserName" --value "http(s)://your.domain.com/page_url?some_param_name=" Example using PHP:
...
    <?php
    $src='PROVIDED_EMBEDDABLE_URL';
    if(isset($_GET['some_param_name'])){
    // Email Confirm/Cancel button was clicked
    $src=substr($src,0,-4).'cncf?d='.urlencode($_GET['some_param_name']);
    }
    echo '<iframe src = "'.$src.'"></iframe>';
    ?>
...
More examples: https://github.com/SergeyMosin/Appointments/tree/master/tests/embedding
Nextcloud occ: https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/occ_command.html
Frame Ancestors: https://w3c.github.io/webappsec-csp/#directive-frame-ancestors
Additional information can be found here: https://github.com/SergeyMosin/Appointments/issues/191#issuecomment-909210230
Some more information is here: https://github.com/SergeyMosin/Appointments/issues/268#issue-1067123944

Booked and Pending Appointment Buffers

It is possible to block off a period of time before and after a booked(and pending) appointment. This could be useful when some preparation or travel time is required before, or clean-up/cooling-off/review time needs to be blocked off after.

Buffer blocking logic:
appointment buffers

Default Reminders language

Nextcloud Cron uses default_language setting for internal calls as per here: https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/config_sample_php_parameters.html#user-experience, which defaults to English. It might be different from the language selected in your user preferences.

Advanced/Notification Extensions

See https://github.com/SergeyMosin/Appointments/issues/26

Ensure the ext_notify_YourUserName app config variable is set like so: php occ config:app:set appointments "ext_notify_YourUserName" --value "/absolute/path/to/file.php" * very long UserNames must be trimmed to 53 character

Contributor Features

The following features are only available to users that contributed to the development of this app:
  1. Add more than 3 public pages (up to 10) to your setup
  2. Use the directory webpage to publicly display multiple links
  3. Additional Reminder options
  4. More "Talk" integration options
  5. And some others
Contributor features can be unlocked by obtaining a contributor key in any of the following ways:
  1. Contribute any amount to this app development or sponsor a feature over at the Funding page.
  2. Contribute code via a pull request on GitHub.
  3. If you are a member of the Nexcloud team on transifex.com please contact me directly.
  4. Contact me if none of the above methods works for you.
Once you receive your key/code you can enter it in the Settings > Contributor Key section.