Keeping up with your team’s connection requests can be challenging, especially as you increase your team size or the number of connection opportunities your team oversees. Having one place where supervisors can see how well their team members are keeping up with their ministry or administrative tasks can help ensure that everyone stays on the same page and provides support where it's needed most. One way to get insights into your team’s connection requests is by leveraging a group structure, a Dynamic Data report, and some fancy code to bring all the pieces together. 


Please Note: This recipe was created after giving a short presentation at the Rock Conference 2022. Follow the hyperlink for a high-level overview of what is being documented here. 


The First Piece:

Using groups to support a hierarchy of direct reports within a team and between teams.


We decided to create a new group type to accommodate this report. But depending on how you are already using your Organization Unit group type, you may opt to build this out within that group type.

To support direct reports within a team, you will need to build out the roles in your group type's settings. You will likely want at least these three basic roles:

  • Supervisor (Leader)
  • Staff
  • Volunteer

Group_Type_Roles.png

We have opted to include actual volunteer positions within our group type roles so we are expanding the potential roles we can select from for other projects not related to this report.

  • Within the report’s code there is logic looking for “Supervisors” (Leaders) and it will allow “Supervisors” to see all other group member’s Connection Requests.

To support our hierarchy of teams in relation to other teams we simply used the parent/child group structure to our advantage.

  • Within the report’s code there is logic looking at the hierarchy of groups. If a person is a supervisor of a team and there are child groups (sub-teams) underneath the team they supervise, then they will also be able to see all of the connection requests assigned to their team and all sub-team members.

Group_Structure.png

The Second Piece:

Using group type attributes to link groups together outside of the direct hierarchy to support indirect overseers.


We have a Campus Support office that does not directly oversee our teams but may need to see how connection requests are spread across their teams across multiple campuses.

To support our indirect hierarchy of teams, we created a Group Attribute (at the group type level) called “Campus Support Supervisor Group” that allows us to select another group as “above” the group we are setting the attribute for.

  • Within the report’s code there is logic looking for the group placed in this attribute. If there is a group in this attribute, whoever is a Supervisor (Leader) of the group in the attribute will be able to see all the connection requests associated with the members in that group.

Indirect_group_link.png  Screenshot_2022-09-23_165306.png Group_Attribute_Settings.png


The Third Piece:

Building the report.


With those things set up, you can then build the report. We worked with our partner BEMA to get this code right. Also, I am not a programmer. So, I am going to drop the code below, but I am not sure what all needs to be adjusted to work properly in your context. There are some obvious things like attribute IDs, root group IDs, etc. 

Here is a picture of what the report looks like:

CR_REport.png


Below is a picture of the Page Parameters and how we set them up to work with the report:

Page_FIlters.png

Connector: Multi-Select, Enhanced for Long Lists, Default Value is All

DECLARE @CurrentPersonId int = {{ CurrentPerson.Id | ToString | Default:'0' }}

DECLARE @CentralGroupAttributeId int = 17445
DECLARE @RootGroupId int = 159244
;WITH AllGroups as (
 SELECT
  *
 FROM
  [Group] g
 Where
  g.Id = @RootGroupId
 UNION ALL
 SELECT
  g.*
 FROM [Group] g
  JOIN AllGroups ag
   ON ag.Id = g.ParentGroupId
), GroupMembers as (
 -- Current Person
 SELECT
  r.IsLeader
  , m.*
 FROM AllGroups g
  JOIN GroupMember m
   ON m.GroupId = g.Id
  JOIN GroupTypeRole r
   ON r.Id = m.GroupRoleId
 WHERE
  m.PersonId = @CurrentPersonId
  AND m.GroupMemberStatus = 1
  AND m.IsArchived = 0
 UNION All
 -- Central Group
 SELECT
  gm.IsLeader
  , m.*
 FROM GroupMembers gm
  Join [Group] g
   ON g.Id = gm.GroupId
  JOIN AttributeValue av
   ON g.[Guid] = Try_Cast( av.[Value] as uniqueidentifier )
   And av.AttributeId = @CentralGroupAttributeId
  JOIN GroupMember m
   ON m.GroupId = av.EntityId
 WHERE
  m.GroupMemberStatus = 1
  AND m.IsArchived = 0
  AND gm.IsLeader = 1
 -- Children Group Members
 UNION ALL
 SELECT
  gm.IsLeader
  , m.*
 FROM GroupMembers gm
  JOIN [Group] g
   ON g.ParentGroupId = gm.GroupId
  JOIN GroupMember m
   ON m.GroupId = g.Id
 WHERE
  m.GroupMemberStatus = 1
  AND m.IsArchived = 0
  AND gm.IsLeader = 1
 UNION ALL
 -- Group Members
 SELECT
  gm.IsLeader
  , m.*
 FROM GroupMembers gm
  JOIN GroupMember m
   ON m.GroupId = gm.GroupId
   AND gm.PersonId != m.PersonId
 WHERE
  m.GroupMemberStatus = 1
  AND m.IsArchived = 0
  AND gm.IsLeader = 1
  AND gm.PersonId = @CurrentPersonId
)
SELECT DISTINCT
 [Value] = p.Id
 , [Text] = p.FirstName + ' ' + p.LastName
FROM
 GroupMembers m
 Join Person p
  ON p.Id = m.PersonId
UNION
SELECT
 0
 , 'All'
Order by
 [Text]


State: Multi-Select, Values -

0^Active,
1^Inactive,
2^Future Follow Up,
3^Connected


Only Past Due:  Boolean, True Text = Yes, Falso Text = No, Control Type = Checkbox, Default Value = checked


Request Date, Last Modified Date, Last Activity Date: Thes dates are all basic date ranges.


Below is the code we used on the report. Also, there are the settings used for the Dynamic Data Block:

Dynamic_Data_Block_Settings.png

DECLARE @CurrentPersonId int = {{ CurrentPerson.Id | Default:'0' }}
/*********************************************************/
-- Lava Filters
/*********************************************************/
DECLARE @ConnectorPersonIds nvarchar(max) = '{{ 'Global' | PageParameter:'Connector' | ToString | Default:'0' | SanitizeSql }}'
DECLARE @States nvarchar(11) = '{{ 'Global' | PageParameter:'State' | ToString | Default:'0,2' | SanitizeSql }}' 
DECLARE @Statuses nvarchar(max) = '-1' --'{{ 'Global' | PageParameter:'Status' | Default:'-1' | SanitizeSql }}'
DECLARE @OnlyPastDue nvarchar(10) = '{{ 'Global' | PageParameter:'OnlyPastDue' | Default:'True' | SanitizeSql }}'
DECLARE @RequestStartDate date = Try_Cast('{{ 'Global' | PageParameter:'RequestDate' | ToString | Split:',' | First | Default:'1900-1-1' | SanitizeSql }}' as Date )
DECLARE @RequestEndDate date = Try_Cast('{{ 'Global' | PageParameter:'RequestDate' | ToString | Split:',' | Last | Default:'9999-1-1' | SanitizeSql }}' as Date )
DECLARE @ModifiedStartDate date = Try_Cast('{{ 'Global' | PageParameter:'LastModifiedDate' | ToString | Split:',' | First | Default:'1900-1-1' | SanitizeSql }}' as Date )
DECLARE @ModifiedEndDate date = Try_Cast('{{ 'Global' | PageParameter:'LastModifiedDate' | ToString | Split:',' | Last | Default:'9999-1-1' | SanitizeSql }}' as Date )
DECLARE @LastActivityStartDate date = Try_Cast('{{ 'Global' | PageParameter:'LastActivityDate' | ToString | Split:',' | First | Default:'1900-1-1' | SanitizeSql }}' as Date )
DECLARE @LastActivityEndDate date = Try_Cast('{{ 'Global' | PageParameter:'LastActivityDate' | ToString | Split:',' | Last | Default:'9999-1-1' | SanitizeSql }}' as Date )
/*********************************************************/
DECLARE @RootGroupId int = 159244
DECLARE @CentralGroupAttributeId int = 17445
DECLARE @Today Date = GetDate()
;WITH AllGroups as (
 SELECT
  *
 FROM
  [Group] g
 Where
  g.Id = @RootGroupId
 UNION ALL
 SELECT
  g.*
 FROM [Group] g
  JOIN AllGroups ag
   ON ag.Id = g.ParentGroupId
), GroupMembers as (
 -- Current Person
 SELECT
  r.IsLeader
  , m.*
 FROM AllGroups g
  JOIN GroupMember m
   ON m.GroupId = g.Id
  JOIN GroupTypeRole r
   ON r.Id = m.GroupRoleId
 WHERE
  m.PersonId = @CurrentPersonId
  AND m.GroupMemberStatus = 1
  AND m.IsArchived = 0
 UNION All
 -- Central Group
 SELECT
  gm.IsLeader
  , m.*
 FROM GroupMembers gm
  Join [Group] g
   ON g.Id = gm.GroupId
  JOIN AttributeValue av
   ON g.[Guid] = Try_Cast( av.[Value] as uniqueidentifier )
   And av.AttributeId = @CentralGroupAttributeId
  JOIN GroupMember m
   ON m.GroupId = av.EntityId
 WHERE
  m.GroupMemberStatus = 1
  AND m.IsArchived = 0
  AND gm.IsLeader = 1
 -- Children Group Members
 UNION ALL
 SELECT
  gm.IsLeader
  , m.*
 FROM GroupMembers gm
  JOIN [Group] g
   ON g.ParentGroupId = gm.GroupId
  JOIN GroupMember m
   ON m.GroupId = g.Id
 WHERE
  m.GroupMemberStatus = 1
  AND m.IsArchived = 0
  AND gm.IsLeader = 1
 UNION ALL
 -- Group Members
 SELECT
  gm.IsLeader
  , m.*
 FROM GroupMembers gm
  JOIN GroupMember m
   ON m.GroupId = gm.GroupId
   AND gm.PersonId != m.PersonId
 WHERE
  m.GroupMemberStatus = 1
  AND m.IsArchived = 0
  AND gm.IsLeader = 1
  AND gm.PersonId = @CurrentPersonId
), LatestActivities as (
 Select
  ConnectionRequestId
  , cra.CreatedDateTime
  , Activity = cat.[Name]
  , Note = cra.Note
  , rn = Row_Number() Over ( Partition by ConnectionRequestId Order by cra.CreatedDateTime Desc )
 From
  ConnectionRequestActivity cra
  Join ConnectionActivityType cat
   ON cat.Id = cra.ConnectionActivityTypeId
)
SELECT Distinct
 cr.Id
 , cr.ConnectionOpportunityId
 , Idle = CASE WHEN DateDiff(Day, la.CreatedDateTime, @Today ) > ct.DaysUntilRequestIdle 
    THEN N'
<div class="board-card-pills">
 <span class="board-card-pill badge-danger js-legend-badge" data-toggle="tooltip" data-original-title="Idle (no activity in ' 
 + Format( ct.DaysUntilRequestIdle, '#' )
 + ' days)">
  <span class="sr-only">Idle (no activity in ' 
 + Format( ct.DaysUntilRequestIdle, '#' )
 + ' days)</span>
 </span>
</div>'
    ELSE '' END
 , [Connector] = cp.FirstName + ' ' + cp.LastName 
 , [Ministry] = g.[Name]
 , [Name] = p.NickName + ' ' + p.LastName
 , [Opportunity] = co.[Name]
 , [Campus] = c.[Name]
 , [LastActivity] = la.Activity + '(' + Format( la.CreatedDateTime, 'M/d/yyyy' ) + ')'
 , [State] = 
  CASE cr.[ConnectionState]
   WHEN 0 THEN 'Active'
   WHEN 1 THEN 'Inactive'
   WHEN 2 THEN 'Future Follow Up (' + Format( cr.FollowUpDate, 'M/d/yyyy' ) + ')'
   WHEN 3 THEN 'Connected'
  END
 , [Status] = cs.[Name]
 , [Resolution] = av.[Value]
 , g.Id as GroupId
    , cp.Id as ConnectorPersonId
    , [Link] = '<a href="https://rock.visitgracechurch.com/page/1149?ConnectionOpportunityId=' + Cast( co.Id as varchar(11)) + '&ConnectionRequestId=' + Cast( cr.Id as varchar(11)) + '" target="_blank"><i class="fa fa-plug"></i></a>'
FROM
 ConnectionRequest cr
 JOIN ConnectionOpportunity co
  ON co.Id = cr.ConnectionOpportunityId
 JOIN ConnectionType ct
  ON ct.Id = co.ConnectionTypeId
 Left Join Attribute A
     ON a.EntityTypeQualifierColumn = 'ConnectionTypeId' and a.[Key] = 'Resolution' and Try_Cast( a.EntityTypeQualifierValue as int ) = ct.Id
 Left JOIN AttributeValue av
     ON av.EntityId = cr.Id and av.AttributeId = a.Id
 JOIN PersonAlias cpa
  ON cpa.Id = cr.ConnectorPersonAliasId
 JOIN GroupMembers m
  ON m.PersonId = cpa.PersonId
 JOIN PersonAlias pa
  ON pa.Id = cr.PersonAliasId
 JOIN Person p
  ON p.Id = pa.PersonId
 LEFT JOIN Campus c
  ON c.Id = cr.CampusId
 JOIN Person cp
  ON cp.Id = cpa.PersonId
 JOIN ConnectionStatus cs
  ON cs.Id = cr.ConnectionStatusId
 Join [Group] g
  ON g.Id = m.GroupId
 LEFT JOIN LatestActivities la
  ON la.ConnectionRequestId = cr.Id
  AND la.rn = 1
 JOIN String_Split( @States, ',' ) s1f
  ON s1f.[Value] = '-1'
  OR Try_Cast( s1f.[Value] as int ) = cr.ConnectionState
  AND (
   cr.ConnectionState != 2
   OR ( cr.ConnectionState = 2
    AND ( @OnlyPastDue = 'False'
     OR ( @OnlyPastDue = 'True'
      AND cr.FollowUpDate <= @Today ) ) ) )
 JOIN String_Split ( @Statuses,',' ) s2f
  ON s2f.[Value] = '-1'
  OR s2f.[Value] = cs.[Name]
 JOIN String_Split( @ConnectorPersonIds,',') cf
  ON cf.[Value] = '0'
  OR Try_Cast( cf.[Value] as int ) = cp.Id
WHERE
    Cast( cr.CreatedDateTime as date ) >= @RequestStartDate
    AND Cast( cr.CreatedDateTime as date ) <= @RequestEndDate
    AND Cast( cr.ModifiedDateTime as date ) >= @ModifiedStartDate
    AND Cast( cr.ModifiedDateTime as date ) <= @ModifiedEndDate
    AND ( la.CreatedDateTime is null 
        OR (
            Cast( la.CreatedDateTime as date ) >= @LastActivityStartDate
            AND Cast( la.CreatedDateTime as date ) <= @LastActivityEndDate ) )
Order By 
    g.Id
    , cp.Id
    , cr.ConnectionOpportunityId


That should be everything you need to to jumpstart your own report. The other part of the presentation focused on the email we sent out to make the report more useful for Team Leaders.


The Email:


Part 1:  Group Sync 

We created a Data View that would pull all Supervisors into one group. 

DV.png


Part 2: Workflow 

We created a Workflow to send an email to that group. It piggybacks off the code we used in the report to show how many Connection Requests the Team is currently holding.

WF1.png

WF2.png


Here is the code used in the email:

{% sql %}
DECLARE @CurrentPersonId int = {{ Person.Id | Default:'0' }}; 
DECLARE @ConnectorPersonIds nvarchar(max) = '0'
DECLARE @States nvarchar(11) = '0,2' 
DECLARE @Statuses nvarchar(max) = '-1'
DECLARE @OnlyPastDue nvarchar(10) = 'true'
DECLARE @RequestStartDate date = Try_Cast('1900-01-01' as Date )
DECLARE @RequestEndDate date = Try_Cast('9999-01-01' as Date )
DECLARE @ModifiedStartDate date = Try_Cast('1900-01-01' as Date )
DECLARE @ModifiedEndDate date = Try_Cast('9999-01-01' as Date )
DECLARE @LastActivityStartDate date = Try_Cast('1900-01-01' as Date )
DECLARE @LastActivityEndDate date = Try_Cast('9999-01-01' as Date )
/*********************************************************/
DECLARE @RootGroupId int = 159244
DECLARE @CentralGroupAttributeId int = 17445
DECLARE @Today Date = GetDate()
;WITH AllGroups as (
 SELECT
  *
 FROM
  [Group] g
 Where
  g.Id = @RootGroupId
 UNION ALL
 SELECT
  g.*
 FROM [Group] g
  JOIN AllGroups ag
   ON ag.Id = g.ParentGroupId
), GroupMembers as (
 -- Current Person
 SELECT
  r.IsLeader
  , m.*
 FROM AllGroups g
  JOIN GroupMember m
   ON m.GroupId = g.Id
  JOIN GroupTypeRole r
   ON r.Id = m.GroupRoleId
 WHERE
  m.PersonId = @CurrentPersonId
  AND m.GroupMemberStatus = 1
  AND m.IsArchived = 0
 UNION All
 -- Central Group
 SELECT
  gm.IsLeader
  , m.*
 FROM GroupMembers gm
  Join [Group] g
   ON g.Id = gm.GroupId
  JOIN AttributeValue av
   ON g.[Guid] = Try_Cast( av.[Value] as uniqueidentifier )
   And av.AttributeId = @CentralGroupAttributeId
  JOIN GroupMember m
   ON m.GroupId = av.EntityId
 WHERE
  m.GroupMemberStatus = 1
  AND m.IsArchived = 0
  AND gm.IsLeader = 1
 -- Children Group Members
 UNION ALL
 SELECT
  gm.IsLeader
  , m.*
 FROM GroupMembers gm
  JOIN [Group] g
   ON g.ParentGroupId = gm.GroupId
  JOIN GroupMember m
   ON m.GroupId = g.Id
 WHERE
  m.GroupMemberStatus = 1
  AND m.IsArchived = 0
  AND gm.IsLeader = 1
 UNION ALL
 -- Group Members
 SELECT
  gm.IsLeader
  , m.*
 FROM GroupMembers gm
  JOIN GroupMember m
   ON m.GroupId = gm.GroupId
   AND gm.PersonId != m.PersonId
 WHERE
  m.GroupMemberStatus = 1
  AND m.IsArchived = 0
  AND gm.IsLeader = 1
  AND gm.PersonId = @CurrentPersonId
), LatestActivities as (
 Select
  ConnectionRequestId
  , cra.CreatedDateTime
  , Activity = cat.[Name]
  , Note = cra.Note
  , rn = Row_Number() Over ( Partition by ConnectionRequestId Order by cra.CreatedDateTime Desc )
 From
  ConnectionRequestActivity cra
  Join ConnectionActivityType cat
   ON cat.Id = cra.ConnectionActivityTypeId
)
SELECT Distinct

    [Status] = Case When cs.IsCritical = 1 then 'Critical'
                      When cr.[ConnectionState] = 0 and DateDiff(Day, cr.CreatedDateTime, @Today) <= 7 then 'New'
                      When ( (cr.[ConnectionState] = 0 or (cr.[ConnectionState] = 2 and cr.FollowupDate < @Today) )
                             and ( ( la.CreatedDateTime is not null and DateDiff(Day, la.CreatedDateTime, @Today ) > ct.DaysUntilRequestIdle )
                                or ( la.CreatedDateTime is null and DateDiff(Day, cr.CreatedDateTime, @Today) > ct.DaysUntilRequestIdle ) ) ) then 'Idle'
                      When cr.[ConnectionState] = 0 or cr.[ConnectionState] = 2 Then 'Active'
                      End 
    , Count(cr.Id) as [Count]
FROM
 ConnectionRequest cr
 JOIN ConnectionOpportunity co
  ON co.Id = cr.ConnectionOpportunityId
 JOIN ConnectionType ct
  ON ct.Id = co.ConnectionTypeId
 JOIN PersonAlias cpa
  ON cpa.Id = cr.ConnectorPersonAliasId
 JOIN GroupMembers m
  ON m.PersonId = cpa.PersonId
 JOIN PersonAlias pa
  ON pa.Id = cr.PersonAliasId
 JOIN Person p
  ON p.Id = pa.PersonId
 LEFT JOIN Campus c
  ON c.Id = cr.CampusId
 JOIN Person cp
  ON cp.Id = cpa.PersonId
 JOIN ConnectionStatus cs
  ON cs.Id = cr.ConnectionStatusId
 Join [Group] g
  ON g.Id = m.GroupId
 LEFT JOIN LatestActivities la
  ON la.ConnectionRequestId = cr.Id
  AND la.rn = 1
 JOIN String_Split( @States, ',' ) s1f
  ON s1f.[Value] = '-1'
  OR Try_Cast( s1f.[Value] as int ) = cr.ConnectionState
  AND (
   cr.ConnectionState != 2
   OR ( cr.ConnectionState = 2
    AND ( @OnlyPastDue = 'False'
     OR ( @OnlyPastDue = 'True'
      AND cr.FollowUpDate <= @Today ) ) ) )
 JOIN String_Split ( @Statuses,',' ) s2f
  ON s2f.[Value] = '-1'
  OR s2f.[Value] = cs.[Name]
 JOIN String_Split( @ConnectorPersonIds,',') cf
  ON cf.[Value] = '0'
  OR Try_Cast( cf.[Value] as int ) = cp.Id
Group by Case When cs.IsCritical = 1 then 'Critical'
                      When cr.[ConnectionState] = 0 and DateDiff(Day, cr.CreatedDateTime, @Today) <= 7 then 'New'
                      When ( (cr.[ConnectionState] = 0 or (cr.[ConnectionState] = 2 and cr.FollowupDate < @Today) )
                             and ( ( la.CreatedDateTime is not null and DateDiff(Day, la.CreatedDateTime, @Today ) > ct.DaysUntilRequestIdle )
                                or ( la.CreatedDateTime is null and DateDiff(Day, cr.CreatedDateTime, @Today) > ct.DaysUntilRequestIdle ) ) ) then 'Idle'
                      When cr.[ConnectionState] = 0 or cr.[ConnectionState] = 2 Then 'Active'
                      End 
{% endsql %}
{% assign totalNewRequests = results | Where:'Status','New' | First | Property:'Count' | Default:'0' | AsInteger %}
{% assign totalActiveRequests = results | Where:'Status','Active' | First | Property:'Count' | Default:'0' | AsInteger %}
{% assign totalCriticalRequests = results | Where:'Status','Critical' | First | Property:'Count' | Default:'0' | AsInteger %}
{% assign totalIdleRequests = results | Where:'Status','Idle' | First | Property:'Count' | Default:'0' | AsInteger %}
{% assign totalRequests = totalActiveRequests | Plus:totalCriticalRequests | Plus:totalIdleRequests | Plus:totalNewRequests %}
{{ 'Global' | Attribute:'EmailHeader' }} 
<br/><br/>
Hello&nbsp;{{ Person.NickName }},
<br/><br/>
You are receiving this email because you supervise someone other than yourself. 
<br/><br/>
Please! Click on the link below so you can utilize this report to see all connection requests for folks you supervise.
<br/><br/>
<center>
    <a class="button-link" title="Connection Report" href="https://rock.visitgracechurch.com/page/1231" target="_blank" style="display: inline-block; font-weight: bold; letter-spacing: normal; line-height: 100%; text-align: center; text-decoration: none; color: rgb(255, 255, 255); background-color: rgb(14, 114, 186); padding: 15px; border: 1px solid rgb(14, 114, 186); border-radius: 3px;">
        Connection Report
    </a>
</center>
<br/><br/>
<h3>Your Team's Active Connection Requests</h3>
<br/><br/>
    <table width='100%'>
        <tr>
            <td align='center' width='25%' style='border-right: 3px solid #FFF;background: #88bb54; text-align:center; color: #fff; font-family: sans-serif; padding-top:20px;'>
                <h1 style='color: #fff; margin-top: 20px; font-family: sans-serif;'>
                    {{totalNewRequests}}
                </h1>
                New
            </td>
            <td align='center' width='25%' style='border-right: 3px solid #FFF;background: #4099ad; text-align:center; color: #fff; font-family: sans-serif; padding-top:20px;'>
                <h1 style='color: #fff; margin-top: 20px; font-family: sans-serif;'>
                    {{totalRequests}}
                </h1>
                Active
            </td>
            <td align='center' width='25%' style='border-right: 3px solid #FFF;background: #ee7624; text-align:center; color: #fff; font-family: sans-serif; padding-top:20px;'>
                <h1 style='color: #fff; margin-top: 20px; font-family: sans-serif;'>
                    {{totalCriticalRequests}}
                </h1>
                Critical    
            </td>
            <td align='center' width='25%' style='background: #bb5454; text-align:center; color: #fff; font-family: sans-serif; padding-top:20px;'>
                <h1 style='color: #fff; margin-top: 20px; font-family: sans-serif;'>
                    {{totalIdleRequests}}
                </h1>
                Idle
            </td>
        </tr>
    </table>
    
<br/><br/>
Have a wonderful day.
<br/><br/>
{{ 'Global' | Attribute:'EmailFooter' }}


Part 3: The Job

Lastly we set up a Job to launch the workflow.

Job.png



That should cover everything mentioned in the presentation. Please make sure you look over all the code and customize it suit your instance.