Available Email Templates - SailPoint Identity Services

Hi @stacy_stough, yes, on production (different tenants as well).

The used URL by ISC is https://TENANT.api.identitynow.com/beta/notification-template-defaults?limit=250&offset=0&count=true&filters=medium%20eq%20"EMAIL"

This is the response:

[
   {
      "medium":"EMAIL",
      "key":"cloud_manual_work_item_summary",
      "name":"Pending Task Daily Digest",
      "description":"If enabled sent to users daily when they have incomplete tasks in their Task Manager.",
      "locale":"en",
      "subject":"#set($numberOfPendingTasks \u003d $__numberTool.integer($numberOfPendingTasks))#set($taskTasks \u003d \"#if($numberOfPendingTasks \u003d\u003d 1)task#{else}tasks#end\")\nYou have $numberOfPendingTasks $taskTasks to complete in ${__global.productName}.",
      "header":null,
      "body":"Dear $__recipient.name,\u003cbr/\u003e\u003cbr/\u003e#set($numberOfPendingTasks \u003d $__numberTool.integer($numberOfPendingTasks))\n#set($isAre \u003d \"#if( $numberOfPendingTasks \u003d\u003d 1)is#{else}are#end\")\n#set($taskTasks \u003d \"#if( $numberOfPendingTasks \u003d\u003d 1)task#{else}tasks#end\")\n#set($url \u003d \"${__global.productUrl}/ui/main#launch:tasks\")\n\nThere $isAre $numberOfPendingTasks $taskTasks waiting for you in your $__global.productName Task Manager.\u003cbr/\u003e Use each task\u0027s details to finish it on the source, then mark it as complete in ${__global.productName}. To do this work, go to the task manager \u003ca href\u003d\"$url\" target\u003d\"_blank\"\u003ehere\u003c/a\u003e, or copy and paste this link into your browser: $url\u003cbr/\u003e\u003cbr/\u003eThanks,\u003cbr/\u003e The $__global.productName Team\u003cbr/\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"non_employee_request_created",
      "name":"Non-Employee Request Created",
      "description":"Sent to a non-employee account manager to confirm that their request for a new account for a non-employee was submitted.",
      "locale":"en",
      "subject":"You’ve requested a non-employee account for ${data.firstName} ${data.lastName}",
      "header":null,
      "body":"Dear $__recipient.name,\u003cbr/\u003e\u003cbr/\u003e#set($_sourceName \u003d $data.nonEmployeeSource.name)\n#set($_approverIds \u003d $__util.getObjectByJsonPath($__contentJson, \u0027$.data.approvalItems[*].approver.id\u0027))\n\n\u003cp\u003eYour request for a non-employee account for $data.accountName on the source $_sourceName was successfully submitted.\u003c/p\u003e\n#if($_approverIds.size() \u003e 0)\n    #if($_approverIds.size() \u003d\u003d 1)\n        \u003cp\u003e$__util.getUser($_approverIds[0]).name must approve this account request before it can be added to the source.\u003c/p\u003e\n    #elseif($_approverIds.size() \u003e 1)\n    \u003cp\u003eThe following reviewers must approve this account request before it can be added to the source:\u003c/p\u003e\n    \u003cul\u003e\n        #foreach($_approverId in $_approverIds)\n            \u003cli\u003e$__util.getUser($_approverId).name\u003c/li\u003e\n        #end\n    \u003c/ul\u003e\n    #end\n\u003cp\u003eYou will be notified when a decision is made about this account request. You can check the status of your request by clicking Manage Non-Employees on the dashboard and viewing the $_sourceName source.\u003c/p\u003e\n#{else}\n\u003cp\u003e\n    This account will be added to $_sourceName shortly. You can check its status by clicking Manage Non-Employees on the dashboard and viewing the $_sourceName source.\n\u003c/p\u003e\n#end\n\u003cbr/\u003eThanks,\u003cbr/\u003e The $__global.productName Team\u003cbr/\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"non_employee_approval_required",
      "name":"Non-Employee Account Review",
      "description":"Template for Non-Employee Approval request.",
      "locale":"en",
      "subject":"Review the non-employee account requested for ${data.firstName} ${data.lastName}",
      "header":null,
      "body":"Dear $__recipient.name,\u003cbr/\u003e\u003cbr/\u003e#set($_sourceName \u003d $data.nonEmployeeSource.name)\n#set($_requestedForDisplayName \u003d \"${data.firstName} ${data.lastName}\")\n#set($_pendingApprovalItem \u003d $__util.getObjectByJsonPath($__contentJson, \"$.data.approvalItems[?(@.approvalStatus \u003d\u003d \u0027PENDING\u0027)]\").get(0))\n#set($_approvedApprovalItems \u003d $__util.getObjectByJsonPath($__contentJson, \"$.data.approvalItems[?(@.approvalStatus \u003d\u003d \u0027APPROVED\u0027)]\"))\n#set($_notReadyApprovalItems \u003d $__util.getObjectByJsonPath($__contentJson, \"$.data.approvalItems[?(@.approvalStatus \u003d\u003d \u0027NOT_READY\u0027)]\"))\n#set($_requester \u003d $__util.getUser($data.requester.id))\n\n\u003cp\u003e$_requester.name has requested a new non-employee account for $_requestedForDisplayName on the source $_sourceName.\u003c/p\u003e\n#set($_approvalCenterUrl \u003d \"${__global.productUrl}/ui/d/approvals/requested-items\")\n\u003cp\u003ePlease visit the \u003ca href\u003d\"$_approvalCenterUrl\"\u003eApprovals center\u003c/a\u003e to review this request.\u003c/p\u003e\n\n#if($_approvedApprovalItems.size()\u003e0)\n\u003cp\u003e#foreach($_approvedItem in $_approvedApprovalItems)#if($foreach.count!\u003d1) and #end$__util.getUser($_approvedItem.approver.id).name#end have approved this account.\u003c/p\u003e\n#end\n#if($_notReadyApprovalItems.size()\u003e0)\n\u003cp\u003e#foreach($_notReadyApprovalItem in $_notReadyApprovalItems)#if($foreach.count!\u003d1) and #end$__util.getUser($_notReadyApprovalItem.approver.id).name#end will review this account request if you approve it.\u003c/p\u003e\n#end\n#if($_pendingApprovalItem.approvalOrder \u003d\u003d $data.approvalItems.size() - 1)\n\u003cp\u003eIf you approve this non-employee account request, an account for $_requestedForDisplayName with the account ID\n    $data.accountName will be created in $__global.productName.\u003c/p\u003e\n#end\n\u003cbr/\u003eThanks,\u003cbr/\u003e The $__global.productName Team\u003cbr/\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"non_employee_request_action_completed",
      "name":"Non-Employee Account Request Result",
      "description":"Template for Non-Employee Account Request Decision.",
      "locale":"en",
      "subject":"Your non-employee account request for ${data.firstName} ${data.lastName} was $data.approvalStatus",
      "header":null,
      "body":"Dear $__recipient.name,\u003cbr/\u003e\u003cbr/\u003e#set($_sourceName \u003d $data.nonEmployeeSource.name)\n#set($_userDisplayName \u003d \"${data.firstName} ${data.lastName}\")\n#set($_approvalStatus \u003d $__contentJson.get(\u0027data\u0027).get(\u0027approvalStatus\u0027))\n#set($_createdDate \u003d $__dateTool.toDate(\"yyyy-MM-dd\u0027T\u0027HH:mm:ss.SSSXXX\", $data.created))\n\u003cp\u003eOn $__dateTool.format(\u0027yyyy-MM-dd\u0027, $_createdDate), you requested a non-employee account for $_userDisplayName on the source $_sourceName.\u003c/p\u003e\n\n#if($_approvalStatus \u003d\u003d \"APPROVED\")\n\u003cp\u003eThis request has been \u003cspan style\u003d\"color:green\"\u003eapproved\u003c/span\u003e. A new $__global.productName account for this user is being processed. The user name for this account will be $data.accountName.\u003c/p\u003e\n#elseif ($_approvalStatus \u003d\u003d \"REJECTED\")\n  #foreach($item in $__contentJson.get(\u0027data\u0027).get(\u0027approvalItems\u0027))\n #if($item.get(\"approvalStatus\") \u003d\u003d \"REJECTED\")\n #set($_completionDate \u003d $__dateTool.toDate(\"yyyy-MM-dd\u0027T\u0027HH:mm:ss.SSSXXX\", $data.completionDate)) #set($_rejectorName \u003d $__util.getUser($item.approver.id).name)\n    \u003cp\u003e$_rejectorName \u003cspan style\u003d\"color:red\"\u003edenied\u003c/span\u003e your request on $__dateTool.format(\u0027yyyy-MM-dd\u0027, $_completionDate).\u003c/p\u003e\n     \u003cp\u003ePlease contact $_rejectorName if you have any questions.\u003c/p\u003e\n    #end\n#end\n#elseif ($_approvalStatus \u003d\u003d \"CANCELLED\")\n\u003cp\u003eThis request has been \u003cb\u003ecancelled\u003c/b\u003e because one or more reviewers in the review process has been removed from the system.\u003c/p\u003e\n\u003cp\u003eYou can resubmit the request in $__global.productName.\u003c/p\u003e\n#end\n\n#foreach($item in $__contentJson.get(\"data\").get(\"approvalItems\"))\n#if($_approvalStatus \u003d\u003d \"REJECTED\")\n   $__util.getUser($item.approver.id).name provided the following additional information: \u003c/br\u003e\n      \u003cb\u003e$item.comment\u003c/b\u003e \u003c/br\u003e\n #elseif($item.get(\"comment\") !\u003d $null)\n        $__util.getUser($item.approver.id).name provided the following additional information: \u003c/br\u003e\n       \u003cb\u003e$item.comment\u003c/b\u003e \u003c/br\u003e\n    #end\n#end\u003cbr/\u003eThanks,\u003cbr/\u003e The $__global.productName Team\u003cbr/\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"non_employee_term_end_date_near",
      "name":"Non-Employee End Date Reminder",
      "description":"Sent to the account managers for a non-employee source when one or more of the non-employees on that source has an end date in 7 days.",
      "locale":"en",
      "subject":"Reminder: The end date for $data.expiringNonEmployees.size() non-employee#if($data.nonEmployeeIds.size()\u003e1)s#end is in 7 days",
      "header":null,
      "body":"Dear $__recipient.name,\u003cbr/\u003e\u003cbr/\u003e#set($_sourceName \u003d $data.sourceName)\n#set($_expiringNonEmployees \u003d $data.expiringNonEmployees)\n#set($_productName \u003d $__global.productName)\n#set($_nonEmployeeSourceUrl \u003d \"${__global.productUrl}/ui/d/dashboard/non-employees/sources/$data.sourceId\")\n#macro( showName $_nonEmployee )\n    $_nonEmployee.firstName $_nonEmployee.lastName ($_nonEmployee.accountName)\n#end\n\u003cp\u003eYou are receiving this email because you’re listed as an account manager for the non-employee source $_sourceName in $_productName.\u003c/p\u003e\n\n#if ($_expiringNonEmployees.size()\u003d\u003d1)\n\u003cp\u003eThe end date for the non-employee #showName($_expiringNonEmployees[0]) is in 7 days.\u003c/p\u003e\n\u003cp\u003eYour admin may have configured these non-employees to lose access to $_productName on their end date.\u003c/p\u003e\n#elseif ($_expiringNonEmployees.size()\u003e1)\n\u003cp\u003eThe \u003cbold\u003eend date\u003c/bold\u003e for $_expiringNonEmployees.size() non-employees in $_productName is in \u003cbold\u003e7\u003c/bold\u003e days.\u003c/p\u003e\n\u003cp\u003eYour admin may have configured these non-employees to lose access to $_productName on their end date. The following users are included in this list:\u003c/p\u003e\n\u003cul\u003e\n    #foreach($_expireNonEmployee in $_expiringNonEmployees)\n        #if($foreach.count\u003d\u003d21) #break #end\n        \u003cli\u003e#showName($_expireNonEmployee)\u003c/li\u003e\n    #end\n\u003c/ul\u003e\n#if ($_expiringNonEmployees.size()\u003e 20)\n    #set($_additionalExpireNonEmployee \u003d $_expiringNonEmployees.size() - 20)\n    \u003cp\u003eThe complete list includes $_additionalExpireNonEmployee additional#if($_additionalExpireNonEmployee\u003d\u003d1) identity#else identities#end. Visit the $_sourceName \u003ca href\u003d\"$_nonEmployeeSourceUrl\"\u003eaccount list\u003c/a\u003e to view the complete list.\u003c/p\u003e\n#end\n#end\n\n\u003cp\u003eYou can change the end date for#if($_expiringNonEmployees.size()\u003d\u003d1) this#else these#end and other users in the \u003ca href\u003d\"$_nonEmployeeSourceUrl\"\u003e$_sourceName source\u003c/a\u003e in $_productName.  \u003c/p\u003e\u003cbr/\u003eThanks,\u003cbr/\u003e The $__global.productName Team\u003cbr/\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"non_employee_bulk_import_failed_email_notification",
      "name":"Non-Employee Account Upload Failed",
      "description":"Sent to the user who initiated the upload request when a non-employee account upload incurs an error.",
      "locale":"en",
      "subject":"#set($_sourceName \u003d $data.sourceName)\nYour non-employee account upload for the $_sourceName source failed",
      "header":null,
      "body":"Dear ${data.displayName},\u003cbr/\u003e\u003cbr/\u003e#set($_sourceName \u003d $data.sourceName)\n#set($_sourceId \u003d $data.sourceId)\n#set($url \u003d \"${__global.productUrl}/ui/d/dashboard/non-employees/sources/$_sourceId\")\n#set($_date \u003d $__dateTool.toDate(\"yyyy-MM-dd\u0027T\u0027HH:mm:ss.SSSXXX\", $data.dateTime))\n#set($_formattedDate \u003d $__dateTool.format(\"EEEEE, MMMMM dd, YYYY\", $_date))\n#set($_formattedTime \u003d $__dateTool.format(\"h:mm a\", $_date))\n#set($_errorMessage \u003d $data.errorMessage)\nThe non-employee account upload you started for the $_sourceName source on $_formattedDate at $_formattedTime failed.\u003cbr\u003e\u003cbr\u003e The system provided this error message: $_errorMessage\u003cbr\u003e\u003cbr\u003e You can see all accounts on this source in \u003ca href\u003d\"$url\" target\u003d\"_blank\"\u003e$__global.productName\u003c/a\u003e.\u003cbr\u003e\n\u003cbr/\u003eThanks,\u003cbr/\u003e The $__global.productName Team\u003cbr/\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"non_employee_bulk_import_passed_email_notification",
      "name":"Non-Employee Account Upload Succeeded",
      "description":"Sent to the user who initiated the upload request when a non-employee account upload completes successfully.",
      "locale":"en",
      "subject":"#set($_sourceName \u003d $data.sourceName)\nYour non-employee account upload for the $_sourceName source has succeeded",
      "header":null,
      "body":"Dear ${data.displayName},\u003cbr/\u003e\u003cbr/\u003e#set($_sourceName \u003d $data.sourceName)\n#set($_sourceId \u003d $data.sourceId)\n#set($url \u003d \"${__global.productUrl}/ui/d/dashboard/non-employees/sources/$_sourceId\")\n#set($_date \u003d $__dateTool.toDate(\"yyyy-MM-dd\u0027T\u0027HH:mm:ss.SSSXXX\", $data.dateTime))\n#set($_formattedDate \u003d $__dateTool.format(\"EEEEE, MMMMM dd, YYYY\", $_date))\n#set($_formattedTime \u003d $__dateTool.format(\"h:mm a\", $_date))\n#set($_totalAccounts \u003d $data.numProcessedAccounts.intValue())\n#set($_changedAccounts \u003d $data.numChangedAccounts.intValue())\n#set($_unChangedAccounts \u003d $data.numUnchangedAccounts.intValue())\n#set($_newAccounts \u003d $data.numNewAccounts.intValue())\nThe non-employee account upload you started for the $_sourceName source on $_formattedDate at $_formattedTime succeeded.\u003cbr\u003e\u003cbr\u003e This file contained $_totalAccounts account#if($_totalAccounts!\u003d1)s#end. Based on this upload:\u003cbr\u003e\u003cbr\u003e\u003cul\u003e\u003cli\u003e$_newAccounts new non-employee account#if($_newAccounts!\u003d1)s were#{else} was#end created.\u003c/li\u003e\u003cli\u003e$_changedAccounts existing non-employee account#if($_changedAccounts!\u003d1)s were#{else} was#end updated.\u003c/li\u003e\u003cli\u003e$_unChangedAccounts account#if($_unChangedAccounts!\u003d1)s were#{else} was#end unchanged.\u003c/li\u003e\u003c/ul\u003e\u003cbr\u003eYou can see all non-employee accounts on this source in \u003ca href\u003d\"$url\" target\u003d\"_blank\"\u003e$__global.productName\u003c/a\u003e.\u003cbr\u003e\n\u003cbr/\u003eThanks,\u003cbr/\u003e The $__global.productName Team\u003cbr/\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"campaign_template_pregen_notification",
      "name":"Campaign Template Pre-Generation Notification",
      "description":"Sent out one week prior to Campaign Template generation.",
      "locale":"en",
      "subject":"Reminder: Your Certification Campaign is Scheduled to Start in 7 Days",
      "header":null,
      "body":"Dear ${__recipient.name},\u003cbr/\u003e\u003cbr/\u003eThe certification $campaignTemplateName is scheduled to generate a campaign in 7 days. If you need to make any changes or updates to the contents of this campaign, please do so before ${generationDate}.\u003cbr/\u003eThanks,\u003cbr/\u003e The $__global.productName Team\u003cbr/\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"certification_end_date_modified_notification",
      "name":"Access End Date Modified",
      "description":"Sent to a user when their access expiration date has changed.",
      "locale":"en",
      "subject":"Access End Date Modified",
      "header":null,
      "body":"Dear $__recipient.name,\u003cbr/\u003e\u003cbr/\u003e\u003cp\u003eYour access to the \u0027$accessItemName\u0027 $accessItemType is now scheduled to expire on $scheduledSunsetDate.\u003c/p\u003e\n\u003cp\u003eIf you still need access to \u0027$accessItemName\u0027 after this date, you will need to request it again to extend the duration of the access.\u003c/p\u003e\n\u003cp\u003ePlease contact the $__global.productName administrator if you have any questions.\u003c/p\u003e\u003cbr/\u003eThanks,\u003cbr/\u003e The $__global.productName Team\u003cbr/\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"access_profile_cleanup_notification",
      "name":"Access Profile Cleanup Notification",
      "description":"Sent to a user when their access profiles change due to deleted entitlements on the source.",
      "locale":"en",
      "subject":"Deleted entitlements found in Access Profiles",
      "header":null,
      "body":"\t\tDear ${user.name},\u003cbr/\u003e\t\t\u003cp\u003e\t\t\tDue to recent entitlement aggregation and system refresh activity, entitlement changes were detected on\t\t\tthe source and have triggered changes relating to your access profiles in IdentityNow.\t\t\u003c/p\u003e\t\t#if($disabledAccessProfiles \u0026\u0026 $disabledAccessProfiles.size() \u003e 0)\t\t\t\u003cp\u003eThe following access profiles now have no valid entitlements and have been disabled:\u003c/p\u003e\t\t\t\u003cul\u003e\t\t\t\t#foreach ( $accessProfile in $disabledAccessProfiles )\t\t\t\t\t\u003cli\u003e $accessProfile \u003c/li\u003e\t\t\t\t#end\t\t\t\u003c/ul\u003e\t\t#end\t\t#if($accessProfilesWithDeletedEntitlements \u0026\u0026 $accessProfilesWithDeletedEntitlements.size() \u003e 0)\t\t\t\u003cp\u003e\t\t\t\tThe following access profiles contain deleted entitlements but still contain other valid entitlements\t\t\t\tand remain active:\t\t\t\u003c/p\u003e\t\t\t\u003cul\u003e\t\t\t\t#foreach ( $accessProfile in ${accessProfilesWithDeletedEntitlements.keySet()} )\t\t\t\t\t\u003cli\u003e $accessProfile\t\t\t\t\t\t\u003cul\u003e\t\t\t\t\t\t\t#foreach ( $entitlement in ${accessProfilesWithDeletedEntitlements.get($accessProfile)} )\t\t\t\t\t\t\t\t\u003cli\u003e $entitlement \u003c/li\u003e\t\t\t\t\t\t\t#end\t\t\t\t\t\t\u003c/ul\u003e\t\t\t\t\t\u003c/li\u003e\t\t\t\t#end\t\t\t\u003c/ul\u003e\t\t#end\t\t\u003cp\u003e\t\t\tTo make any changes to these access profiles in IdentityNow, please log in as an administrator at\t\t\t\u003ca href\u003d\"$identityNowUrl/ui/admin#admin:access:access-profiles\"\u003e\t\t\t\t$identityNowUrl/ui/admin#admin:access:access-profiles\t\t\t\u003c/a\u003e\t\t\t.\t\t\u003c/p\u003e\t\t\u003cp\u003e\t\t\tThanks,\u003cbr/\u003e\t\t\tThe ${PRODUCT_NAME} Team\t\t\u003c/p\u003e\t",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"access_profile_owner_approval_notification",
      "name":"Access Profile Owner Approval Notification",
      "description":"Notify the owner of an Access Profile that it has been granted as a side effect of a Role request being approved.",
      "locale":"en",
      "subject":"A user has been granted ${accessProfileName} via a role request",
      "header":null,
      "body":"\tDear ${user.name},\u003cbr/\u003e\t\u003cp\u003e${requesterName}\u0027s request for the role ${requestedRoleName}#if($requesterName !\u003d $requestedForIdentityName) for\t${requestedForIdentityName}#end has been \u003cb\u003eapproved\u003c/b\u003e. ${requestedForIdentityName} has been granted all access\tprofiles contained in that role, including ${accessProfileName}.#if($removeDate) ${requesterName}’s access to\t${accessProfileName} is scheduled to end on ${removeDate}.#end You are receiving this email because you are\tlisted as the owner of ${accessProfileName}\u003c/p\u003e\t\u003cp\u003e\t\tThanks,\u003cbr/\u003e\t\tThe ${PRODUCT_NAME} Team\t\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"access_request_decision",
      "name":"Access Request Decision",
      "description":"Sent to a user to notify them whether their request for an app was approved or denied.",
      "locale":"en",
      "subject":"Your access request for ${requestedObjectName} has been #if($approved)approved#{else}denied#end",
      "header":null,
      "body":" \tDear ${user.name},\u003cbr/\u003e \t#if(${roleRequestEnabled}) \t\t\u003cp\u003eYour request for the ${requestedObjectName} #if(${requestedObjectType}\u003d\u003d\"Role\") role #elseif(${requestedObjectType}\u003d\u003d\"Entitlement\") entitlement #else access profile #end \t\t#if($requesterName !\u003d $requestedForIdentityName) for ${requestedForIdentityName}#end has been     #else \t\t\u003cp\u003eYour request for ${accessProfileName}#if($requesterName !\u003d $requestedForIdentityName) for ${requestedForIdentityName}#end has been     #end \t\u003cb\u003e#if ($approved)\u003cspan style\u003d\"color:green\"\u003eapproved\u003c/span\u003e#{else}\u003cspan style\u003d\"color:red\"\u003edenied\u003c/span\u003e#end.\u003c/b\u003e\u003c/p\u003e\t#if(${roleRequestEnabled}) \t\t#if($approved \u0026\u0026 $accessibleItems \u0026\u0026 $accessibleItems.size() \u003e 0) \t\t\tThis means #if($requesterName !\u003d $requestedForIdentityName) the user now has #else you now have #end access to \t\t\tthe following: \t\t\t#set($sep\u003d\"\") \t\t\t#foreach($item in $accessibleItems) \t\t\t\t$sep$item \t\t\t\t#set($sep\u003d\", \") \t\t\t#end.\u003c/p\u003e \t\t#end \t#end \t#if (!$approved \u0026\u0026 $reviewerComment)\u003cp\u003e${rejecterName} included the following comment when denying the access: \u003cb\u003e$reviewerComment\u003c/b\u003e\u003c/p\u003e \t#end\t#if ($approved) \t\t#if ($removeDate)\u003cp\u003eYour access to ${requestedObjectName} is scheduled to end on ${removeDate}.\u003c/p\u003e \t\t#end \t#end \t#if (!$approved) \t\t\u003cp\u003ePlease contact ${rejecterName} if you have any questions.\u003c/p\u003e \t#end \t\u003cp\u003e \t\tThanks,\u003cbr/\u003e \t\tThe ${PRODUCT_NAME} Team \t\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"access_request_decision_email_for_requested-for_identity",
      "name":"Access Request Decision for Other",
      "description":"Sent to a user when access was requested for them by another user and the reviewer of that request has made a decision.",
      "locale":"en",
      "subject":"${requesterName}\u0027s Request for Access for you was #if($approved)approved#{else}denied#end",
      "header":null,
      "body":"\tDear ${user.name},\u003cbr/\u003e\t\u003cp\u003eOn ${dateRequested}, ${requesterName} requested ${requestedObjectName} for you.\u003c/p\u003e\t#if ($approved)\t\t\u003cp\u003eYour access has been \u003cspan style\u003d\"color:green\"\u003eapproved\u003c/span\u003e. The system is now processing the request.\u003c/p\u003e\t\t#if ($removeDate)\t\t\t\u003cp\u003eYour access to ${requestedObjectName} is scheduled to end on ${removeDate}.\u003c/p\u003e\t\t#end\t#{else}\t\t\u003cp\u003eYour access has been \u003cspan style\u003d\"color:red\"\u003edenied\u003c/span\u003e.\u003c/p\u003e\t\t#if ($reviewerComment)\t\t\t\u003cp\u003e${rejecterName} included the following comment when denying the access: \u003cb\u003e$reviewerComment\u003c/b\u003e\u003c/p\u003e\t\t#{else}\t\t\t\u003cp\u003ePlease contact ${rejecterName} if you have any questions.\u003c/p\u003e\t\t#end\t#end\t\u003cp\u003e\t\tThanks,\u003cbr/\u003e\t\tThe ${PRODUCT_NAME} Team\t\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"access_request_for_identity_with_multiple_accounts_failed",
      "name":"Access Request For Identity With Multiple Accounts Failed",
      "description":"Sent to the requester if their access request failed because the user they requested access for has multiple accounts on the source.",
      "locale":"en",
      "subject":"Request for \u0027${requestItemName}\u0027 Failed",
      "header":null,
      "body":"\t\tDear ${recipientName},\u003cbr/\u003e        \u003cp\u003eYour request for \u0027${requestItemName}\u0027 failed because you have more than one account on the \u0027${sourceName}\u0027 source. \u003c/p\u003e        \u003cp\u003ePlease contact your administrator for assistance.\u003c/p\u003e        Thanks,\u003cbr/\u003e        The ${PRODUCT_NAME} Team",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"access_request_reassignment",
      "name":"Access Request Reassignment",
      "description":"Sent to a reviewer when they have had access requests reassigned to them.",
      "locale":"en",
      "subject":"Access request for ${requesterName} ready for review",
      "header":null,
      "body":" \t\u003cp\u003e \t\tDear ${newOwnerName}, \t\u003c/p\u003e \t\u003cp\u003e\t\t${previousOwnerName} has reassigned ${requesterName}\u0027s request for access to the ${requestedObjectName}\t\t#if(${requestedObjectType}\u003d\u003d\"Role\") role #elseif(${requestedObjectType}\u003d\u003d\"Entitlement\") entitlement #else access profile #end to you. \t\u003c/p\u003e \t#if($commentText) \t\u003cp\u003e \t\t${previousOwnerName} gave the following reason for reassignment: \t\t\u003cbr/\u003e \t\t\u003cp\u003e${commentText}\u003c/p\u003e \t\u003c/p\u003e \t#end \t#if($removeDate)\u003cp\u003eThe sunset date for ${requestedObjectName} is ${removeDate}.\u003c/p\u003e#end \t#if($requestedObjectType\u003d\u003d\"Role\") \t\t#if($accessibleItems \u0026\u0026 $accessibleItems.size() \u003e 0) \t\t\u003cp\u003e \t\t\tIf you approve this request, the user will receive access to the following: \t\t\t\u003cul\u003e \t\t\t#foreach($item in $accessibleItems) \t\t\t\t\u003cli\u003e$item\u003c/li\u003e \t\t\t#end \t\t\t\u003c/ul\u003e \t\t\t\u003c/p\u003e \t\t#end \t#elseif($requestedObjectType\u003d\u003d\"AccessProfile\") \t\tIf you approve this request, ${requesterName} will receive access to all entitlements in ${accessProfileName}. \t#end \t\u003cp\u003e \t\tThanks, \t\t\u003cbr/\u003e \t\tThe ${PRODUCT_NAME} Team \t\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"access_request_reviewer",
      "name":"Access Request Reviewer",
      "description":"Sent to each access reviewer who needs to review an access request.",
      "locale":"en",
      "subject":"New access request for ${requestedForIdentityName} ready for review",
      "header":null,
      "body":" \tDear ${user.name},\u003cbr/\u003e\t\u003cp\u003e${requesterName} has requested the ${requestedObjectName}#if(${requestedObjectType}\u003d\u003d\"Role\") role #elseif(${requestedObjectType}\u003d\u003d\"Entitlement\") entitlement #else access profile#end#if($requesterName !\u003d $requestedForIdentityName) for ${requestedForIdentityName}#end.\u003c/p\u003e \t#if($requesterComments)\u003cp\u003e${requesterName} gave the following reason for requesting access: \u003cb\u003e${requesterComments}.\u003c/b\u003e\u003c/p\u003e \t#end \t#if($removeDate)\u003cp\u003eThe sunset date for ${requestedObjectName} is ${removeDate}.\u003c/p\u003e#end \t#if($requestedObjectType\u003d\u003d\"Role\") \t\t#if($accessibleItems \u0026\u0026 $accessibleItems.size() \u003e 0) \t\t\u003cp\u003eIf this request is approved, ${requestedForIdentityName} will receive access to the following: \t\t\t\u003cul\u003e \t\t\t#foreach($item in $accessibleItems) \t\t\t\t\u003cli\u003e$item\u003c/li\u003e \t\t\t#end \t\t\t\u003c/ul\u003e \t\t\t\u003c/p\u003e \t\t#end \t#elseif($requestedObjectType\u003d\u003d\"AccessProfile\") \t\t\u003cp\u003eIf this request is approved, ${requestedForIdentityName} will receive access to all entitlements in ${accessProfileName}.\u003c/p\u003e     #end \t\u003cp\u003eGo to \u003ca href\u003d\"$identityNowUrl/ui/d/approvals\"\u003e$identityNowUrl/ui/d/approvals\u003c/a\u003e to approve or deny this request.\u003c/p\u003e \t\u003cp\u003e \t\tThanks,\u003cbr/\u003e \t\tThe ${PRODUCT_NAME} Team \t\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"access_request_submitted_email_for_requested-for_identity",
      "name":"Access Request for Other",
      "description":null,
      "locale":"en",
      "subject":"${requesterName} Has Requested Access on Your Behalf.",
      "header":null,
      "body":"\tDear ${user.name},\u003cbr/\u003e    \u003cp\u003e${requesterName} has requested the following access on your behalf:\u003c/p\u003e\t#foreach ( $type in ${requestedObjectDetailsByType.keySet()} )        $type:        \u003cul\u003e        #foreach ( $detail in ${requestedObjectDetailsByType.get($type)} )            \u003cli\u003e ${detail.name} #if($detail.removeDate) (Access Sunset Date: ${detail.removeDate}) #end\u003c/li\u003e        #end        \u003c/ul\u003e        \u003cbr/\u003e    #end\t\u003cp\u003e\t\tThanks,\u003cbr/\u003e\t\tThe ${PRODUCT_NAME} Team\t\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"access_request_submitted_email_for_requester_after_validation",
      "name":"Access Request Submitted Email For Requester After Validation",
      "description":"Notifies a requester of which access requests were successfully submitted and which failed during the validation process.",
      "locale":"en",
      "subject":"Your request for access for #if ($requestDetails \u0026\u0026 $requestDetails.size() \u003d\u003d 1) $requestDetails.get(0).identityName #elseif ($requestDetails.size() \u003e 1) $requestDetails.size() identities #end was submitted.",
      "header":null,
      "body":"\tDear ${user.name},\u003cbr/\u003e\t\u003cp\u003eYou\u0027ve requested access for the following identities:\u003c/p\u003e    #foreach ( $requestDetail in $requestDetails )        \u003cb\u003e${requestDetail.identityName}:\u003c/b\u003e\u003cbr/\u003e            #set ($successDetails \u003d $requestDetail.getSuccessDetails())            #if ($successDetails \u0026\u0026 $successDetails.size() \u003e 0)                The following item(s) was requested successfully:                \u003cul\u003e                    #foreach ( $typeEntry in $objectTypeToPrettyPrint.entrySet() )                        #set ($type \u003d $typeEntry.getKey())                        #set ($prettyType \u003d $typeEntry.getValue())                        #set ($objectDetails \u003d {})                        #set ($objectDetails \u003d ${successDetails.get($type)})                        #if ( $objectDetails.size() \u003e 0 )                            \u003cli\u003e$prettyType:                            #foreach ($requestedObjectDetail in $objectDetails)                                \u003cul\u003e                                ${requestedObjectDetail.objectName} #if($requestedObjectDetail.removeDate) (Access Sunset Date: $spTools.formatOffsetDateTimeForEmail($requestedObjectDetail.removeDate))#end                                \u003c/ul\u003e                            #end                            \u003c/li\u003e                         #end                    #end                \u003c/ul\u003e            #end            #set ($exclusionDetails \u003d $requestDetail.getExclusionDetails())            #if ($exclusionDetails \u0026\u0026 $exclusionDetails.size() \u003e 0)                Your request for the following item(s) \u003cb\u003efailed\u003c/b\u003e:                \u003cul\u003e                    #foreach ( $typeEntry in $objectTypeToPrettyPrint.entrySet() )                        #set ($type \u003d $typeEntry.getKey())                        #set ($prettyType \u003d $typeEntry.getValue())                        #set ($objectDetails \u003d {})                        #set ($objectDetails \u003d ${exclusionDetails.get($type)})                        #if ( $objectDetails.size() \u003e 0 )                            \u003cli\u003e$prettyType:                            #foreach ($requestedObjectDetail in $objectDetails)                                \u003cul\u003e                                ${requestedObjectDetail.objectName} #if ($requestedObjectDetail.exclusionReason) ($requestedObjectDetail.exclusionReason) #end                                \u003c/ul\u003e                            #end                            \u003c/li\u003e                         #end                    #end                \u003c/ul\u003e            #end    #end\t\u003cp\u003e\t\tThanks,\u003cbr/\u003e\t\tThe ${PRODUCT_NAME} Team\t\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"access_request_submitted_email_for_requester_identity",
      "name":"Access Request for Self",
      "description":"Notify requester that the access request has been submitted.",
      "locale":"en",
      "subject":"Your Request Was Successfully Submitted.",
      "header":null,
      "body":"\tDear ${user.name},\u003cbr/\u003e\t\u003cp\u003eYour request for the following item(s) was successfully submitted. If approvals are required, you will be notified when a decision is made about this access.\u003c/p\u003e    #if(${requestedForIdentityNames.size()} \u003e 0)        Requested For:        \u003cul\u003e            #foreach ( $name in ${requestedForIdentityNames} )                \u003cli\u003e $name \u003c/li\u003e            #end        \u003c/ul\u003e    #end    Requested Access:    \u003cul\u003e        #foreach ( $type in ${requestedObjectDetailsByType.keySet()} )            \u003cli\u003e $type:                    \u003cul\u003e                        #foreach ( $detail in ${requestedObjectDetailsByType.get($type)} )                           \u003cli\u003e ${detail.name} #if($detail.removeDate) (Access Sunset Date: ${detail.removeDate}) #end\u003c/li\u003e                        #end                    \u003c/ul\u003e            \u003c/li\u003e        #end    \u003c/ul\u003e\t\u003cp\u003e\t\tThanks,\u003cbr/\u003e\t\tThe ${PRODUCT_NAME} Team\t\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"access_revoke_approval_reassignment",
      "name":"Access Revoke Approval Reassignment",
      "description":"Notifies a user when an access revoke request has been reassigned to them.",
      "locale":"en",
      "subject":"Access revoke for ${requestedForIdentityName} ready for review",
      "header":null,
      "body":"\t\u003cp\u003e        Dear ${newOwnerName},    \u003c/p\u003e     \u003cp\u003e\t\t${previousOwnerName} has reassigned a request to remove ${requestedForIdentityName} from the ${requestedObjectName}\t\t#if(${requestedObjectType}\u003d\u003d\"Role\") role #elseif(${requestedObjectType}\u003d\u003d\"Entitlement\") entitlement #else access profile #end to you to approve. \t\u003c/p\u003e \t #if($commentText) \t\u003cp\u003e \t\t${previousOwnerName} gave the following reason for reassigning the request to you: \t\t\u003cbr/\u003e \t\t\u003cp\u003e${commentText}\u003c/p\u003e \t\u003c/p\u003e \t#end    \u003cp\u003e\t    If you approve this request, ${requestedForIdentityName} will lose the ${requestedObjectName} ${requestedObjectType}\t    #if($requestedObjectType \u003d\u003d \"Role\" || $requestedObjectType \u003d\u003d \"AccessProfile\")            and all associated entitlements #end.        #end    \u003c/p\u003e    \u003cp\u003e \t\tThanks, \t\t\u003cbr/\u003e \t\tThe ${PRODUCT_NAME} Team \t\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"access_revoke_request_decision_email_for_requested-for_identity",
      "name":"Access Revoke Request Decision Email For Requested-For Identity",
      "description":"Notifies a user when a reviewer has made a decision on their access in an access revoke request.",
      "locale":"en",
      "subject":"${requesterName}\u0027s Request to Revoke Access from you was #if($approved)approved#{else}denied#end",
      "header":null,
      "body":"\tDear ${user.name},\u003cbr/\u003e\t\u003cp\u003e$requesterName\u0027s request to remove your access to the $requestedObjectName $requestedObjectType has been\t\u003cb\u003e#if ($approved)\u003cspan style\u003d\"color:green\"\u003eapproved\u003c/span\u003e#{else}\u003cspan style\u003d\"color:red\"\u003edenied\u003c/span\u003e#end.\u003c/b\u003e\u003c/p\u003e\t#if($removeDate)\u003cp\u003eYour access to ${requestedObjectName} is scheduled to end on ${removeDate}.\u003c/p\u003e#end    If you need more information, please contact $requesterName for assistance.\t\u003cp\u003e\t\tThanks,\u003cbr/\u003e\t\tThe ${PRODUCT_NAME} Team\t\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"access_revoke_request_decision_for_requester",
      "name":"Access Revoke Request Decision For Requester",
      "description":"Notifies a requester when a user has reviewed their access revoke request.",
      "locale":"en",
      "subject":"Your access revoke request for ${requestedObjectName} has been #if($approved)approved#{else}denied#end",
      "header":null,
      "body":" \tDear ${user.name},\u003cbr/\u003e \t\u003cp\u003eYour request to revoke the $requestedObjectName $requestedObjectType from $requestedForIdentityName has been \t\u003cb\u003e#if ($approved)\u003cspan style\u003d\"color:green\"\u003eapproved\u003c/span\u003e#{else}\u003cspan style\u003d\"color:red\"\u003edenied\u003c/span\u003e#end.\u003c/b\u003e\u003c/p\u003e\t#if($approved)\t \t\u003cp\u003e$requestedForIdentityName\u0027s access to the $requestedObjectName $requestedObjectType will be revoked\t \t\t#if($removeDate) on $removeDate.\t \t\t#else soon, after additional processing.\t \t\t#end\t \t\u003c/p\u003e\t#end \t#if (!$approved \u0026\u0026 $reviewerComment) \t\t\u003cp\u003e${rejecterName} gave the following reason for denying the request: \u003cb\u003e$reviewerComment\u003c/b\u003e\u003c/p\u003e \t#end \t#if (!$approved) \t\t\u003cp\u003ePlease contact ${rejecterName} if you have any questions.\u003c/p\u003e \t#end \t\u003cp\u003e \t\tThanks,\u003cbr/\u003e \t\tThe ${PRODUCT_NAME} Team \t\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"access_revoke_request_reviewer",
      "name":"Access Revoke Request Reviewer",
      "description":"Notifies a user that they have an access revoke request to review.",
      "locale":"en",
      "subject":"New access revoke request for ${requestedForIdentityName} ready for review",
      "header":null,
      "body":"                    Dear ${user.name},\u003cbr/\u003e                    \u003cp\u003e$requesterName has requested that the \"$requestedObjectName\" $requestedObjectType be revoked from $requestedForIdentityName.\u003c/p\u003e                    #if($requesterComments)                        \u003cp\u003e$requesterName gave the following reason for revoking access:\u003cbr/\u003e \u003cb\u003e$requesterComments\u003c/b\u003e.\u003c/p\u003e                    #end                    \u003cp\u003e                        If this request is approved, $requestedForIdentityName will lose the $requestedObjectName $requestedObjectType                        #if($requestedObjectType \u003d\u003d \"Role\" || $requestedObjectType \u003d\u003d \"AccessProfile\")                            and all associated entitlements #if($removeDate)on $removeDate #end.                        #end                    \u003c/p\u003e                    \u003cp\u003e                        Thanks,\u003cbr/\u003e                        The ${PRODUCT_NAME} Team                    \u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"access_revoke_request_submitted_email_for_requested-for_identity",
      "name":"Access Revoke Request Submitted For Requested-For Identity",
      "description":"Sent to the identity whose access is being reviewed in an access revoke request.",
      "locale":"en",
      "subject":"$requesterName Has Requested to Revoke Your Access.",
      "header":null,
      "body":"\tDear ${requestedForIdentityName},\u003cbr/\u003e\t\u003cp\u003e$requesterName has requested removal of your access from following items.\tIf approvals are required, you will be notified when a decision is made about this access.\t\u003c/p\u003e    #foreach ( $type in ${requestedObjectDetailsByType.keySet()} )        $type:        \u003cul\u003e        #foreach ( $detail in ${requestedObjectDetailsByType.get($type)} )            \u003cli\u003e ${detail.name} #if($detail.removeDate) (Access Sunset Date: ${detail.removeDate}) #end\u003c/li\u003e        #end        \u003c/ul\u003e        \u003cbr/\u003e    #end    \u003cp\u003eIf you need more information about this request, please contact $requesterName for assistance.\u003c/p\u003e\t\u003cp\u003e\t\tThanks,\u003cbr/\u003e\t\tThe ${PRODUCT_NAME} Team\t\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"access_revoke_request_submitted_email_for_requester_identity",
      "name":"Access Revoke Request Submitted For Requester Identity",
      "description":"Notifies a user that they successfully submitted an access revoke request.",
      "locale":"en",
      "subject":"Your Revoke Request Was Successfully Submitted.",
      "header":null,
      "body":"\tDear ${requesterName},\u003cbr/\u003e\t\u003cp\u003e\tYour request to revoke the following access items was successfully submitted.\tIf approvals are required, you will be notified when a decision is made about this access.\t\u003c/p\u003e\t#if(${requestedForIdentityNames.size()} \u003e 0)        Requested For:        \u003cul\u003e            #foreach ( $name in ${requestedForIdentityNames} )                \u003cli\u003e $name \u003c/li\u003e            #end        \u003c/ul\u003e    #end    Type of Access:    \u003cul\u003e        #foreach ( $type in ${requestedObjectDetailsByType.keySet()} )            \u003cli\u003e $type:                \u003cul\u003e                    #foreach ( $detail in ${requestedObjectDetailsByType.get($type)} )                        \u003cli\u003e ${detail.name} #if($detail.removeDate) (Access Sunset Date: ${detail.removeDate}) #end\u003c/li\u003e                    #end                \u003c/ul\u003e            \u003c/li\u003e        #end    \u003c/ul\u003e    #if(${requestedForIdentityNames.size()} \u003e 0)        \u003cp\u003eThe employee has also been notified about your request.\u003c/p\u003e    #end    \u003cp\u003eIf you need help with this request, please contact your \u003cProductName\u003e administrator.\u003c/p\u003e\t\u003cp\u003e\t\tThanks,\u003cbr/\u003e\t\tThe ${PRODUCT_NAME} Team\t\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"access_sunset_date_reminder",
      "name":"Access Sunset Date Reminder",
      "description":"Sent to a user to remind them that their access to an item is coming to an end.",
      "locale":"en",
      "subject":"Reminder: Access End Date Approaching",
      "header":null,
      "body":"\t\tDear ${recipientName},\u003cbr/\u003e        \u003cp\u003eYour access to the \u0027${accessItemName}\u0027 ${accessItemType} is scheduled to end on ${scheduledSunsetDate}.\u003c/p\u003e        \u003cp\u003eIf you still need access to \u0027${accessItemName}\u0027, you will need to extend the duration of the access by modifying the access expiration date.\u003c/p\u003e        \u003cp\u003ePlease contact the ${PRODUCT_NAME} administrator if you have any questions.\u003c/p\u003e        \u003cbr/\u003eThanks,\u003cbr/\u003e        The ${PRODUCT_NAME} Team",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"bulk_reassignment",
      "name":"Certification Reassignment",
      "description":"Notifies a reviewer when they have been reassigned identities from an existing certification.",
      "locale":"en",
      "subject":"New certification reassignment request",
      "header":null,
      "body":"\tDear ${user.name},\u003cbr/\u003e   \u003cp\u003e${requesterName} has assigned ${numNewIdentities} #if(${numNewIdentities} \u003d\u003d 1) user #{else} users #end to you for review in a certification.\u003c/p\u003e   \u003cp\u003eReason for reassignment: ${description}\u003c/p\u003e   \u003cp\u003eYou have until $spTools.formatDate($certification.expiration,3,0) to review and either approve, change, or revoke access for these users.\u003c/p\u003e   \u003cp\u003eClick \u003ca href\u003d\"$identityNowUrl/ui/d/certifications-review/certification/${certification.id}\"\u003ehere\u003c/a\u003e to review the certification.\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"certification",
      "name":"Certification",
      "description":"Notify user that a certification has been activated.",
      "locale":"en",
      "subject":"Please Review Your Employees\u0027 Access",
      "header":null,
      "body":"\tDear ${user.name},\u003cbr/\u003e   \u003cp\u003eThe ${certification.certificationGroups.get(0).name} certification campaign has been started by your system administrator. This campaign allows each reviewer in the campaign to verify that users have the correct entitlements.\u003c/p\u003e   \u003cp\u003eFor each user in your certification, you will see entitlements they have. You might also see sources the entitlements come from or applications they can access because of those entitlements.\u003c/p\u003e   \u003cp\u003eYou have until $spTools.formatDate($certification.expiration,3,0) to review and either approve, change, or revoke access for each user.\u003c/p\u003e   \u003cp\u003eClick \u003ca href\u003d\"$identityNowUrl/ui/d/certifications-review/certification/${certification.id}\"\u003ehere\u003c/a\u003e to review the certification.\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"certification_due",
      "name":"Certification Due",
      "description":"Sent to certification reviewers one week after a certification campaign starts and every seven days after that, until they sign off or the campaign ends.",
      "locale":"en",
      "subject":"Reminder: Certification needs your attention",
      "header":null,
      "body":"Dear ${ownerName},\u003cbr/\u003e   \u003cp\u003e The certification \"$certification.certificationGroups.get(0).name\" is still open and needs to be completed.#if ($certification.expiration)  This certification must be finished by $spTools.formatDate($certification.expiration,3,0).#{end}  Click \u003ca href\u003d\"$identityNowUrl/ui/d/certifications-review/certification/${certification.id}\"\u003ehere\u003c/a\u003e to complete the certification.",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"cloud_lifecycle_state_change",
      "name":"Lifecycle State Change",
      "description":"Sent to selected users when an identity\u0027s lifecycle state changes.",
      "locale":"en",
      "subject":"Lifecycle state change for ${identityName}",
      "header":null,
      "body":"\u003cp\u003e The user ${identityName}\u0027s status has changed to $newState. \u003c/p\u003e\u003cp\u003e Thanks,\u003cbr/\u003e The ${PRODUCT_NAME} Team \u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"cloud_system_notification_apps",
      "name":"Application Health",
      "description":"Sent when an application changes status. This is a system notification email.",
      "locale":"en",
      "subject":"The application \u0027$name\u0027 is now in #if ($healthy) a Healthy #{else} an Unhealthy #end state.",
      "header":null,
      "body":"\tDear recipient,    \u003cp\u003e     The application \u0027$name\u0027 has been in #if ($healthy) a Healthy #{else} an Unhealthy #end state #if ($since) since $since ago. #end\t\u003c/p\u003e\t\u003cp\u003ePlease sign in to $PRODUCT_NAME for more information.\u003c/p\u003e\tThank you,\u003cbr/\u003e\tThe $PRODUCT_NAME Team\t\u003cp\u003eYou are receiving this email because your email address was configured to receive $PRODUCT_NAME notification emails.\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"cloud_system_notification_identities",
      "name":"Identity Errors",
      "description":"Sent when identity processing causes 5% or more of identities to be in an error state. This is a system notification email.",
      "locale":"en",
      "subject":"${PRODUCT_NAME} Notification: Identities are in an Error State after a Refresh",
      "header":null,
      "body":"\tDear recipient,    \u003cp\u003eAfter an identity refresh at ${timestamp}, ${errorPercentage}% of identities in your organization are in an Error state.\u003c/p\u003e\tThank you,\u003cbr/\u003e\tThe ${PRODUCT_NAME} Team\t\u003cp\u003eYou are receiving this email because your email address was configured to receive ${PRODUCT_NAME} notification emails.\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"cloud_system_notification_sources",
      "name":"Source Health",
      "description":"Sent when a source changes status. This is a system notification email.",
      "locale":"en",
      "subject":"$PRODUCT_NAME Notification: #if($total \u003d\u003d 1) A source has #{else} ${total} Sources have #end changed status",
      "header":null,
      "body":"\tDear recipient,\t\u003cp\u003e#if($total \u003d\u003d 1) A source has #{else} Sources have #end changed status within your system.\u003c/p\u003e\t#if (${unhealthySources.size()} !\u003d 0 )\t\t\u003cp\u003eThe following #if(${unhealthySources.size()} \u003d\u003d 1) source is #{else} sources are #end unhealthy:\u003c/p\u003e\t\t\u003cp\u003e\t\t\t#foreach ($source in $unhealthySources)\t\t\t\t\u0026nbsp;\u0026nbsp; ${source.name} #if (${source.containsKey(\"since\")}) has been in an Unhealthy state for ${source.since}\t\t\t\t#{else} has moved to an Unhealthy state #end \u003cbr/\u003e\t\t\t#end\t\t\u003c/p\u003e\t\t\u003cbr/\u003e\t#end\t#if (${backToNormalSources.size()} !\u003d 0 )\t\t\u003cp\u003e The following #if(${backToNormalSources.size()} \u003d\u003d 1) source is #{else} sources are #end healthy:\u003c/p\u003e\t    \u003cp\u003e\t\t\t#foreach ($source in $backToNormalSources )\t\t\t\t\u0026nbsp;\u0026nbsp; ${source.name} #if (${source.containsKey(\"since\")}) has been in a Healthy state for ${source.since}\t\t\t\t #{else} has moved to a Healthy state #end  \u003cbr/\u003e\t\t\t#end\t\t\u003c/p\u003e\t#end\t\u003cp\u003ePlease sign in to ${PRODUCT_NAME} for more information.\u003c/p\u003e\tThank you,\u003cbr/\u003e\tThe ${PRODUCT_NAME} Team\t\u003cp\u003eYou are receiving this email because your email address was configured to receive ${PRODUCT_NAME} notification emails.\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"cloud_system_notification_vas",
      "name":"Virtual Appliance Health",
      "description":"Sent when a virtual appliance changes status. This is a system notification email.",
      "locale":"en",
      "subject":"$PRODUCT_NAME Notification: ${total} #if($total \u003d\u003d 1) A virtual appliance has #{else} Virtual appliances have #end changed status",
      "header":null,
      "body":"\tDear recipient,\t\u003cp\u003e#if($total \u003d\u003d 1) A virtual appliance has #{else} Virtual appliances have #end changed status within your system.\u003c/p\u003e\t#if (${clustersWithUnHealthyVAs.size()} !\u003d 0 )\t   \u003cp\u003eYou have unhealthy virtual appliances in ${clustersWithUnHealthyVAs.size()} #if(${clustersWithUnHealthyVAs.size()}\u003d\u003d1) cluster #{else} clusters #end.\u003c/p\u003e\t    \u003cp\u003e\t\t\t#foreach ($cluster in $clustersWithUnHealthyVAs)\t\t\t\tIn the \u0027${cluster.name}\u0027 virtual appliance cluster, ${cluster.clients.size()} of ${cluster.totalClients} #if (${cluster.clients.size()} \u003d\u003d 1) is #{else} are #end in an Unhealthy state.\u003cbr/\u003e\t\t\t\t#foreach ($va in ${cluster.clients})\t\t\t\t\t\u0026nbsp;\u0026nbsp; VA-${va.id} has been in ${va.status} state #if (${va.containsKey(\"since\")}) for ${va.since} #end. \u003cbr/\u003e\t\t\t\t#end\t\t\t#end\t\t\u003c/p\u003e\t\t\u003cbr/\u003e\t#end\t#if (${clustersWithBackToNormalVAs.size()} !\u003d 0 )\t\t\u003cp\u003e#if ( ${clustersWithBackToNormalVAs.size()} \u003d\u003d 1) A virtual appliance #{else} Virtual appliances #end in ${clustersWithBackToNormalVAs.size()} #if(${clustersWithBackToNormalVAs.size()}\u003d\u003d1) cluster has #{else} clusters have #end moved into a Healthy state.\u003c/p\u003e\t    \u003cp\u003e\t\t\t#foreach ($cluster in $clustersWithBackToNormalVAs)\t\t\t\tIn the \u0027${cluster.name}\u0027 virtual appliance cluster, ${cluster.clients.size()} #if (${cluster.clients.size()} \u003d\u003d 1) virtual appliance has #{else} virtual appliances have #end moved into a Healthy state.\u003cbr/\u003e\t\t\t\t#foreach ($va in ${cluster.clients})\t\t\t\t\t\u0026nbsp;\u0026nbsp; VA-${va.id} has been in a Healthy state #if (${va.containsKey(\"since\")}) for ${va.since} #end\u003cbr/\u003e\t\t\t\t#end\t\t\t#end\t\t\u003c/p\u003e\t#end\t\u003cp\u003ePlease sign in to ${PRODUCT_NAME} for more information.\u003c/p\u003e\tThank you,\u003cbr/\u003e\tThe $PRODUCT_NAME Team\t\u003cp\u003eYou are receiving this email because your email address was configured to receive ${PRODUCT_NAME} notification emails.\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"cloud_user_app_password_changed",
      "name":"App Password Changed",
      "description":"Only used if pass-through authentication is configured. Sent when a user changes their login password or the password for any app or direct connect source connected to the source used for pass-through authentication.",
      "locale":"en",
      "subject":"ATTENTION: Your ${PRODUCT_NAME} password update#if (${sourceFailedCount})\t#if (${sourceFailedCount} \u003e 0) failed\t#else was successful\t#end#else was successful#end",
      "header":null,
      "body":"\tDear ${user.name},\u003cbr/\u003e\t#if (${appCount})\t\t#if (${appCount} \u003e 0)\t\t\t#if (${appCount} \u003e 1)\t\t\t\t#if (${appFailedCount} \u003e 0)\t\t\t\t\t\u003cp\u003eYour password was changed for the following apps which share a password:\u003cbr/\u003e\u003c/p\u003e\t\t\t\t#else\t\t\t\t\t\u003cp\u003eYour password has been changed for the following apps which share a password:\u003cbr/\u003e\u003c/p\u003e\t\t\t\t#end\t\t\t#else\t\t\t\t#if (${appFailedCount} \u003e 0)\t\t\t\t\t\u003cp\u003eYour password was changed for app:\u003cbr/\u003e\u003c/p\u003e\t\t\t\t#else\t\t\t\t\t\u003cp\u003eYour password has been changed for app:\u003cbr/\u003e\u003c/p\u003e\t\t\t\t#end\t\t\t#end\t\t\t\u003cp\u003e\t\t\t#foreach ($item in ${appList})\t$item\u003cbr/\u003e\t\t\t#end\t\t\t\u003c/p\u003e\t\t#end\t#else\t\t\u003c!-- If not part of a source, we must be an admin, state sailpoint was updated. --\u003e\t\t#if (${sourceCount} \u003d\u003d 0)\t\t\t\u003c!-- Only display when there are no errors. --\u003e\t\t\t#if (${sourceFailedCount} \u003d\u003d 0)\t\t\t\t\u003cp\u003e\u003cbr/\u003eYour password has been changed in ${PRODUCT_NAME}\u003cbr/\u003e\u003cbr/\u003e\u003c/p\u003e\t\t\t#end\t\t#end\t\t\u003c!-- We updated a source(s), no failures no apps, state sailpoint was updated. Flat file case. --\u003e\t\t#if (${sourceCount} \u003e 0)\t\t\t#if (${appFailedCount} \u003d\u003d 0)\t\t\t\t\u003c!-- Only display when three are no errors. --\u003e\t\t\t\t#if (${appCount} \u003d\u003d 0)\t\t\t\t\t\u003cp\u003e\u003cbr/\u003eYour password has been changed in ${PRODUCT_NAME}\u003cbr/\u003e\u003cbr/\u003e\u003c/p\u003e\t\t\t\t#end\t\t\t#end\t\t#end\t#end\t#if (${appFailedCount} \u003e 0)\t\t#if (${appFailedCount} \u003e 1)\t\t\t\u003c!-- If no sources were updated, use the other sentence. --\u003e\t\t\t#if (${sourceCount} \u003e 0)\t\t\t\t\u003cp\u003eHowever, your password failed to update for the following apps which also share the password:\u003cbr/\u003e\u003c/p\u003e\t\t\t#else\t\t\t\t\u003cp\u003eYour password failed to update for the following apps which also share the password:\u003cbr/\u003e\u003c/p\u003e\t\t\t#end\t\t#else\t\t\t\u003c!-- If no sources were updated, use the other sentence. --\u003e\t\t\t#if (${sourceCount} \u003e 0)\t\t\t\t\u003cp\u003eHowever, your password failed to update for the following app which also shares the password:\u003cbr/\u003e\u003c/p\u003e\t\t\t#else\t\t\t\t\u003cp\u003eYour password failed to update for the following app which also shares the password:\u003cbr/\u003e\u003c/p\u003e\t\t\t#end\t\t#end\t\t\u003cp\u003e\t\t#foreach ($item in ${appFailedList})\t$item\u003cbr/\u003e\t\t#end\t\t\u003c/p\u003e\t#else\t\t\u003c!-- The source failed to update and the source has no apps for this user. --\u003e\t\t#if (${sourceFailedCount})\t\t\t#if (${sourceFailedCount} \u003e 0)\t\t\t\t\u003c!-- If no sources were updated, use the other sentence. --\u003e\t\t\t\t#if (${sourceCount} \u003e 0)\t\t\t\t\t\u003cp\u003eHowever, your password failed to update for all the systems that share the password.\u003cbr/\u003e\u003c/p\u003e\t\t\t\t#else\t\t\t\t\t\u003cp\u003eYour password failed to update for all the systems which also share the password.\u003cbr/\u003e\u003c/p\u003e\t\t\t\t#end\t\t\t#end\t\t#end\t#end\t#if (${appNotAttemptedCount} \u003e 0)\t\t#if (${appNotAttemptedCount} \u003e 1)\t\t\t\u003cp\u003eBecause your primary authentication source failed to update, the following apps were not attempted:\u003cbr/\u003e\u003c/p\u003e\t\t#else\t\t\t\u003cp\u003eBecause your primary authentication source failed to update, the following app was not attempted:\u003cbr/\u003e\u003c/p\u003e\t\t#end\t\t\u003cp\u003e\t\t#foreach ($item in ${appNotAttemptedList})\t$item\u003cbr/\u003e\t\t#end\t\t\u003c/p\u003e\t#else\t\t\u003c!-- The source failed to update and the source has no apps for this user. --\u003e\t\t#if (${sourceNotAttemptedCount})\t\t\t#if (${sourceNotAttemptedCount} \u003e 0)\t\t\t\t\u003cbr/\u003e\u003cp\u003eBecause your primary authentication source failed to update, other systems that shared the password were not attempted.\u003cbr/\u003e\u003c/p\u003e\t\t\t#end\t\t#end\t#end\t#if (${appFailedCount} \u003e 0)\t\t#if (${appFailedCount} \u003e 1)\t\t\t\u003cp\u003ePlease try again to change your password on any of the failed apps. This change will apply to all apps in this email.\u003cbr/\u003e\u003c/p\u003e\t\t#else\t\t\t\u003cp\u003ePlease try again to change your password on this failed app. This change will apply to all apps in this email.\u003cbr/\u003e\u003c/p\u003e\t\t#end\t#else\t\t\u003c!-- The source failed to update and the source has no apps for this user. --\u003e\t\t#if (${sourceFailedCount})\t\t\t#if (${sourceFailedCount} \u003e 0)\t\t\t\t\u003cp\u003ePlease try to change your password again. This change will apply to all systems and apps that share your password.\u003cbr/\u003e\u003c/p\u003e\t\t\t#end\t\t#end\t#end\t\u003cp\u003eIf you did not make this change please contact your IT administrator immediately.\u003cbr/\u003e\u003c/p\u003e\t\u003cp\u003eThanks,\u003cbr/\u003eThe ${PRODUCT_NAME} Team\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"cloud_user_authentication_setting_change",
      "name":"Preference Update",
      "description":"Sent whenever a user\u0027s authentication settings like phone number or answers to security questions change.",
      "locale":"en",
      "subject":"${PRODUCT_NAME} - ${changedSetting} ${hasOrHave} changed",
      "header":null,
      "body":"\tDear ${user.name},\u003cbr/\u003e   \u003cp\u003e${changedSetting} for ${PRODUCT_NAME} ${hasOrHave} been updated at ${homeUrl}.\u003c/p\u003e   \u003cp\u003e The change, made on ${date}, will apply to ${PRODUCT_NAME} the next time you sign in. \u003cbr /\u003eIf you did not make this change, please contact your IT administrator immediately. \u003c/p\u003e   \u003cp\u003e Thanks,\u003cbr/\u003e The ${PRODUCT_NAME} Team \u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"cloud_user_forgot_user_name",
      "name":"Forgot User Name",
      "description":"Sent when a user selects Forgot User Name on the Sign In page and then supplies an email address that is valid for their account.",
      "locale":"en",
      "subject":"User name for ${PRODUCT_NAME}",
      "header":null,
      "body":"Dear ${user.name},\u003c/br\u003e\u003cp\u003eYour ${PRODUCT_NAME} user name is: \u003cstrong\u003e${user.uid}\u003c/strong\u003e\u003c/p\u003e\u003cp\u003eIf you did not request this information, please contact your administrator immediately.\u003c/p\u003e\u003cp\u003ePlease sign in at: ${identityNowUrl}\u003c/p\u003e\u003cp\u003eThanks,\u003cbr/\u003e The ${PRODUCT_NAME} Team \u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"cloud_user_locked_out",
      "name":"User Locked Out",
      "description":"Notifies a user that their account has been locked out due to too many failed sign in attempts.",
      "locale":"en",
      "subject":"ATTENTION: Your ${PRODUCT_NAME} account has been locked",
      "header":null,
      "body":"\u003cp\u003eDear ${user.name},\u003c/p\u003e#if (${attempts.size()} \u003e 0)\u003cp\u003eYour ${PRODUCT_NAME} account has been locked due to the following failed attempts to sign in:\u003cbr/\u003e\u003cbr/\u003e#foreach ($attempt in ${attempts})${attempt.count} attempts from ${attempt.location}\u003cbr/\u003e\u003c/p\u003e#end#else\u003cp\u003eYour ${PRODUCT_NAME} account has been locked due a number of failed attempts to sign in.\u003c/p\u003e#end\u003cp\u003eIt was locked on ${timeLocked} and will remain locked until ${timeLockedUntil}.\u003c/p\u003e#if (${passwordResetUrl})\n\u003cp\u003eTo reset your password if you\u0027ve forgotten it, go to ${passwordResetUrl}.\u003c/p\u003e\n#end\u003cp\u003eIf you think someone else was trying to use your account, please contact your administrator immediately.\u003c/p\u003e\u003cp\u003e Thanks,\u003cbr/\u003e The ${PRODUCT_NAME} Team \u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"cloud_user_new_account_notification",
      "name":"New Account Provisioned",
      "description":"Sent to a user when an account is created on a source for them.",
      "locale":"en",
      "subject":"${source} - Account Created For ${username}",
      "header":null,
      "body":"Hello,\u003c/br\u003e\u003cp\u003eThe ${PRODUCT_NAME} system has created an account for ${username} on the ${source} system. Here are the details about this account:\u003c/p\u003e\u003cp\u003eUser Name: \u003cstrong\u003e${accountUserName}\u003c/strong\u003e\u003c/p\u003e\u003cp\u003eAccess: \u003cbr\u003e #foreach ($access in $accountAccess) \u003cli\u003e$access\u003c/li\u003e \u003cbr/\u003e\t#end \u003c/p\u003e\u003cp\u003eIf you have any questions, contact your administrator.\u003c/p\u003e\u003cp\u003eThanks,\u003cbr/\u003e The ${PRODUCT_NAME} Team \u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"cloud_user_password_changed",
      "name":"User Password Changed",
      "description":"Sent when a user from any app or source that does not use pass-through authentication changes their IdentityNow password.",
      "locale":"en",
      "subject":"ATTENTION: Your ${PRODUCT_NAME} password update#if (${sourceFailedCount})\t#if (${sourceFailedCount} \u003e 0) failed\t#else was successful\t#end#else was successful#end",
      "header":null,
      "body":"\tDear ${user.name},\u003cbr/\u003e\t#if (${appCount})\t\t#if (${appCount} \u003e 0)\t\t\t#if (${appCount} \u003e 1)\t\t\t\t#if (${appFailedCount} \u003e 0)\t\t\t\t\t\u003cp\u003eYour password was changed for the following apps which share a password:\u003cbr/\u003e\u003c/p\u003e\t\t\t\t#else\t\t\t\t\t\u003cp\u003eYour password has been changed for the following apps which share a password:\u003cbr/\u003e\u003c/p\u003e\t\t\t\t#end\t\t\t#else\t\t\t\t#if (${appFailedCount} \u003e 0)\t\t\t\t\t\u003cp\u003eYour password was changed for app:\u003cbr/\u003e\u003c/p\u003e\t\t\t\t#else\t\t\t\t\t\u003cp\u003eYour password has been changed for app:\u003cbr/\u003e\u003c/p\u003e\t\t\t\t#end\t\t\t#end\t\t\t\u003cp\u003e\t\t\t#foreach ($item in ${appList})\t$item\u003cbr/\u003e\t\t\t#end\t\t\t\u003c/p\u003e\t\t#end\t#else\t\t\u003c!-- If not part of a source, we must be an admin, state sailpoint was updated. --\u003e\t\t#if (${sourceCount} \u003d\u003d 0)\t\t\t\u003c!-- Only display when three are no errors. --\u003e\t\t\t#if (${sourceFailedCount} \u003d\u003d 0)\t\t\t\t\u003cp\u003e\u003cbr/\u003eYour password has been changed in ${PRODUCT_NAME}\u003cbr/\u003e\u003cbr/\u003e\u003c/p\u003e\t\t\t#end\t\t#end\t\t\u003c!-- We updated a source(s), no failures no apps, state sailpoint was updated. Flat file case. --\u003e\t\t#if (${sourceCount} \u003e 0)\t\t\t#if (${appFailedCount} \u003d\u003d 0)\t\t\t\t\u003c!-- Only display when three are no errors. --\u003e\t\t\t\t#if (${appCount} \u003d\u003d 0)\t\t\t\t\t\u003cp\u003e\u003cbr/\u003eYour password has been changed in ${PRODUCT_NAME}\u003cbr/\u003e\u003cbr/\u003e\u003c/p\u003e\t\t\t\t#end\t\t\t#end\t\t#end\t#end\t#if (${appFailedCount} \u003e 0)\t\t#if (${appFailedCount} \u003e 1)\t\t\t\u003c!-- If no sources were updated, use the other sentence. --\u003e\t\t\t#if (${sourceCount} \u003e 0)\t\t\t\t\u003cp\u003eHowever, your password failed to update for the following apps which also shares the password:\u003cbr/\u003e\u003c/p\u003e\t\t\t#else\t\t\t\t\u003cp\u003eYour password failed to update for the following apps which also shares the password:\u003cbr/\u003e\u003c/p\u003e\t\t\t#end\t\t#else\t\t\t\u003c!-- If no sources were updated, use the other sentence. --\u003e\t\t\t#if (${sourceCount} \u003e 0)\t\t\t\t\u003cp\u003eHowever, your password failed to update for the following app which also shares the password:\u003cbr/\u003e\u003c/p\u003e\t\t\t#else\t\t\t\t\u003cp\u003eYour password failed to update for the following app which also shares the password:\u003cbr/\u003e\u003c/p\u003e\t\t\t#end\t\t#end\t\t\u003cp\u003e\t\t#foreach ($item in ${appFailedList})\t$item\u003cbr/\u003e\t\t#end\t\t\u003c/p\u003e\t#else\t\t\u003c!-- The source failed to update and the source has no apps for this user. --\u003e\t\t#if (${sourceFailedCount})\t\t\t#if (${sourceFailedCount} \u003e 0)\t\t\t\t\u003c!-- If no sources were updated, use the other sentence. --\u003e\t\t\t\t#if (${appCount} \u003e 0)\t\t\t\t\t\u003cbr/\u003e\u003cp\u003eHowever, your password failed to update for all the systems that share the password.\u003cbr/\u003e\u003c/p\u003e\t\t\t\t#else\t\t\t\t\t\u003cbr/\u003e\u003cp\u003eYour password failed to update.\u003cbr/\u003e\u003c/p\u003e\t\t\t\t#end\t\t\t#end\t\t#end\t#end\t#if (${appFailedCount} \u003e 0)\t\t#if (${appFailedCount} \u003e 1)\t\t\t\u003cp\u003ePlease try again to change your password on any of these apps. This change will apply to all apps in this email.\u003cbr/\u003e\u003c/p\u003e\t\t#else\t\t\t\u003cp\u003ePlease try again to change your password on this app. This change will apply to all apps in this email.\u003cbr/\u003e\u003c/p\u003e\t\t#end\t#else\t\t\u003c!-- The source failed to update and the source has no apps for this user. --\u003e\t\t#if (${sourceFailedCount})\t\t\t#if (${sourceFailedCount} \u003e 0)\t\t\t\t\u003cp\u003ePlease try to change your password again. This change will apply to all systems and apps that share your password.\u003cbr/\u003e\u003c/p\u003e\t\t\t#end\t\t#end\t#end\t\u003cp\u003eIf you did not make this change please contact your IT administrator immediately.\u003cbr/\u003e\u003c/p\u003e\t\u003cp\u003eThanks,\u003cbr/\u003eThe ${PRODUCT_NAME} Team\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"cloud_user_password_expiration",
      "name":"Password Expiration",
      "description":"Sent when a user\u0027s password is about to expire or has expired.",
      "locale":"en",
      "subject":"REMINDER: Your ${acctName} password#if ( ${dayToExpire} \u003c\u003d 0 ) has expired#elseif ( ${dayToExpire} \u003d\u003d 1 ) expires in ${dayToExpire} day#elseif ( ${dayToExpire} \u003e 1 ) expires in ${dayToExpire} days#end",
      "header":null,
      "body":"\tHi ${user.name}, \u003cbr/\u003e\u003cp\u003e    #if ( ${dayToExpire} \u003c\u003d 0 )         Your ${acctName} password has expired.     #elseif ( ${dayToExpire} \u003d\u003d 1 )         Your ${acctName} password expires in ${dayToExpire} day.     #else         Your ${acctName} password expires in ${dayToExpire} days.     #end         Click \u003ca href\u003d\u0027$resetUrl\u0027\u003ehere\u003c/a\u003e to change/reset your password. \u003c/p\u003e\u003cbr/\u003e    \u003cp\u003e If clicking the link doesn\u0027t work, copy and paste the following into your browser:\u003cbr/\u003e ${resetUrl} \u003c/p\u003e\u003cbr/\u003e    #if (${applist})         #if (${appCount} \u003e 1)             \u003cp\u003eThe following applications use ${acctName} password for SSO:\u003cbr/\u003e \u003c/p\u003e        #else            \u003cp\u003eThe following application uses ${acctName} password for SSO:\u003cbr/\u003e \u003c/p\u003e        #end         ${applist}     #end    \u003cp\u003e Thanks,\u003cbr/\u003e The ${PRODUCT_NAME} Team \u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"cloud_user_password_reset_token",
      "name":"Password Reset Code",
      "description":"Sent when a user requests a password reset code via email.",
      "locale":"en",
      "subject":"#if (${sourcename})\t\t\tYour Account Password Reset Code is ${token}\t\t\t#else\t\t\tYour Password Reset Code is ${token}\t\t\t#end",
      "header":null,
      "body":"\u003cp\u003eDear ${user.name},\u003cbr/\u003e\u003c/p\u003e#if (${sourcename})\u003cp\u003eA request has been made to reset your ${sourcename} account password. If you made this request, please copy the following code into the prompt in ${PRODUCT_NAME} to verify your identity:\u003c/p\u003e#else\u003cp\u003eA request has been made to reset your ${PRODUCT_NAME} password. If you made this request, please copy the following code into the prompt in ${PRODUCT_NAME} to verify your identity:\u003c/p\u003e#end\u003cp\u003e${token}\u003c/p\u003e\u003cp\u003eThis code expires as soon as it’s used, or on ${expires}.\u003c/p\u003e\u003cp\u003eIf you did not make this request, please contact your IT administrator immediately.\u003c/p\u003e\u003cp\u003eThanks, \u003cbr/\u003eThe ${PRODUCT_NAME} Team\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"cloud_user_strong_authentication",
      "name":"Strong Authentication",
      "description":"Sent when a user wants to use strong authentication when using an email.",
      "locale":"en",
      "subject":"Your code is ${token} - sent by ${PRODUCT_NAME}",
      "header":null,
      "body":"Dear ${user.name},\u003cbr/\u003e\u003cp\u003eA request has been made to verify your identity over email for security purposes. If you made this request, please copy this code into the prompt in ${PRODUCT_NAME} to verify your identity and continue using ${PRODUCT_NAME}.\u003c/p\u003e\u003cbr/\u003e\u003cp\u003eYour verification code is ${token}.\u003c/p\u003e\u003cbr/\u003e\u003cp\u003eThis code is only valid for a single use. If unused, it expires on ${expires}.\u003c/p\u003e\u003cp\u003eIf you did not make this request then please contact your IT administrator immediately.\u003c/p\u003e\u003cp\u003eThanks, \u003cbr/\u003e The ${PRODUCT_NAME} Team\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"cloud_user_unlock_token",
      "name":"Unlock User Code",
      "description":"Sent when a user selects Unlock on the Sign In page to provide a code that is used to unlock the account.",
      "locale":"en",
      "subject":"Your Account Unlock Code is ${token}",
      "header":null,
      "body":"\u003cp\u003eDear ${user.name},\u003cbr/\u003e\u003c/p\u003e\u003cp\u003eA request has been made to unlock your ${PRODUCT_NAME} account. If you made this request, please copy the following code into the prompt in ${PRODUCT_NAME} to verify your identity:\u003c/p\u003e\u003cp\u003e${token}\u003c/p\u003e\u003cp\u003eThis code expires as soon as it\u0027s used, or on ${expires}.\u003c/p\u003e\u003cp\u003eIf you did not make this request, please contact your IT administrator immediately.\u003c/p\u003e\u003cp\u003eThanks,\u003cbr/\u003eThe ${PRODUCT_NAME} Team\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"cloud_user_unlocked",
      "name":"User Unlocked",
      "description":"Sent after the Unlock User Code email to confirm that the account was unlocked successfully.",
      "locale":"en",
      "subject":"ATTENTION: Your ${PRODUCT_NAME} account has been unlocked",
      "header":null,
      "body":"\u003cp\u003eDear ${user.name},\u003c/p\u003e\u003cp\u003eYour ${PRODUCT_NAME} account has been unlocked.\u003c/p\u003e\u003cp\u003eIf you think someone else was trying to use your account, please contact your administrator immediately.\u003c/p\u003e\u003cp\u003e Thanks,\u003cbr/\u003e The ${PRODUCT_NAME} Team \u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"cloud_user_verification_token",
      "name":"Account Password Reset",
      "description":"Sent when a user requests a password reset via email.",
      "locale":"en",
      "subject":"#if (${sourcename})            ${sourcename} - Account Password Reset            #else            ${PRODUCT_NAME} - Password Reset            #end",
      "header":null,
      "body":"\tDear ${user.name},\u003cbr/\u003e   #if (${sourcename})   \u003cp\u003e A request has been made to reset your ${sourcename} account password. If you made this request please click \u003ca href\u003d\"${verificationURL}\"\u003ehere\u003c/a\u003e to verify your identity and set a new password. \u003c/p\u003e   #else   \u003cp\u003e A request has been made to reset your ${PRODUCT_NAME} password. If you made this request please click \u003ca href\u003d\"${verificationURL}\"\u003ehere\u003c/a\u003e to verify your identity and set a new password. \u003c/p\u003e   #end   \u003cp\u003e If clicking the link doesn\u0027t work, copy and paste the following into your browser: \u003cbr/\u003e \u003ca href\u003d\"${verificationURL}\"\u003e${verificationURL}\u003c/a\u003e \u003c/p\u003e   \u003cp\u003eIf you did not make this request then please contact your IT administrator immediately.\u003c/p\u003e  \u003cp\u003e Thanks,\u003cbr/\u003e The ${PRODUCT_NAME} Team \u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"onboarding_password_reset",
      "name":"Onboarding Password Reset",
      "description":"Sent to a user to prompt them to set their first IdentityNow password.",
      "locale":"en",
      "subject":"Set your first ${PRODUCT_NAME} password",
      "header":null,
      "body":"\u003cp\u003eDear ${userDisplayName},\u003cbr/\u003e\u003c/p\u003e                \u003cp\u003eWelcome to ${PRODUCT_NAME}! To get started, you need to set your ${PRODUCT_NAME} password.\u003c/p\u003e                \u003cp\u003eYour username is ${userName}. Click \u003ca href\u003d\"${verificationURL}\"\u003ehere\u003c/a\u003e to set your password.\u003c/p\u003e                \u003cp\u003eIf clicking the link doesn\u0027t work, copy and paste the following into your browser:\u003c/p\u003e                \u003cp\u003e${verificationURL}\u003c/p\u003e                \u003cp\u003eThis link expires after ${expirationTime} hours.\u003c/p\u003e                \u003cp\u003eThanks, \u003cbr/\u003e                    The ${PRODUCT_NAME} Team\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"pending_access_request_cancelled",
      "name":"Access Request Cancelled",
      "description":"Sent to users when a pending access request is canceled before it has been approved and provisioned.",
      "locale":"en",
      "subject":"Pending Access Request has been cancelled",
      "header":null,
      "body":"\tDear $emailRecipientName,\u003cbr/\u003e    \u003cp\u003e        #if($emailRecipientName \u003d\u003d $requesterName) Your #else The #end pending request of the following item(s)        #if($isRobo) for #if($emailRecipientName \u003d\u003d $requestedForName) you #else $requestedForName #end #end has been cancelled        #if($cancelerName !\u003d $emailRecipientName) by $cancelerName #end    \u003c/p\u003e\t#foreach ( $type in ${requestedObjectDetailsByType.keySet()} )        $type:            \u003cul\u003e            #foreach ( $detail in ${requestedObjectDetailsByType.get($type)} )                \u003cli\u003e ${detail.name} #if($detail.removeDate) (Access Sunset Date: ${detail.removeDate}) #end\u003c/li\u003e            #end            \u003c/ul\u003e            \u003cbr/\u003e    #end    #if($emailRecipientName \u003d\u003d $cancelerName) You #else $cancelerName #end gave the following reason for cancelling the request: \u003cb\u003e$cancelComment\u003c/b\u003e\u003c/p\u003e    #if($emailRecipientName !\u003d $cancelerName)        \u003cp\u003ePlease contact ${cancelerName} if you have any questions.\u003c/p\u003e    #end\t\u003cp\u003e\t\tThanks,\u003cbr/\u003e\t\tThe ${PRODUCT_NAME} Team\t\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"subscription_notification",
      "name":"Subscription Notification",
      "description":"Sent to subscribers when a scheduled search is run.",
      "locale":"en",
      "subject":"[${PRODUCT_NAME}] Subscription: ${searchName}#if (${searchResults.isEmpty()}) (no results)#end",
      "header":null,
      "body":"\u003c!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\"\u003e \u003c!-- Copyright (C) 2018 SailPoint Technologies, Inc. All rights reserved. --\u003e\u003chtml\u003e   \u003chead\u003e\t\t\u003cmeta http-equiv\u003d\"Content-Type\" content\u003d\"text/html; charset\u003dUTF-8\" /\u003e   \u003c/head\u003e   \u003cbody\u003e\t\t\u003cp\u003e\t\t\tYou\u0027re receiving this email because you\u0027re subscribed to the search query: \u003cspan style\u003d\"font-weight: bold;\"\u003e${searchName}\u003c/span\u003e.\t\t\u003c/p\u003e#if (${displayQueryDetails})\t\t\u003cp\u003e\t\t\tThe query for this subscription is:\t\t\t\u003ctable style\u003d\"margin-top: 3px; margin-left: 15px; background-color: #ffffff; border: 3px double #bbbbbb; border-spacing: 0px;\"\u003e\t\t\t\t\u003ctr\u003e\t\t\t\t\t\u003ctd style\u003d\"background-color: #e8e8e8; padding: 5px;\"\u003e${searchQuery}\u003c/td\u003e\t\t\t\t\u003c/tr\u003e\t\t\t\u003c/table\u003e\t\t\u003c/p\u003e#end#if (!${searchResults.isEmpty()})\t\t\u003cp\u003e\t\t\tHere\u0027s a summary of the results for this query:\u003cbr\u003e\t\t\t\u003cbr\u003e\t#set ($count \u003d 1)\t#foreach ($documentType in ${searchResults.keySet()})\t\t\t\u003cspan style\u003d\"margin-left: 15px; font-weight: bold;\"\u003e${searchResults.get($documentType).get(\"count\")}\u0026nbsp;${searchResults.get($documentType).get(\"noun\")}\u003c/span\u003e#if ($count \u003c ${searchResults.keySet().size()})\u003cbr\u003e\u003cspan style\u003d\"font-size: 4px;\"\u003e\u0026nbsp;\u003c/span\u003e\u003cbr\u003e#end\t\t#set ($count \u003d ${count} + 1)\t#end\t\t\u003c/p\u003e#else\t\t\u003cp\u003e\t\t\t${searchName} is returning no results at this time.\t\t\u003c/p\u003e#end\t\t\u003cp\u003e\t\t\tView results:\u003cbr\u003e\t\t\t\u003cbr\u003e\t\t\t\u003cspan style\u003d\"margin-left: 15px;\"\u003eClick \u003ca href\u003d\"${identityNowUrl}/ui/search/?savedSearchId\u003d${savedSearchId}\"\u003ehere\u003c/a\u003e to run this query in ${PRODUCT_NAME}.\u003c/span\u003e\u003cbr\u003e\t\t\t\u003cspan style\u003d\"font-size: 4px;\"\u003e\u0026nbsp;\u003c/span\u003e\u003cbr\u003e\t\t\t\u003cspan style\u003d\"margin-left: 15px;\"\u003eClick \u003ca href\u003d\"${identityNowUrl}/ui/d/reports/${taskResultId}/?name\u003d${fileNameEncoded}\u0026savedSearchId\u003d${savedSearchId}\"\u003ehere\u003c/a\u003e to download the generated report.\u003c/span\u003e\u003cbr\u003e\t\t\t\u003cspan style\u003d\"font-size: 8px;\"\u003e\u0026nbsp;\u003c/span\u003e\u003cbr\u003e\t\t\u003c/p\u003e#if (${displayQueryDetails} \u0026\u0026 !${searchResults.isEmpty()})\t#foreach ($documentType in ${searchResults.keySet()})\t\t\u003cp style\u003d\"margin-bottom: 20px;\"\u003e\t\t\t${documentType} Results Preview#if (${searchResults.get($documentType).get(\"preview\").size()} \u003e 20) (displaying first 20 results)#end:\t\t\t\u003ctable style\u003d\"margin-top: 3px; background-color: #ffffff; border: 1px solid #bbbbbb; border-collapse: collapse; color: #333333;\"\u003e\t\t#set ($isHeader \u003d true)\t\t#foreach ($previewRow in ${searchResults.get($documentType).get(\"preview\")})\t\t\t\t\u003ctr\u003e\t\t\t#foreach ($previewCell in ${previewRow})\t\t\t\t#if ($isHeader)\t\t\t\t\t\u003cth style\u003d\"border: 1px solid #bbbbbb; padding: 5px; background-color: #dddddd; font-weight: bold;\"\u003e${previewCell}\u003c/th\u003e\t\t\t\t#else\t\t\t\t\t\u003ctd style\u003d\"border: 1px solid #bbbbbb; padding: 5px;\"\u003e${previewCell}\u003c/td\u003e\t\t\t\t#end\t\t\t#end\t\t\t\t\u003c/tr\u003e\t\t\t#set ($isHeader \u003d false)\t\t#end\t\t\t\u003c/table\u003e\t\t\u003c/p\u003e\t#end#end\t\t\u003cp\u003e\t\t\tIf you have any questions about this email, please contact the subscription owner \u003ca href\u003d\"mailto:${ownerEmail}?subject\u003dRe: [${PRODUCT_NAME}] Subscription: ${searchNameEncoded}\"\u003e${ownerName}\u003c/a\u003e.\t\t\u003c/p\u003e\t\t\u003cp\u003e\t\t\tThanks,\u003cbr\u003e\t\t\t\u003cbr\u003e\t\t\tThe ${PRODUCT_NAME} Team\t\t\u003c/p\u003e\t\t\u003cp\u003e\t\t\t\u003ca href\u003d\"${identityNowUrl}/ui/d/unsubscribe/${scheduleId}\"\u003eUnsubscribe\u003c/a\u003e\t\t\u003c/p\u003e\t\u003c/body\u003e\u003c/html\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"task_reassignment",
      "name":"Task Reassignment",
      "description":"Sent when a user reassigns a provisioning task for a different user to complete.",
      "locale":"en",
      "subject":"A task has been reassigned",
      "header":null,
      "body":"\t\t\u003cp\u003e${requester} has reassigned a task from ${previousOwner} to ${newOwner} for ${userName}\u0027s ${source} account. \u003c/p\u003e        \u003cp\u003e${newOwner} can find this task within the \u003ca href\u003d\"$identityNowUrl/ui/main#launch:tasks\"\u003eTask Manager\u003c/a\u003e. \u003c/br\u003e\u003c/p\u003e        \u003cp\u003eThanks,\u003cbr/\u003e The ${PRODUCT_NAME} Team \u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"work_item_forward",
      "name":"Work Item Forward",
      "description":"Sent to the user whose work is being forwarded and the user receiving the forwarded work assignment.",
      "locale":"en",
      "subject":"Work item \"$workItemName\" forwarded",
      "header":null,
      "body":"$requester forwarded work item \"$workItemName\" from $previousOwner to $newOwner on $spTools.formatDate($forwardDate,3,1)--------------------------------------------------------------------------------$!commentText",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"work_reassignment_created",
      "name":"Work Reassignment Created",
      "description":"Sent to the user whose work is being reassigned and the user receiving the work when a new work reassignment configuration is created.",
      "locale":"en",
      "subject":"New Automatic Reassignment for ${reassignedFromName}",
      "header":null,
      "body":"Dear $__recipient.name,\u003cbr/\u003e\u003cbr/\u003e#set($_startDate \u003d $__dateTool.toDate(\"yyyy-MM-dd\u0027T\u0027HH:mm:ss\", ${startDate}))\n#set($_formattedStartDate \u003d $__dateTool.format(\"EEEEE, MMMMM dd, YYYY\", $_startDate))\n#set($_endDate \u003d $__dateTool.toDate(\"yyyy-MM-dd\u0027T\u0027HH:mm:ss\", ${endDate}))\n#set($_formattedEndDate \u003d $__dateTool.format(\"EEEEE, MMMMM dd, YYYY\", $_endDate))\n\u003cp\u003e ${modifiedByName} has configured automatic reassignment of ${configType} from ${reassignedFromName} to ${reassignedToName} starting on ${_formattedStartDate} #if( ${endDate} !\u003d \"0001-01-01T00:00:00Z\") and ending on ${_formattedEndDate}. #else with no end date. #end \u003c/p\u003e\u003cbr/\u003eThanks,\u003cbr/\u003e The $__global.productName Team\u003cbr/\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"work_reassignment_updated",
      "name":"Work Reassignment Updated",
      "description":"Sent to the user whose work is being reassigned and the user receiving the work when a new work reassignment configuration is created that overrides an existing work reassignment.",
      "locale":"en",
      "subject":"New Automatic Reassignment for ${newConfig.reassignedFromName}",
      "header":null,
      "body":"Dear $__recipient.name,\u003cbr/\u003e\u003cbr/\u003e#set($_startDate \u003d $__dateTool.toDate(\"yyyy-MM-dd\u0027T\u0027HH:mm:ss\", ${newConfig.startDate}))\n#set($_formattedStartDate \u003d $__dateTool.format(\"EEEEE, MMMMM dd, YYYY\", $_startDate))\n#set($_endDate \u003d $__dateTool.toDate(\"yyyy-MM-dd\u0027T\u0027HH:mm:ss\", ${newConfig.endDate}))\n#set($_formattedEndDate \u003d $__dateTool.format(\"EEEEE, MMMMM dd, YYYY\", $_endDate))\n\u003cp\u003e ${newConfig.modifiedByName} has configured automatic reassignment of ${newConfig.configType} from ${newConfig.reassignedFromName} to ${newConfig.reassignedToName} starting on ${_formattedStartDate} #if( ${newConfig.endDate} !\u003d \"0001-01-01T00:00:00Z\") and ending on ${_formattedEndDate}. #else with no end date. #end \u003c/p\u003e\u003cbr/\u003eThanks,\u003cbr/\u003e The $__global.productName Team\u003cbr/\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"user_invitation-custom",
      "name":"User Invitation",
      "description":"Sent to invite a user to your SailPoint products.",
      "locale":"en",
      "subject":"Welcome to $__global.productName",
      "header":null,
      "body":"\u003cp\u003eHello ${__recipient.name},\u003c/p\u003e \u003cp\u003eYou have been invited to use $__global.productName to support and advance your organization\u0027s security.\u003c/p\u003e  \u003cp\u003eYour username is: \u003cspan style\u003d\"font-weight:bold\"\u003e${__recipient.alias}\u003c/span\u003e\u003c/p\u003e \u003cp\u003e\u003ca href\u003d\"${registrationUrl}\"\u003eRegister Now\u003c/a\u003e\u003c/p\u003e  \u003cp\u003eOnce you’ve registered, you can use this link to access \u003ca href\u003d\"${__global.productUrl}\"\u003e$__global.productName.\u003c/a\u003e\u003cbr/\u003e\u003cbr/\u003eThanks,\u003cbr/\u003e The $__global.productName Team\u003cbr/\u003e\u003c/p\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"pending_manual_changes",
      "name":"Pending Manual Changes",
      "description":"Sent to source owners when an account change is needed on a source that requires manual provisioning.",
      "locale":"en",
      "subject":"Changes requested to $identityDisplayName need manual interaction",
      "header":null,
      "body":"$launcher is requesting the following changes for \u0027$identityDisplayName\u0027 be manually made by you.\n\n#if ( $approvalSet.items )\n#foreach ($item in $approvalSet.items)\n        Application: $item.applicationName\n#if ( $item.nativeIdentity )       \n           Account : $item.nativeIdentity\n#end           \n#if ( $item.instance ) \n          Instance : $item.instance\n#end\n          Operation: $item.operation\n#if ( $item.displayName )          \n          Attribute: $item.displayName\n#elseif ( $item.name ) \n          Attribute: $item.name\n#end\n#if ( $item.displayValue )\n           Value(s): $item.displayValue\n#elseif ( $item.csv ) \n           Value(s): $item.csv\n#end\n#if ( $item.requesterComments )\n Requester Comments: $item.requesterComments\n#end\n#end\n#end",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"remediation_work_item",
      "name":"Remediation Work Item",
      "description":"Sent to a user when a new remediation work item has been assigned to them.",
      "locale":"en",
      "subject":"New remediation request: $!workItemName",
      "header":null,
      "body":"$!requesterName has assigned a new remediation work item to you: $!workItemName.\n\nComments from $!requesterName:\n--------------------------------------------------------------------------------\n$!comments\n--------------------------------------------------------------------------------\n\nLogin and view your work item inbox to complete this request.",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"account_correlation_recommendation",
      "name":"Correlation Recommendations Complete",
      "description":"Sent to the user when account correlation recommendations are complete.",
      "locale":"en",
      "subject":"Account Correlation Recommendations Complete for $sourceName",
      "header":null,
      "body":"Dear $__recipient.name,\u003cbr/\u003e\u003cbr/\u003e#set($url\u003d$__global.productUrl + \u0027/ui/a/admin/connections/sources/\u0027 + $sourceId + \u0027/settings/account-correlation\u0027)AI recommendations for account correlation configurations have been generated for $sourceName. \u003cbr/\u003e Go to the \u003ca href\u003d\"$url\"\u003eAccount Correlation\u003c/a\u003e page to review your correlation recommendations.\u003cbr/\u003e\u003cbr/\u003eThanks,\u003cbr/\u003e The $__global.productName Team\u003cbr/\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"account_correlation_statistics_recommendation",
      "name":"Account Correlation Test Complete",
      "description":"Sent to the user when account correlation statistics have been generated.",
      "locale":"en",
      "subject":"Account Correlation Test Complete for $sourceName",
      "header":null,
      "body":"Dear $__recipient.name,\u003cbr/\u003e\u003cbr/\u003e#set($url\u003d$__global.productUrl + \u0027/ui/a/admin/connections/sources/\u0027 + $sourceId + \u0027/settings/account-correlation\u0027)Account correlation statistics have been generated based on your test correlation configuration for the $sourceName source. \u003cbr/\u003e Go to the \u003ca href\u003d\"$url\"\u003eAccount Correlation\u003c/a\u003e page to review the results of the correlation test.\u003cbr/\u003e\u003cbr/\u003eThanks,\u003cbr/\u003e The $__global.productName Team\u003cbr/\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"create_account_policy_recommendation",
      "name":"Create Account Policy Recommendations Complete",
      "description":"Sent to the user when create account policy recommendations are complete.",
      "locale":"en",
      "subject":"Create Account Policy Recommendations Complete for $sourceName",
      "header":null,
      "body":"Dear $__recipient.name,\u003cbr/\u003e\u003cbr/\u003e#set($url\u003d$__global.productUrl + \u0027/ui/a/admin/connections/sources/\u0027 + $sourceId + \u0027/settings/account-provisioning\u0027)AI recommendations for account creation attributes have been generated for $sourceName. \u003cbr/\u003e Go to the \u003ca href\u003d\"$url\"\u003eCreate Account\u003c/a\u003e page to review your account creation recommendations.\u003cbr/\u003e\u003cbr/\u003eThanks,\u003cbr/\u003e The $__global.productName Team\u003cbr/\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"campaign_activated_notification",
      "name":"Certification Campaign Activated",
      "description":"Notify user that a certification campaign has been activated.",
      "locale":"en",
      "subject":"Please Review Your Employees\u0027 Access",
      "header":null,
      "body":"Dear $__recipient.name,\u003cbr/\u003e\u003cbr/\u003e\t\u003cp\u003eThe $campaignName certification campaign has been started by your system administrator. This campaign allows each reviewer in the campaign to verify that users have the correct entitlements.\u003c/p\u003e   \u003cp\u003eFor each user in your certification, you will see entitlements they have. You might also see sources the entitlements come from or applications they can access because of those entitlements.\u003c/p\u003e   \u003cp\u003eYou have until $campaignDeadline to review and either approve, change, or revoke access for each user.\u003c/p\u003e   \u003cp\u003eClick \u003ca href\u003d\"$identityNowUrl/ui/d/certifications-review/certification/gov_${certificationId}\"\u003ehere\u003c/a\u003e to review the certification.\u003c/p\u003eThanks",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"certification_due_reminder",
      "name":"Certification Due Reminder",
      "description":"Notify certification reviewers one week after a campaign starts and every seven days after that, until they sign off.",
      "locale":"en",
      "subject":"Reminder: Certification needs your attention",
      "header":null,
      "body":"Dear $__recipient.name,\u003cbr/\u003e\u003cbr/\u003e\t\u003cp\u003e The certification $campaignName is still open and needs to be completed. This certification must be finished by $campaignDeadline.\u003c/p\u003e \u003cp\u003e Click \u003ca href\u003d\"$identityNowUrl/ui/d/certifications-review/certification/gov_${certificationId}\"\u003ehere\u003c/a\u003e to complete the certification.\u003c/p\u003eThanks",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"new_applications_discovered_notification",
      "name":"New Applications Discovered",
      "description":"Notify source owners that new applications have been discovered from a discovery source.",
      "locale":"en",
      "subject":"$AppCount new applications discovered from $DiscoverySourceName",
      "header":null,
      "body":"Dear $__recipient.name,\u003cbr/\u003e\u003cbr/\u003e\u003cp\u003e$AppCount new applications were discovered from the $DiscoverySourceName source.\u003c/p\u003e\u003ctable\u003e\u003ctr\u003e\u003cth\u003eApplication\u003c/th\u003e\u003cth\u003eDiscovery Source\u003c/th\u003e\u003cth\u003eDiscovery Source Type\u003c/th\u003e\u003c/tr\u003e#foreach($app in $AppNames)\u003ctr\u003e\u003ctd\u003e$app\u003c/td\u003e\u003ctd style\u003d\u0027text-align: center;\u0027\u003e$DiscoverySourceName\u003c/td\u003e\u003ctd style\u003d\u0027text-align: center;\u0027\u003e$DiscoverySource\u003c/td\u003e\u003c/tr\u003e#end\u003c/table\u003e\u003cp\u003eView the \u003ca href\u003d\u0027${__global.productUrl}${DeepLinkSuffix}\u0027\u003ediscovered applications\u003c/a\u003e.\u003c/p\u003eThanks,\u003cbr/\u003eThe $__global.productName Team\u003cbr/\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"scheduled_campaign_template_pre_generation_notification",
      "name":"Scheduled Campaign Template Pre-Generation Notification",
      "description":"Notify template owner one week prior to Campaign Template generation.",
      "locale":"en",
      "subject":"Reminder: Your Certification Campaign is Scheduled to Start within 7 Days",
      "header":null,
      "body":"Dear $__recipient.name,\u003cbr/\u003e\u003cbr/\u003e\t\u003cp\u003e The certification $campaignTemplateName is scheduled to generate a campaign in $remainingDays days.\u003c/p\u003e \u003cp\u003e If you need to make any changes or updates to the contents of this campaign, please do so before $generationDate.\u003c/p\u003e  \u003cp\u003e Click \u003ca href\u003d\"$identityNowUrl/ui/search/library/certifications/overview\"\u003ehere\u003c/a\u003e to edit the campaign.\u003c/p\u003e\u003cbr/\u003eThanks,\u003cbr/\u003e The $__global.productName Team\u003cbr/\u003e",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   },
   {
      "medium":"EMAIL",
      "key":"certification_reassignment",
      "name":"Certifications Reassignment",
      "description":"Notifies a reviewer when they have been reassigned identities from an existing certification.",
      "locale":"en",
      "subject":"New certification reassignment request",
      "header":null,
      "body":"Dear $__recipient.name,\u003cbr/\u003e\u003cbr/\u003e\t\u003cp\u003e #if($requesterName) $requesterName has #{else}You are#{end}assigned #if($certificationsCount !\u003d 0)$certificationsCount #if($certificationsCount \u003d\u003d 1)certification #{else}certifications #{end}#if($requesterName)to you#{end} for review #{else}#if($subjectsCount !\u003d 0)$subjectsCount #if($subjectsCount \u003d\u003d 1)subject #{else}subjects #{end}#{end}#if($itemsCount \u0026\u0026 $subjectsCount) and #{end}#if($itemsCount !\u003d 0)$itemsCount #if($itemsCount \u003d\u003d 1)item #{else}items #{end}#{end}#if($requesterName)to you#{end} for review in a certification.#{end}\u003c/p\u003e   \u003cp\u003eReason for reassignment: $reason\u003c/p\u003e \u003cp\u003e #if($certificationDueDate) You have until $certificationDueDate to review and either approve, change, or revoke access for these users. #{end}\u003c/p\u003e \u003cp\u003eClick \u003ca href\u003d\"$identityNowUrl/ui/d/certifications-review/certification/gov_${certificationId}\"\u003ehere\u003c/a\u003e to review the certification.\u003c/p\u003eThanks",
      "footer":null,
      "from":"$__global.emailFromAddress",
      "replyTo":"$__global.emailFromAddress",
      "slackTemplate":null,
      "teamsTemplate":null
   }
]

Hey @adamian
Engineering has confirmed that these templates (Scheduled Campaign Template Pre-Generation Notification and Certifications Reassignment) have been removed from the UI.

They should go to GA later and will be documented at that time.
Thank you!

-stacy

@gmilunich The PM (@Tyler_Harman ) just got back to me and said having info regarding the trigger, frequency of the trigger, and formatting of the body text is out of scope for each template.
I would raise any concerns with Tyler.

I’m sorry for this inconvenience!
-stacy

Identity Security Cloud’s notification process is undergoing a migration, so each template is classified as version 1 or version 2.

Is there any plan with a deadline to migrate all templates to a single version, or is this a never ending migration, with two different template systems?

Please review the documentation of all templates and their descriptions in the table…
There’s a bunch of templates missing / not documented, and reading your comments here only makes it more confusing.

Example:
Either the templates of my tenant have been removed from the documentation and not correctly removed from my tenant, or are released without documentation.
I remember when creating them it was also super confusing to know which template was to be used in what circumstance as the descriptions were wrong…

Documentation


vs our tenant

There’s also a big difference between “Certification Created” and “Certification Started”


image

Hi @tysremi,
I am going to tag the PM of these two templates, @anon17153770. She will be able to explain why some have been removed from docs and that their accompanying templates should not be in prod.

Thanks!

But we develop everything in Sandbox, and if that does not match the documentation or the production, I am not sure how far this makes sense and how much we can rely on things to work in production as expected

Hi @vbdm1. We’re escalating your concern to the product team. I appreciate your patience as we work through that process.

1 Like