Skip to main content
Microsoft Planner is a task management application included in Microsoft 365. It allows teams to create plans, organize and assign tasks, share files, and communicate progress, providing a visual way to manage work within Microsoft Teams and other Microsoft 365 apps.

Configuring Microsoft Planner as a Source

In the Sources tab, click on the “Add source” button located on the top right of your screen. Then, select the Microsoft Planner option from the list of connectors. Click Next and you’ll be prompted to add your access.

1. Add account access

You’ll need to authorize Nekt to access your Microsoft Planner data using OAuth. Click on the Microsoft Authorization button and log in with your Microsoft account that has access to the Planner plans you want to sync. The authorization flow will request the following permissions:
  • Access to Microsoft Graph API
  • Read access to Groups and Planner data
Once you’re done authorizing the Nekt application, click Next.
You may need the approval of an administrator to grant the necessary permissions to the Nekt application.If you are not an administrator, you can request the approval from an administrator by clicking on the Request approval button and providing the reason for the approval.The administrator will then need to approve the request by clicking on the Approve button on the Microsoft Entra ID portal.Once the approval is granted, the Nekt application will have the necessary permissions to access your Microsoft Planner data.

2. Select streams

Choose which data streams you want to sync. For faster extractions, select only the streams that are relevant to your analysis.
Tip: The stream can be found more easily by typing its name.
Select the streams and click Next.

3. Configure data streams

Customize how you want your data to appear in your catalog. Select the desired layer where the data will be placed, a folder to organize it inside the layer, a name for each table (which will effectively contain the fetched data) and the type of sync.
  • Layer: choose between the existing layers on your catalog. This is where you will find your new extracted tables as the extraction runs successfully.
  • Folder: a folder can be created inside the selected layer to group all tables being created from this new data source.
  • Table name: we suggest a name, but feel free to customize it. You have the option to add a prefix to all tables at once and make this process faster!
  • Sync Type: FULL_TABLE sync is used for all streams.
Incremental sync is not supported. The Microsoft Planner API does not provide reliable modification timestamps for incremental syncing, so all streams use full table sync.
Once you are done configuring, click Next.

4. Configure data source

Describe your data source for easy identification within your organization, not exceeding 140 characters. To define your Trigger, consider how often you want data to be extracted from this source. This decision usually depends on how frequently you need the new table data updated (every day, once a week, or only at specific times). Optionally, you can define some additional settings:
  • Configure Delta Log Retention and determine for how long we should store old states of this table as it gets updated. Read more about this resource here.
Once you are ready, click Next to finalize the setup.

5. Check your new source

You can view your new source on the Sources page. If needed, manually trigger the source extraction by clicking on the arrow button. Once executed, your data will appear in your Catalog.
For you to be able to see it on your Catalog, you need at least one successful source run.

Streams and Fields

Below you’ll find all available data streams from Microsoft Planner and their corresponding fields:
Stream containing Microsoft 365 groups that can have Planner plans.Key Fields:
  • id - Unique identifier for the group
  • displayName - Group display name
  • description - Group description
  • createdDateTime - When the group was created
Contact Information:
  • mail - Group email address
  • mailNickname - Mail nickname/alias
Settings:
  • visibility - Group visibility (Public or Private)
  • classification - Classification level (e.g., low, medium, high business impact)
  • groupTypes[] - Array of group types (e.g., “Unified” for Microsoft 365 groups)
  • expirationDateTime - When the group is set to expire (if applicable)
Stream containing Planner plans within Microsoft 365 groups.Key Fields:
  • id - Unique identifier for the plan
  • title - Plan title/name
  • createdDateTime - When the plan was created
  • owner - (Deprecated) Owner group ID; use container.containerId instead
Container Information:
  • container.containerId - ID of the group or roster containing the plan
  • container.type - Type of container (e.g., “group”)
  • container.url - URL of the container resource
Created By:
  • createdBy.user.id - ID of the user who created the plan
  • createdBy.user.displayName - Display name of the creator
  • createdBy.application.id - ID of the application used to create the plan
  • createdBy.application.displayName - Application display name
Stream containing buckets (columns) within Planner plans for organizing tasks.Key Fields:
  • id - Unique identifier for the bucket
  • name - Bucket display name (e.g., “To Do”, “In Progress”, “Done”)
  • planId - ID of the plan this bucket belongs to
  • orderHint - Order hint for displaying buckets in list view
Stream containing plan category labels (up to 25 custom labels per plan).Key Fields:
  • id - Plan ID (matches plans.id)
  • category1 through category25 - Custom label names defined for the plan
Labels are stored at the plan level. Tasks reference these labels via appliedCategories (e.g., category1: true means the task has the first label applied).
Stream containing individual tasks within Planner plans.Key Fields:
  • id - Unique identifier for the task
  • title - Task title
  • description - Task description (if hasDescription is true)
  • planId - ID of the plan containing this task
  • bucketId - ID of the bucket (column) this task is in
Status & Progress:
  • percentComplete - Completion percentage (0, 25, 50, 75, or 100)
  • priority - Priority level (0-10, where lower is higher priority)
  • hasDescription - Whether the task has a description
Dates:
  • createdDateTime - When the task was created
  • startDateTime - Task start date
  • dueDateTime - Task due date
  • completedDateTime - When the task was completed
Assignments & Categories:
  • assignments - JSON string of user assignments (user ID → assignment details)
  • appliedCategories - JSON string of applied labels (category1-category25)
Created & Completed By:
  • createdBy.user.id - ID of user who created the task
  • createdBy.user.displayName - Display name of creator
  • completedBy.user.id - ID of user who completed the task
  • completedBy.user.displayName - Display name of completer
Checklist & References:
  • checklistItemCount - Total number of checklist items
  • activeChecklistItemCount - Number of incomplete checklist items
  • referenceCount - Number of external references/attachments
Other Fields:
  • orderHint - Order hint for list view
  • assigneePriority - Order hint for assignee’s task list
  • conversationThreadId - ID of the conversation thread
  • previewType - Task preview type (automatic, noPreview, checklist, description, reference)

Data Model

The following diagram illustrates the relationships between the data streams in Microsoft Planner. Groups contain Plans, which in turn contain Buckets, Tasks, and Labels.

Use Cases for Data Analysis

This guide outlines valuable business intelligence use cases when consolidating Microsoft Planner data, along with ready-to-use SQL queries that you can run on Explorer.

1. Task Completion Overview

Track task completion rates across plans and identify bottlenecks. Business Value:
  • Monitor project progress
  • Identify overdue tasks
  • Track team productivity
WITH task_metrics AS (
    SELECT
        p.title AS plan_name,
        COUNT(*) AS total_tasks,
        SUM(CASE WHEN t.percentComplete = 100 THEN 1 ELSE 0 END) AS completed_tasks,
        SUM(CASE WHEN t.dueDateTime < CURRENT_TIMESTAMP AND t.percentComplete < 100 THEN 1 ELSE 0 END) AS overdue_tasks,
        AVG(t.percentComplete) AS avg_completion
    FROM
        nekt_raw.microsoft_planner_tasks t
        JOIN nekt_raw.microsoft_planner_plans p ON t.planId = p.id
    GROUP BY
        p.title
)
SELECT
    plan_name,
    total_tasks,
    completed_tasks,
    overdue_tasks,
    ROUND(avg_completion, 1) AS avg_completion_pct,
    ROUND(completed_tasks * 100.0 / NULLIF(total_tasks, 0), 1) AS completion_rate_pct
FROM
    task_metrics
ORDER BY
    total_tasks DESC
plan_nametotal_taskscompleted_tasksoverdue_tasksavg_completion_pctcompletion_rate_pct
Q1 Marketing Campaign4532571.171.1
Product Launch 20243828273.773.7
Website Redesign52181234.634.6
Customer Onboarding2320087.087.0

2. Tasks by Bucket (Status Distribution)

Analyze task distribution across buckets to understand workflow status. Business Value:
  • Visualize work-in-progress
  • Identify workflow bottlenecks
  • Balance workload across stages
SELECT
    p.title AS plan_name,
    b.name AS bucket_name,
    COUNT(*) AS task_count,
    SUM(CASE WHEN t.percentComplete = 100 THEN 1 ELSE 0 END) AS completed,
    SUM(CASE WHEN t.percentComplete > 0 AND t.percentComplete < 100 THEN 1 ELSE 0 END) AS in_progress,
    SUM(CASE WHEN t.percentComplete = 0 THEN 1 ELSE 0 END) AS not_started
FROM
    nekt_raw.microsoft_planner_tasks t
    JOIN nekt_raw.microsoft_planner_plans p ON t.planId = p.id
    JOIN nekt_raw.microsoft_planner_buckets b ON t.bucketId = b.id
GROUP BY
    p.title,
    b.name
ORDER BY
    p.title,
    task_count DESC
plan_namebucket_nametask_countcompletedin_progressnot_started
Q1 Marketing CampaignTo Do150312
Q1 Marketing CampaignIn Progress120120
Q1 Marketing CampaignDone181800
Product Launch 2024Backlog8008

3. Overdue Tasks Report

Identify tasks that are past their due date and need attention. Business Value:
  • Prioritize late tasks
  • Track deadline adherence
  • Improve project timeline management
SELECT
    t.title AS task_title,
    p.title AS plan_name,
    b.name AS bucket_name,
    t.dueDateTime AS due_date,
    DATE_DIFF('day', t.dueDateTime, CURRENT_DATE) AS days_overdue,
    t.percentComplete AS percent_complete,
    t.priority
FROM
    nekt_raw.microsoft_planner_tasks t
    JOIN nekt_raw.microsoft_planner_plans p ON t.planId = p.id
    JOIN nekt_raw.microsoft_planner_buckets b ON t.bucketId = b.id
WHERE
    t.dueDateTime < CURRENT_TIMESTAMP
    AND t.percentComplete < 100
ORDER BY
    days_overdue DESC,
    t.priority ASC
LIMIT 20
task_titleplan_namebucket_namedue_datedays_overduepercent_completepriority
Update documentationWebsite RedesignIn Progress2024-11-0126501
Review contractsQ1 Marketing CampaignTo Do2024-11-101703
Design mockupsProduct Launch 2024In Progress2024-11-1512755

Implementation Notes

Stream Hierarchy

The connector extracts data using a parent-child relationship:
  1. Groups are extracted first (Microsoft 365 groups with Planner enabled)
  2. Plans are extracted for each group
  3. Buckets, Labels, and Tasks are extracted for each plan

JSON Fields

Some fields are stored as JSON strings for compatibility with data lake formats:
  • tasks.assignments - Contains user assignment details
  • tasks.appliedCategories - Contains applied label categories
Use JSON_EXTRACT or equivalent functions to parse these fields in your queries.

Priority Values

Task priority is stored as an integer (0-10):
  • 1 = Urgent
  • 3 = Important
  • 5 = Medium (default)
  • 9 = Low

Percent Complete Values

Microsoft Planner uses specific values for completion percentage:
  • 0 = Not started
  • 25 = Started
  • 50 = Halfway
  • 75 = Almost done
  • 100 = Completed

Permissions Note

The connector only extracts data from Microsoft 365 groups that the authenticated user has access to. To extract data from all groups in an organization, ensure the account has appropriate permissions or use an admin account.