Sync-to-Chain diagram

Video demo:


  • Visual schedules are more intuitive and allow you to see who’s “on-call” and that you have “coverage” the entire time.
  • The calendar can inform and remind your staff WHO is on-call/duty at any time.
  • Overcome the limitations of the “time-based chain” which can’t currently do “overnight” shifts like “6pm to 8am the next morning” and rotations that change each week or on a specified date.


UPDATE!  If you’re using Office365, please use a new version that doesn’t require Cronofy (June 2018).
This is a datasource (PowerShell script) that reads your calendar every ~5 minutes and verifies or changes your LogicMonitor Escalation chain(s) to match the calendar. It uses free ‘middleware’ called Cronofy so one script can support 4 different calendar vendors (i.e. google, Microsoft Office 365, etc). If I see enough demand for a single type of calendar, I could write directly to that without using Cronofy.



  • FYI: This datasource has been updated from our older RPC API to newer REST API.
  • Calendars supported: Google, Office 365, On-Premise Exchange 2010 or newer
  • Your escalation chains must have the word “schedule” in the names (not case-sensitive)
  • Your calendar name must match the name of your Escalation chain (not case-sensitive)
  • The event names on your calendar must specify usernames in the event name e.g. 1=Al (SMS), 2=Bob (voice). Email is the default so you don’t need to specify that in parenthesis.
  • You can only have one event on the same calendar at the same time (otherwise it will get confused)
  • Disclaimer: This is not officially supported by LogicMonitor tech support. Use at your own risk. If you need help, email me mike [at]


  • Sign up for a free account at and create your authentication “token”
  • I suggest you create a user account in LogicMonitor for the API calls. Generate the API ID and key and save them. Set a property for ‘api.key’ at the device or group or account level.
  • Download the datasource and import it into your account
  • Set a property on your device (preferably your collector) so the datasource will be applied:
    sync_calendar = whatever
  • Set some settings at the top of PowerShell script in datasource (or use variables). $CRONOFYclientID, $LMtenant (your logicmonitor portal name), and $LMACCESSID (i.e. your LogicMonitor API access ID)
  • If you haven’t already, create your schedules.
  • Test by using ‘test script’ and look at graphs in datasource for errors/alerts. A status of 0 or 1 are ok, other numbers indicate problems as follows:
    0=no changes needed
    1=ok – changes were successful
    2=Calendar named (CCCC) has no matching ‘chain’ in LogicMonitor
    3=Calendar event named (EEEE) does not specify a username that exists in LogicMonitor
    4=Calendar named (CCCC) has 2 or more events but only 1 is allowed
    5=For some unknown reason, after the script changed the chain (HHHH) ; the chain doesn’t match the event.
    6=No calendar event found for this time



Download this DataSource file and add it into your LogicMonitor account (Settings > DataSources > Add > From file )


If you need to debug, you can run the script in the LogicMonitor interactive debug command window ( Settings > Collectors > Manage > Support > Run Debug Command)

Type “!posh” to open a window. Paste in the contents of the script. You will need to change the ##api.pass## to your real password. Then click “Submit”

returns 1
[20160316 04:32:51]-REST status: 200, 5 total escalation chains found for suding account.
[20160316 04:32:51]-2 escalation chains found that contain 'schedule'.
[20160316 04:32:52]-DEBUG: 6 calendars found for client_id xxxxxxxxx[redacted]
[20160316 04:32:52]-2 calendars found that contain 'schedule'.
[20160316 04:32:53]-DEBUG: 70 events found for client_id xxxxxxxx[redacted]
[20160316 04:32:53]-Processing calendar 'Network on-call schedule'.
[20160316 04:32:53]-Processing calendar 'Database on-call schedule'.
[20160316 04:32:53]-66 on call events found in 2 calendars.
[20160316 04:32:53]-Current Date is Wednesday, March 16, 2016 11:32:53 AM UTC.
[20160316 04:32:53]-The current event is evt_external_56e4380773767685b80808d4 - start 2016-03-16T00:00:00Z UTC, end 2016-03-16T15:00:00Z UTC, summary: 1=Bob (sms) 2=Cole.
[20160316 04:32:53]-The current event is evt_external_56e6f90a73767685b80b3050 - start 2016-03-15T23:00:00Z UTC, end 2016-03-16T16:00:00Z UTC, summary: Al (voice).
[20160316 04:32:54]-DEBUG: Event has 2 stages, listing contacts:
[20160316 04:32:54]-DEBUG: Stage 1, addr Bob, method sms
[20160316 04:32:54]-DEBUG: Stage 2, addr Cole, method email
[20160316 04:32:54]-DEBUG: Escalation chain has 2 stages, listing contacts:
[20160316 04:32:54]-DEBUG: Stage 1, addr Don, method email
[20160316 04:32:54]-DEBUG: Stage 2, addr Ed, method sms
[20160316 04:32:54]-Updating LM escalation chain.
[20160316 04:32:56]-Update successful, REST status 200.
[20160316 04:32:56]-DEBUG: Event has 1 stages, listing contacts:
[20160316 04:32:56]-DEBUG: Stage 1, addr Al, method voice
[20160316 04:32:56]-DEBUG: Escalation chain has 1 stages, listing contacts:
[20160316 04:32:56]-DEBUG: Stage 1, addr Al, method voice
[20160316 04:32:56]-No update to LM escalation chain required.
[20160316 04:32:56]-EXIT Status/Error 1: Changes applied successfully