AI Reference
This document is a complete reference for generating event schedules that can be imported into the Apportunity: Event Planner app for Confluence and Jira.
Use this document as context when asking an AI assistant (Claude, Gemini, ChatGPT, etc.) to generate a schedule:
Here is the reference: [link to this page]. Create an Event Planner schedule for [your task].
App Overviewβ
Event Planner is available as two separate Atlassian Marketplace products:
- Apportunity: Event Planner for Confluence β a calendar macro on any Confluence page.
- Apportunity: Event Planner for Jira β a calendar on a Jira work item panel or Dashboard gadget.
Both apps use the same schedule format described below. Instead of clicking through the calendar to add events one at a time, you can describe an event β a training day, an onboarding plan, a multi-day retreat, a release schedule β to an AI assistant and get back a single JSON object that recreates the whole thing at once.
JSON import is rolling out across Event Planner. If you don't see an Import option in your version of the app yet, contact the support portal β or hand the generated JSON to whoever administers your Event Planner instance.
How It Worksβ
- Ask your AI assistant to generate a schedule using the reference in this document.
- The AI returns a single JSON object β a schedule template β describing every event, relative to a "Day 0".
- Import that JSON into Event Planner and choose a real start date. The app maps
dayNumber: 0to that date,dayNumber: 1to the day after, and so on, and creates one calendar event per entry.
This relative-day design means the same generated schedule can be reused for any future date β a "2-day onboarding" template works whether you start it next Monday or three months from now.
Schedule Formatβ
A schedule template is a single JSON object with this shape:
interface EventsTemplate {
id: string;
title: string;
description: string;
category: string;
events: TemplateEvent[];
dayHeaders?: TemplateDayHeader[];
options?: Partial<ViewOptions>;
}
interface TemplateEvent {
dayNumber: number;
timeStart: string; // "HH:mm", 24-hour
timeEnd: string; // "HH:mm", 24-hour
title: string;
description: string;
isAllDay?: boolean; // default: false
backgroundColor: string; // any valid CSS color
}
interface TemplateDayHeader {
dayNumber: number;
text: string;
}
interface ViewOptions {
businessHoursStart: string; // "HH:mm"
businessHoursEnd: string; // "HH:mm"
slotDuration: string; // "HH:mm:ss"
isShowWeekends: boolean;
startOfTheWeek: string; // "0" = Sunday, "1" = Monday, ...
}
Top-level fieldsβ
| Field | Type | Required | Notes |
|---|---|---|---|
id | string | Yes | Unique, kebab-case slug, e.g. "team-building-retreat". |
title | string | Yes | Name of the schedule, shown when selecting it for import. |
description | string | Yes | One or two sentences summarizing the plan. |
category | string | Yes | Free-text label, e.g. "training", "onboarding", "team-building". Used as a display tag only β it does not affect import. |
events | TemplateEvent[] | Yes | One entry per calendar event. See below. |
dayHeaders | TemplateDayHeader[] | No | One label per day, shown above the calendar on multi-day schedules. Recommended whenever a schedule spans more than one day. |
options | Partial<ViewOptions> | No | Calendar display preferences applied on import. Omit fields you don't need to set. |
events[] fieldsβ
| Field | Type | Required | Notes |
|---|---|---|---|
dayNumber | number | Yes | 0-based day offset from the import start date. 0 is the first day of the schedule. |
timeStart | string | Yes | 24-hour HH:mm, e.g. "09:30". No date component β the day comes from dayNumber. |
timeEnd | string | Yes | Same format as timeStart. Must be later than timeStart on the same day β see Rules below. |
title | string | Yes | Shown on the calendar tile. Keep it short. |
description | string | Yes | Shown when the event is opened. Can be longer free text, or "" if not needed. |
isAllDay | boolean | No | Defaults to false. timeStart/timeEnd are still required even when true β they're used to order and size the event on the calendar. |
backgroundColor | string | Yes | Any valid CSS color (hex recommended). See Choosing Colors. |
dayHeaders[] fieldsβ
| Field | Type | Required | Notes |
|---|---|---|---|
dayNumber | number | Yes | Same 0-based offset used in events[]. |
text | string | Yes | Short label shown above that day, e.g. "Day 1: Foundations". |
options fieldsβ
All fields are optional β only include the ones you want to override.
| Field | Type | Default | Notes |
|---|---|---|---|
businessHoursStart | string (HH:mm) | "09:00" | Start of the highlighted business-hours band. Set to roughly match the schedule's earliest event. |
businessHoursEnd | string (HH:mm) | "17:00" | End of the highlighted business-hours band. Set to roughly match the schedule's latest event. |
slotDuration | string (HH:mm:ss) | "00:30:00" | Calendar grid resolution. Use "00:15:00" for tightly packed agendas, "00:30:00" or "01:00:00" for sparser ones. |
isShowWeekends | boolean | true | Set to false for work-week-only schedules. |
startOfTheWeek | string | "0" | "0" = Sunday, "1" = Monday. Rarely needs to be set. |
Choosing Colorsβ
backgroundColor accepts any valid CSS color. Pick a small, consistent palette and reuse it to group similar event types (breaks, sessions, meals) β don't assign every event a unique color.
Suggested palette:
| Color | Hex | Good for |
|---|---|---|
| Gray | #6B778C | Breaks, meals, logistics |
| Blue | #4C9AFF | Core sessions, main agenda items |
| Green | #36B37E | Workshops, hands-on activities |
| Purple | #998DD9 | Discussions, reflection, planning |
| Orange | #FFAB00 | Optional/social events |
| Red | #FF5630 | Critical or time-sensitive items |
Examplesβ
Example 1: Single-day scheduleβ
{
"id": "sprint-retro-half-day",
"title": "Sprint Retrospective Half-Day",
"description": "A focused half-day session to review the sprint, celebrate wins, and plan improvements for the next cycle.",
"category": "team-building",
"options": {
"businessHoursStart": "09:00",
"businessHoursEnd": "13:00",
"slotDuration": "00:30:00"
},
"events": [
{
"dayNumber": 0,
"timeStart": "09:00",
"timeEnd": "09:15",
"title": "Welcome & Coffee",
"description": "Informal start while everyone settles in.",
"backgroundColor": "#6B778C"
},
{
"dayNumber": 0,
"timeStart": "09:15",
"timeEnd": "10:30",
"title": "Sprint Review",
"description": "Walk through completed work and demo key deliverables.",
"backgroundColor": "#4C9AFF"
},
{
"dayNumber": 0,
"timeStart": "10:30",
"timeEnd": "10:45",
"title": "Break",
"description": "",
"backgroundColor": "#6B778C"
},
{
"dayNumber": 0,
"timeStart": "10:45",
"timeEnd": "12:15",
"title": "Retrospective Discussion",
"description": "What went well, what didn't, and what to change next sprint.",
"backgroundColor": "#36B37E"
},
{
"dayNumber": 0,
"timeStart": "12:15",
"timeEnd": "13:00",
"title": "Action Planning",
"description": "Agree on concrete improvements to carry into the next sprint.",
"backgroundColor": "#998DD9"
}
]
}
Example 2: Multi-day schedule with day headersβ
{
"id": "new-manager-bootcamp",
"title": "New Manager Bootcamp",
"description": "A 2-day program to prepare newly promoted managers for their first leadership role, covering communication, delegation, and feedback.",
"category": "training",
"options": {
"businessHoursStart": "09:00",
"businessHoursEnd": "17:00",
"slotDuration": "00:30:00"
},
"dayHeaders": [
{ "dayNumber": 0, "text": "Day 1: Communication & Delegation" },
{ "dayNumber": 1, "text": "Day 2: Feedback & Performance" }
],
"events": [
{
"dayNumber": 0,
"timeStart": "09:00",
"timeEnd": "09:30",
"title": "Welcome & Introductions",
"description": "",
"backgroundColor": "#6B778C"
},
{
"dayNumber": 0,
"timeStart": "09:30",
"timeEnd": "12:00",
"title": "Effective Communication for New Managers",
"description": "Active listening, setting expectations, and running productive 1:1s.",
"backgroundColor": "#4C9AFF"
},
{
"dayNumber": 0,
"timeStart": "12:00",
"timeEnd": "13:00",
"title": "Lunch",
"description": "",
"backgroundColor": "#6B778C"
},
{
"dayNumber": 0,
"timeStart": "13:00",
"timeEnd": "17:00",
"title": "Delegation Workshop",
"description": "Practice delegating tasks using a structured handoff framework.",
"backgroundColor": "#36B37E"
},
{
"dayNumber": 1,
"timeStart": "09:00",
"timeEnd": "09:30",
"title": "Day 2 Kickoff",
"description": "Recap of Day 1 takeaways.",
"backgroundColor": "#6B778C"
},
{
"dayNumber": 1,
"timeStart": "09:30",
"timeEnd": "12:00",
"title": "Giving and Receiving Feedback",
"description": "Frameworks for constructive feedback conversations.",
"backgroundColor": "#4C9AFF"
},
{
"dayNumber": 1,
"timeStart": "12:00",
"timeEnd": "13:00",
"title": "Lunch",
"description": "",
"backgroundColor": "#6B778C"
},
{
"dayNumber": 1,
"timeStart": "13:00",
"timeEnd": "16:00",
"title": "Performance Conversations Role-Play",
"description": "Practice handling common performance review scenarios.",
"backgroundColor": "#36B37E"
},
{
"dayNumber": 1,
"timeStart": "16:00",
"timeEnd": "17:00",
"title": "Closing & Personal Action Plan",
"description": "Each participant commits to three concrete changes for their first 30 days.",
"backgroundColor": "#998DD9"
}
]
}
Rules for Generating Good Schedulesβ
- Output a single JSON object only, wrapped in a ```json code block. No comments, no trailing commas β standard JSON only.
dayNumberis relative, not an absolute date. Never compute or include actual calendar dates β the import step anchorsdayNumber: 0to whatever start date the user picks.- One event cannot span multiple days. Each event lives entirely within a single
dayNumber. For a multi-day item (e.g. a 3-day conference pass), either create one event per day, or use a singledayHeadersentry per day and short events underneath instead. - Don't cross midnight within one event. An event with
timeStart: "22:00"andtimeEnd: "00:30"on the samedayNumberis invalid β the end time would be interpreted as earlier than the start time on the same day. Split it into two events on consecutivedayNumbers instead. timeEndmust be aftertimeStart. Back-to-back events should share a boundary time (one event'stimeEndequals the next event'stimeStart) rather than overlapping.- Always add
dayHeadersfor schedules spanning more than one day. One header perdayNumber, with a short descriptive label. - Keep
optionsminimal. Only setbusinessHoursStart,businessHoursEnd, andslotDurationto roughly match the schedule's actual time range and density. Leave other fields out entirely rather than guessing values for them. - Reuse a small color palette. Group similar event types (breaks, core sessions, workshops) under the same color rather than assigning a unique color to every event β see Choosing Colors.
- Keep
titleshort anddescriptioninformative. Titles render on small calendar tiles; put the detail indescription. - Validate before returning. Check every event has both
timeStartandtimeEnd, everydayNumberreferenced ineventsmakes sense relative to anydayHeaders, and the JSON parses cleanly.