The aws:ssm/contactsRotation:ContactsRotation resource, part of the Pulumi AWS provider, defines on-call rotation schedules in AWS Systems Manager Incident Manager: which contacts rotate, when handoffs occur, and what coverage windows apply. This guide focuses on three capabilities: daily rotation schedules, weekly rotations with coverage windows, and monthly rotations on specific dates.
Rotations require existing SSM Contacts and an SSM Incidents replication set. The replication set must be configured first; the examples show this dependency explicitly. The examples are intentionally small. Combine them with your own contact definitions and incident response workflows.
Schedule daily on-call rotations
Incident response teams often start with daily rotations where on-call responsibility shifts at the same time each day.
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
const example = new aws.ssm.ContactsRotation("example", {
contactIds: [exampleAwsSsmcontactsContact.arn],
name: "rotation",
recurrence: {
numberOfOnCalls: 1,
recurrenceMultiplier: 1,
dailySettings: [{
hourOfDay: 9,
minuteOfHour: 0,
}],
},
timeZoneId: "Australia/Sydney",
}, {
dependsOn: [exampleAwsSsmincidentsReplicationSet],
});
import pulumi
import pulumi_aws as aws
example = aws.ssm.ContactsRotation("example",
contact_ids=[example_aws_ssmcontacts_contact["arn"]],
name="rotation",
recurrence={
"number_of_on_calls": 1,
"recurrence_multiplier": 1,
"daily_settings": [{
"hour_of_day": 9,
"minute_of_hour": 0,
}],
},
time_zone_id="Australia/Sydney",
opts = pulumi.ResourceOptions(depends_on=[example_aws_ssmincidents_replication_set]))
package main
import (
"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/ssm"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := ssm.NewContactsRotation(ctx, "example", &ssm.ContactsRotationArgs{
ContactIds: pulumi.StringArray{
exampleAwsSsmcontactsContact.Arn,
},
Name: pulumi.String("rotation"),
Recurrence: &ssm.ContactsRotationRecurrenceArgs{
NumberOfOnCalls: pulumi.Int(1),
RecurrenceMultiplier: pulumi.Int(1),
DailySettings: ssm.ContactsRotationRecurrenceDailySettingArray{
&ssm.ContactsRotationRecurrenceDailySettingArgs{
HourOfDay: pulumi.Int(9),
MinuteOfHour: pulumi.Int(0),
},
},
},
TimeZoneId: pulumi.String("Australia/Sydney"),
}, pulumi.DependsOn([]pulumi.Resource{
exampleAwsSsmincidentsReplicationSet,
}))
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Aws = Pulumi.Aws;
return await Deployment.RunAsync(() =>
{
var example = new Aws.Ssm.ContactsRotation("example", new()
{
ContactIds = new[]
{
exampleAwsSsmcontactsContact.Arn,
},
Name = "rotation",
Recurrence = new Aws.Ssm.Inputs.ContactsRotationRecurrenceArgs
{
NumberOfOnCalls = 1,
RecurrenceMultiplier = 1,
DailySettings = new[]
{
new Aws.Ssm.Inputs.ContactsRotationRecurrenceDailySettingArgs
{
HourOfDay = 9,
MinuteOfHour = 0,
},
},
},
TimeZoneId = "Australia/Sydney",
}, new CustomResourceOptions
{
DependsOn =
{
exampleAwsSsmincidentsReplicationSet,
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.aws.ssm.ContactsRotation;
import com.pulumi.aws.ssm.ContactsRotationArgs;
import com.pulumi.aws.ssm.inputs.ContactsRotationRecurrenceArgs;
import com.pulumi.resources.CustomResourceOptions;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var example = new ContactsRotation("example", ContactsRotationArgs.builder()
.contactIds(exampleAwsSsmcontactsContact.arn())
.name("rotation")
.recurrence(ContactsRotationRecurrenceArgs.builder()
.numberOfOnCalls(1)
.recurrenceMultiplier(1)
.dailySettings(ContactsRotationRecurrenceDailySettingArgs.builder()
.hourOfDay(9)
.minuteOfHour(0)
.build())
.build())
.timeZoneId("Australia/Sydney")
.build(), CustomResourceOptions.builder()
.dependsOn(exampleAwsSsmincidentsReplicationSet)
.build());
}
}
resources:
example:
type: aws:ssm:ContactsRotation
properties:
contactIds:
- ${exampleAwsSsmcontactsContact.arn}
name: rotation
recurrence:
numberOfOnCalls: 1
recurrenceMultiplier: 1
dailySettings:
- hourOfDay: 9
minuteOfHour: 0
timeZoneId: Australia/Sydney
options:
dependsOn:
- ${exampleAwsSsmincidentsReplicationSet}
The recurrence block defines when handoffs occur. The dailySettings property specifies the time of day (9:00 AM in this case), while numberOfOnCalls controls how many contacts are on-call simultaneously. The timeZoneId ensures handoffs happen at the correct local time. The contactIds array determines shift order: the first contact takes the first shift, the second takes the next, and so on.
Define weekly handoffs with coverage windows
Teams with varying workloads across the week often need different handoff times on different days, plus the ability to restrict when on-call coverage is active.
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
const example = new aws.ssm.ContactsRotation("example", {
contactIds: [exampleAwsSsmcontactsContact.arn],
name: "rotation",
recurrence: {
numberOfOnCalls: 1,
recurrenceMultiplier: 1,
weeklySettings: [
{
dayOfWeek: "WED",
handOffTime: {
hourOfDay: 4,
minuteOfHour: 25,
},
},
{
dayOfWeek: "FRI",
handOffTime: {
hourOfDay: 15,
minuteOfHour: 57,
},
},
],
shiftCoverages: [{
mapBlockKey: "MON",
coverageTimes: [{
start: {
hourOfDay: 1,
minuteOfHour: 0,
},
end: {
hourOfDay: 23,
minuteOfHour: 0,
},
}],
}],
},
startTime: "2023-07-20T02:21:49+00:00",
timeZoneId: "Australia/Sydney",
tags: {
key1: "tag1",
key2: "tag2",
},
}, {
dependsOn: [exampleAwsSsmincidentsReplicationSet],
});
import pulumi
import pulumi_aws as aws
example = aws.ssm.ContactsRotation("example",
contact_ids=[example_aws_ssmcontacts_contact["arn"]],
name="rotation",
recurrence={
"number_of_on_calls": 1,
"recurrence_multiplier": 1,
"weekly_settings": [
{
"day_of_week": "WED",
"hand_off_time": {
"hour_of_day": 4,
"minute_of_hour": 25,
},
},
{
"day_of_week": "FRI",
"hand_off_time": {
"hour_of_day": 15,
"minute_of_hour": 57,
},
},
],
"shift_coverages": [{
"map_block_key": "MON",
"coverage_times": [{
"start": {
"hour_of_day": 1,
"minute_of_hour": 0,
},
"end": {
"hour_of_day": 23,
"minute_of_hour": 0,
},
}],
}],
},
start_time="2023-07-20T02:21:49+00:00",
time_zone_id="Australia/Sydney",
tags={
"key1": "tag1",
"key2": "tag2",
},
opts = pulumi.ResourceOptions(depends_on=[example_aws_ssmincidents_replication_set]))
package main
import (
"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/ssm"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := ssm.NewContactsRotation(ctx, "example", &ssm.ContactsRotationArgs{
ContactIds: pulumi.StringArray{
exampleAwsSsmcontactsContact.Arn,
},
Name: pulumi.String("rotation"),
Recurrence: &ssm.ContactsRotationRecurrenceArgs{
NumberOfOnCalls: pulumi.Int(1),
RecurrenceMultiplier: pulumi.Int(1),
WeeklySettings: ssm.ContactsRotationRecurrenceWeeklySettingArray{
&ssm.ContactsRotationRecurrenceWeeklySettingArgs{
DayOfWeek: pulumi.String("WED"),
HandOffTime: &ssm.ContactsRotationRecurrenceWeeklySettingHandOffTimeArgs{
HourOfDay: pulumi.Int(4),
MinuteOfHour: pulumi.Int(25),
},
},
&ssm.ContactsRotationRecurrenceWeeklySettingArgs{
DayOfWeek: pulumi.String("FRI"),
HandOffTime: &ssm.ContactsRotationRecurrenceWeeklySettingHandOffTimeArgs{
HourOfDay: pulumi.Int(15),
MinuteOfHour: pulumi.Int(57),
},
},
},
ShiftCoverages: ssm.ContactsRotationRecurrenceShiftCoverageArray{
&ssm.ContactsRotationRecurrenceShiftCoverageArgs{
MapBlockKey: pulumi.String("MON"),
CoverageTimes: ssm.ContactsRotationRecurrenceShiftCoverageCoverageTimeArray{
&ssm.ContactsRotationRecurrenceShiftCoverageCoverageTimeArgs{
Start: &ssm.ContactsRotationRecurrenceShiftCoverageCoverageTimeStartArgs{
HourOfDay: pulumi.Int(1),
MinuteOfHour: pulumi.Int(0),
},
End: &ssm.ContactsRotationRecurrenceShiftCoverageCoverageTimeEndArgs{
HourOfDay: pulumi.Int(23),
MinuteOfHour: pulumi.Int(0),
},
},
},
},
},
},
StartTime: pulumi.String("2023-07-20T02:21:49+00:00"),
TimeZoneId: pulumi.String("Australia/Sydney"),
Tags: pulumi.StringMap{
"key1": pulumi.String("tag1"),
"key2": pulumi.String("tag2"),
},
}, pulumi.DependsOn([]pulumi.Resource{
exampleAwsSsmincidentsReplicationSet,
}))
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Aws = Pulumi.Aws;
return await Deployment.RunAsync(() =>
{
var example = new Aws.Ssm.ContactsRotation("example", new()
{
ContactIds = new[]
{
exampleAwsSsmcontactsContact.Arn,
},
Name = "rotation",
Recurrence = new Aws.Ssm.Inputs.ContactsRotationRecurrenceArgs
{
NumberOfOnCalls = 1,
RecurrenceMultiplier = 1,
WeeklySettings = new[]
{
new Aws.Ssm.Inputs.ContactsRotationRecurrenceWeeklySettingArgs
{
DayOfWeek = "WED",
HandOffTime = new Aws.Ssm.Inputs.ContactsRotationRecurrenceWeeklySettingHandOffTimeArgs
{
HourOfDay = 4,
MinuteOfHour = 25,
},
},
new Aws.Ssm.Inputs.ContactsRotationRecurrenceWeeklySettingArgs
{
DayOfWeek = "FRI",
HandOffTime = new Aws.Ssm.Inputs.ContactsRotationRecurrenceWeeklySettingHandOffTimeArgs
{
HourOfDay = 15,
MinuteOfHour = 57,
},
},
},
ShiftCoverages = new[]
{
new Aws.Ssm.Inputs.ContactsRotationRecurrenceShiftCoverageArgs
{
MapBlockKey = "MON",
CoverageTimes = new[]
{
new Aws.Ssm.Inputs.ContactsRotationRecurrenceShiftCoverageCoverageTimeArgs
{
Start = new Aws.Ssm.Inputs.ContactsRotationRecurrenceShiftCoverageCoverageTimeStartArgs
{
HourOfDay = 1,
MinuteOfHour = 0,
},
End = new Aws.Ssm.Inputs.ContactsRotationRecurrenceShiftCoverageCoverageTimeEndArgs
{
HourOfDay = 23,
MinuteOfHour = 0,
},
},
},
},
},
},
StartTime = "2023-07-20T02:21:49+00:00",
TimeZoneId = "Australia/Sydney",
Tags =
{
{ "key1", "tag1" },
{ "key2", "tag2" },
},
}, new CustomResourceOptions
{
DependsOn =
{
exampleAwsSsmincidentsReplicationSet,
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.aws.ssm.ContactsRotation;
import com.pulumi.aws.ssm.ContactsRotationArgs;
import com.pulumi.aws.ssm.inputs.ContactsRotationRecurrenceArgs;
import com.pulumi.resources.CustomResourceOptions;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var example = new ContactsRotation("example", ContactsRotationArgs.builder()
.contactIds(exampleAwsSsmcontactsContact.arn())
.name("rotation")
.recurrence(ContactsRotationRecurrenceArgs.builder()
.numberOfOnCalls(1)
.recurrenceMultiplier(1)
.weeklySettings(
ContactsRotationRecurrenceWeeklySettingArgs.builder()
.dayOfWeek("WED")
.handOffTime(ContactsRotationRecurrenceWeeklySettingHandOffTimeArgs.builder()
.hourOfDay(4)
.minuteOfHour(25)
.build())
.build(),
ContactsRotationRecurrenceWeeklySettingArgs.builder()
.dayOfWeek("FRI")
.handOffTime(ContactsRotationRecurrenceWeeklySettingHandOffTimeArgs.builder()
.hourOfDay(15)
.minuteOfHour(57)
.build())
.build())
.shiftCoverages(ContactsRotationRecurrenceShiftCoverageArgs.builder()
.mapBlockKey("MON")
.coverageTimes(ContactsRotationRecurrenceShiftCoverageCoverageTimeArgs.builder()
.start(ContactsRotationRecurrenceShiftCoverageCoverageTimeStartArgs.builder()
.hourOfDay(1)
.minuteOfHour(0)
.build())
.end(ContactsRotationRecurrenceShiftCoverageCoverageTimeEndArgs.builder()
.hourOfDay(23)
.minuteOfHour(0)
.build())
.build())
.build())
.build())
.startTime("2023-07-20T02:21:49+00:00")
.timeZoneId("Australia/Sydney")
.tags(Map.ofEntries(
Map.entry("key1", "tag1"),
Map.entry("key2", "tag2")
))
.build(), CustomResourceOptions.builder()
.dependsOn(exampleAwsSsmincidentsReplicationSet)
.build());
}
}
resources:
example:
type: aws:ssm:ContactsRotation
properties:
contactIds:
- ${exampleAwsSsmcontactsContact.arn}
name: rotation
recurrence:
numberOfOnCalls: 1
recurrenceMultiplier: 1
weeklySettings:
- dayOfWeek: WED
handOffTime:
hourOfDay: 4
minuteOfHour: 25
- dayOfWeek: FRI
handOffTime:
hourOfDay: 15
minuteOfHour: 57
shiftCoverages:
- mapBlockKey: MON
coverageTimes:
- start:
hourOfDay: 1
minuteOfHour: 0
end:
hourOfDay: 23
minuteOfHour: 0
startTime: 2023-07-20T02:21:49+00:00
timeZoneId: Australia/Sydney
tags:
key1: tag1
key2: tag2
options:
dependsOn:
- ${exampleAwsSsmincidentsReplicationSet}
The weeklySettings property replaces dailySettings, allowing you to specify different handoff times for different days of the week. The shiftCoverages block restricts when on-call coverage is active: in this example, coverage on Mondays runs from 1:00 AM to 11:00 PM. Outside coverage windows, the rotation pauses. The startTime property sets when the rotation begins, useful for aligning with team schedules.
Schedule monthly rotations on specific dates
Some teams rotate on-call responsibility monthly, with handoffs occurring on specific calendar dates.
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
const example = new aws.ssm.ContactsRotation("example", {
contactIds: [exampleAwsSsmcontactsContact.arn],
name: "rotation",
recurrence: {
numberOfOnCalls: 1,
recurrenceMultiplier: 1,
monthlySettings: [
{
dayOfMonth: 20,
handOffTime: {
hourOfDay: 8,
minuteOfHour: 0,
},
},
{
dayOfMonth: 13,
handOffTime: {
hourOfDay: 12,
minuteOfHour: 34,
},
},
],
},
timeZoneId: "Australia/Sydney",
}, {
dependsOn: [exampleAwsSsmincidentsReplicationSet],
});
import pulumi
import pulumi_aws as aws
example = aws.ssm.ContactsRotation("example",
contact_ids=[example_aws_ssmcontacts_contact["arn"]],
name="rotation",
recurrence={
"number_of_on_calls": 1,
"recurrence_multiplier": 1,
"monthly_settings": [
{
"day_of_month": 20,
"hand_off_time": {
"hour_of_day": 8,
"minute_of_hour": 0,
},
},
{
"day_of_month": 13,
"hand_off_time": {
"hour_of_day": 12,
"minute_of_hour": 34,
},
},
],
},
time_zone_id="Australia/Sydney",
opts = pulumi.ResourceOptions(depends_on=[example_aws_ssmincidents_replication_set]))
package main
import (
"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/ssm"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := ssm.NewContactsRotation(ctx, "example", &ssm.ContactsRotationArgs{
ContactIds: pulumi.StringArray{
exampleAwsSsmcontactsContact.Arn,
},
Name: pulumi.String("rotation"),
Recurrence: &ssm.ContactsRotationRecurrenceArgs{
NumberOfOnCalls: pulumi.Int(1),
RecurrenceMultiplier: pulumi.Int(1),
MonthlySettings: ssm.ContactsRotationRecurrenceMonthlySettingArray{
&ssm.ContactsRotationRecurrenceMonthlySettingArgs{
DayOfMonth: pulumi.Int(20),
HandOffTime: &ssm.ContactsRotationRecurrenceMonthlySettingHandOffTimeArgs{
HourOfDay: pulumi.Int(8),
MinuteOfHour: pulumi.Int(0),
},
},
&ssm.ContactsRotationRecurrenceMonthlySettingArgs{
DayOfMonth: pulumi.Int(13),
HandOffTime: &ssm.ContactsRotationRecurrenceMonthlySettingHandOffTimeArgs{
HourOfDay: pulumi.Int(12),
MinuteOfHour: pulumi.Int(34),
},
},
},
},
TimeZoneId: pulumi.String("Australia/Sydney"),
}, pulumi.DependsOn([]pulumi.Resource{
exampleAwsSsmincidentsReplicationSet,
}))
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Aws = Pulumi.Aws;
return await Deployment.RunAsync(() =>
{
var example = new Aws.Ssm.ContactsRotation("example", new()
{
ContactIds = new[]
{
exampleAwsSsmcontactsContact.Arn,
},
Name = "rotation",
Recurrence = new Aws.Ssm.Inputs.ContactsRotationRecurrenceArgs
{
NumberOfOnCalls = 1,
RecurrenceMultiplier = 1,
MonthlySettings = new[]
{
new Aws.Ssm.Inputs.ContactsRotationRecurrenceMonthlySettingArgs
{
DayOfMonth = 20,
HandOffTime = new Aws.Ssm.Inputs.ContactsRotationRecurrenceMonthlySettingHandOffTimeArgs
{
HourOfDay = 8,
MinuteOfHour = 0,
},
},
new Aws.Ssm.Inputs.ContactsRotationRecurrenceMonthlySettingArgs
{
DayOfMonth = 13,
HandOffTime = new Aws.Ssm.Inputs.ContactsRotationRecurrenceMonthlySettingHandOffTimeArgs
{
HourOfDay = 12,
MinuteOfHour = 34,
},
},
},
},
TimeZoneId = "Australia/Sydney",
}, new CustomResourceOptions
{
DependsOn =
{
exampleAwsSsmincidentsReplicationSet,
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.aws.ssm.ContactsRotation;
import com.pulumi.aws.ssm.ContactsRotationArgs;
import com.pulumi.aws.ssm.inputs.ContactsRotationRecurrenceArgs;
import com.pulumi.resources.CustomResourceOptions;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var example = new ContactsRotation("example", ContactsRotationArgs.builder()
.contactIds(exampleAwsSsmcontactsContact.arn())
.name("rotation")
.recurrence(ContactsRotationRecurrenceArgs.builder()
.numberOfOnCalls(1)
.recurrenceMultiplier(1)
.monthlySettings(
ContactsRotationRecurrenceMonthlySettingArgs.builder()
.dayOfMonth(20)
.handOffTime(ContactsRotationRecurrenceMonthlySettingHandOffTimeArgs.builder()
.hourOfDay(8)
.minuteOfHour(0)
.build())
.build(),
ContactsRotationRecurrenceMonthlySettingArgs.builder()
.dayOfMonth(13)
.handOffTime(ContactsRotationRecurrenceMonthlySettingHandOffTimeArgs.builder()
.hourOfDay(12)
.minuteOfHour(34)
.build())
.build())
.build())
.timeZoneId("Australia/Sydney")
.build(), CustomResourceOptions.builder()
.dependsOn(exampleAwsSsmincidentsReplicationSet)
.build());
}
}
resources:
example:
type: aws:ssm:ContactsRotation
properties:
contactIds:
- ${exampleAwsSsmcontactsContact.arn}
name: rotation
recurrence:
numberOfOnCalls: 1
recurrenceMultiplier: 1
monthlySettings:
- dayOfMonth: 20
handOffTime:
hourOfDay: 8
minuteOfHour: 0
- dayOfMonth: 13
handOffTime:
hourOfDay: 12
minuteOfHour: 34
timeZoneId: Australia/Sydney
options:
dependsOn:
- ${exampleAwsSsmincidentsReplicationSet}
The monthlySettings property defines handoffs on specific days of the month. Each entry specifies a dayOfMonth (20th and 13th here) and a handOffTime. This pattern works well for teams with longer rotation periods or those aligning with monthly sprint cycles.
Beyond these examples
These snippets focus on specific rotation-level features: daily, weekly, and monthly rotation schedules, and shift coverage windows. They’re intentionally minimal rather than full incident response configurations.
The examples reference pre-existing infrastructure such as SSM Contacts (contact ARNs) and the SSM Incidents replication set. They focus on configuring the rotation schedule rather than provisioning contacts or incident management infrastructure.
To keep things focused, common rotation patterns are omitted, including:
- Rotation start time configuration (startTime)
- Multiple on-call contacts per shift (numberOfOnCalls > 1)
- Recurrence multipliers for extended rotation periods
- Contact creation and channel configuration
These omissions are intentional: the goal is to illustrate how each rotation schedule pattern is wired, not provide drop-in incident management modules. See the SSM ContactsRotation resource reference for all available configuration options.
Let's configure AWS Systems Manager Contacts Rotation
Get started with Pulumi Cloud, then follow our quick setup guide to deploy this infrastructure.
Try Pulumi Cloud for FREEFrequently Asked Questions
Dependencies & Setup
dependsOn ensures proper resource creation order and prevents errors.Recurrence Configuration
dailySettings (specific time each day), weeklySettings (specific days and times each week), or monthlySettings (specific days of month). You must specify exactly one of these three options.dailySettings, monthlySettings, or weeklySettings in the recurrence property.Contact & Shift Management
contactIds determines their shift order in the rotation schedule.Time & Scheduling
startTime field is optional and specifies when the rotation goes into effect. If omitted, the rotation behavior follows AWS defaults for the service.Using a different cloud?
Explore integration guides for other cloud providers: