Sharing my Adaptive Card template: Constituent Data Update Card
DataUpdateCard_20240702170743.zip - Constituent Update Data Card
ConstituentUpdateTemplateCard_20241025121856.zip - Constituent Update Template Card
ProcessConstituentUpdatesfromAdaptiveCard-SharePoint_20240604135053.zip - Updates sent to SharePoint
ProcessConstituentUpdatesfromAdaptiveCard-RENXT_20240604134625.zip - Updates on SharePoint changed in NXT
SharePoint List Template.xlsx
This was created with the help of @Ashley Moose and @Hollie McKain as part of my 2023 Innovation Award project. Thank you Ashley and Hollie for all the help!
- Description: This adaptive card allows non-permissioned users to make updates to constituent records in RE, but with some guiderails to ensure the information is captured according to our business rules.
- Required connections: SKY Add-ins, RENXT Constituents, RENXT , SharePoint, Gmail
- Suggested skill level required to use this template: Intermediate/Advanced
- Configuration details: Before importing the flows, you will need to create your SharePoint list. The easiest way to do this to match the headers, etc. in the flow is to use the attached Excel file and the instructions for exporting from an Excel Table to a SharePoint List.
- Open the file in your desktop application.
- Go to the Table Design tab
- Click Export > Export Table to SharePoint List
- Then enter your SharePoint site address and a Name for the List
- Click Next.
- Then click Finish on the next screen.
- Category: Data Management
- Instructions: Once you have imported the flows, you will need to do a few things:
Both of the adaptive card flows will need a couple of updates to work with your SKY Add-in. I would recommend creating the SKY Application before importing the flows, but don’t create the Add-in within the application yet.
Constituent Update Template Card
- Validate a User Identity Token - Need to add the Application ID from your SKY Add-in Application
- When a HTTP request is received – The URL here will be unique to your environment so you need to copy and encode the URL before adding this value to the SKY add-in.
- Copy the HTTP Post URL.
- Go to a site like https://www.urlencoder.io/ and encode the URL.
- Note down the encoded URL for use in a later step.
Constituent Update Data Card
- Copy and encode the URL. Take note of the encoded URL.
SKY Add-in
- Build your SKY Add-in URL:
- Sample URL for the current add-in: https://app.blackbaud.com/addin-adaptivecard-host/tile?cardServiceUrl=https%3A%2F%2Fprod-175.westus.logic.azure.com%3A443%2Fworkflows%2Ffc98d9db46cd4be1910aa885b0f6d176%2Ftriggers%2Fmanual%2Fpaths%2Finvoke%3Fapi-version%3D2016-06-01%26sp%3D%252Ftriggers%252Fmanual%252Frun%26sv%3D1.0%26sig%3D2HwIJPhhSM6iWhGxGqa5Ka6U96i3Gezo8PZCOvvOQsY&dataServiceUrl=https%3A%2F%2Fprod-61.westus.logic.azure.com%3A443%2Fworkflows%2Fb58d0f38f7614480b4e4291237acad60%2Ftriggers%2Fmanual%2Fpaths%2Finvoke%3Fapi-version%3D2016-06-01%26sp%3D%252Ftriggers%252Fmanual%252Frun%26sv%3D1.0%26sig%3DiRbBwQIY--PXZ9I4mJv5XIOX5FFYO4R7FDEptIbvJ0k&title=Constituent%20Update%20Card
- Replace the text after cardServiceUrl with the encoded URL value from the Constituent Update Template Card
- Replace the text after dataServiceuUrl with the encoded URL value from the Constituent Update Data Card
- Create your SKY Add-in like:
There are a few areas that will need to be updated in the Constituent Update Template Card flow to reference the table values from your environment. This would be in the Compose Adaptive Card JSON step. Once those are updated, everything else should flow through without error in these two flows.
Updates needed:
Table | Source | Action needed |
Address Type | Defined in the Constituent Update (Template) Card flow.
| Update to match available address type values from your environment. |
Country | Defined in the Constituent Update (Template) Card flow.
| Update to match available address type values from your environment. |
State | Defined in the Constituent Update (Template) Card flow.
| Add additional state values. |
Phone Type | Defined in the Constituent Update (Template) Card flow.
| Update to match available phone type values from your environment. |
Email Type | Defined in the Constituent Update (Template) Card flow.
| Update to match available email type values from your environment. |
Contact Type | Defined in the Constituent Update (Template) Card flow.
| Update to match available contact type values from your environment. |
Relationship/ Reciprocal | Defaulted in flow to:
| Either:
|
Updates sent to SharePoint:
Import this flow, add the app id, and save the flow. Then open the first step in the flow "When an HTTP request is received" and copy the HTTP Post URL (see screen shot above). You DO NOT need to encode this URL, but you will need to paste it four (4) times in the Constituent Update Template Card flow in the Compose Adaptive Card JSON step, specifically in the Action.Webrequest steps. It will look like this (note this is not my actual URL):
"type": "Action.Webrequest",
"title": "Submit",
"url": "https://prod-99.westus.logic.azure.com:412/workflows/fe40230!397c4f0bba1bda1c97305cb7/triggers/manual/paths/invoke?api-version=2016-06-01&sp=/triggers/manual/run&sv=1.0&sig=y1U8GxC7VFplvMHGHqlto2e83Qtg9ll7EF8PsF6W8vY"
Updates on SharePoint changed in NXT:
Import this flow and change any update steps within the switch to follow your business rules for “Add”, “Update”, and “Remove”.
Comments
-
@Dan Snyder why do you need the gmail connector for this?
2 -
@JR Barden wondering the same thing and why can't we change the connection to outlook.
1 -
gmail connector is not a requirement, it is simply what Dan used b/c that's what he used in his flow for sending email, so that's why when you import it will ask you to connect otherwise the flow will not import.
1 -
@Alex Wong Thanks, Alex is correct
1 -
Power Platform can connect to a number of different 3rd party tools, this means that those that are more “Google Shops” (for example), can continue to use their email tools and not have to adopt Outlook just to send emails. The last time I checked (and it's been a while), the Gmail connector can connect to a personal account. If you're having problems importing a flow with Gmail included, you could in theory connect it to a personal account, finish importing the flow, and then switch it out with the Email Service of your choice. This could be a Gmail account you created specifically for this purpose.
3 -
@Glen Hutson thanks for the trick of connecting my personal gmail!
1 -
@Dan Snyder question about the Type of update. My adaptive card is showing the below text instead of the values. This is happening through out the card where the JSON has the “title”: “${title}”. What steps can I take to resolve this.
Thanks in advance for any recommendations you may have.
0 -
@Wendy Bondeson
you can change the adaptive card JSON and remove the ${title} and use the actual text in double quote, though you do need to know what is the expected value of this dropdown choice set.“choices”: [{"title":"Address update", “value":"address"},{"title":"Phone Update","value":"phone"}]
I imported the flow to see what's going on and see this:
So if you got
{
"type": "Input.ChoiceSet",
"id": "idUpdateType",
"style": "expanded",
"label": "Type of update",
"isMultiSelect": false,
"value": "1",
"choices": [
{
"$data": "${mainCard.items}",
"title": "${title}",
"value": "${value}"
}
]
},
I have done a few Adaptive cards and have not went and use “data” json, also don't see the need for it as the adaptive card in power automate is already programatically created already.
This may be due to my lack of use/understanding of the “data” json used along side the actual JSON card payload , but I don't see in the flow anywhere where ${mainCard.items} is defined, which is likely why ${title} doesn't show as it is supposed to pick up the “title” info from the mainCard.items data json. @Dan Snyder maybe you can help explain this better.
1 -
@Alex Wong and @Wendy Bondeson
I'll give this a try, but may need to call in @Ashley Moose in case I botch this up.
There are two flows in play here:
- Constituent Update Data Card - As I understand it, this flow is pulling in all of the existing information from a record (addresses, email, etc.) and creating a single card of the “Existing” data from the constituent record, displayed in a drop down menu.
2. Constituent Update Template Card - This is the main card and really it is made up of multiple adaptive cards (one for each update type) and there is a ShowCard action so when you click on the update type (address, phone, etc.) it shows the card that corresponds to that update type. Part of each card is also the “Existing” information that is pulled from the first flow.
So how are they combined.
The key here is how the single SKY Add-In URL is built and making sure it is pointing to the correct encoded URLs from each flow. I have highlighted each piece in different colors to point out what goes together.
- Build your SKY Add-in URL:
- Sample URL for the current add-in: https://app.blackbaud.com/addin-adaptivecard-host/tile?cardServiceUrl=https%3A%2F%2Fprod-175.westus.logic.azure.com%3A443%2Fworkflows%2Ffc98d9db46cd4be1910aa885b0f6d176%2Ftriggers%2Fmanual%2Fpaths%2Finvoke%3Fapi-version%3D2016-06-01%26sp%3D%252Ftriggers%252Fmanual%252Frun%26sv%3D1.0%26sig%3D2HwIJPhhSM6iWhGxGqa5Ka6U96i3Gezo8PZCOvvOQsY&dataServiceUrl=https%3A%2F%2Fprod-61.westus.logic.azure.com%3A443%2Fworkflows%2Fb58d0f38f7614480b4e4291237acad60%2Ftriggers%2Fmanual%2Fpaths%2Finvoke%3Fapi-version%3D2016-06-01%26sp%3D%252Ftriggers%252Fmanual%252Frun%26sv%3D1.0%26sig%3DiRbBwQIY--PXZ9I4mJv5XIOX5FFYO4R7FDEptIbvJ0k&title=Constituent%20Update%20Card
- Replace the text after cardServiceUrl with the encoded URL value from the Constituent Update Template Card
- Replace the text after dataServiceUrl with the encoded URL value from the Constituent Update Data Card
All this to say, it may be that you have not set up the URL to point to the correct flows which is why you are not seeing values, but again I am not sure this is exactly what is happening here so I hope @Ashley Moose or someone who can accurately describe this will chime in if I am off in my description. It may also be that is not the issue you are experiencing either.
1 -
@Dan Snyder
Thank you for that information. Very informative.So yes, that is a missing piece to the puzzle, where the templated data is coming form another Flow's URL.
I have done a few adaptive cards, and have not find reason why I would use the data templating (i.e. dataServiceUrl parameter). I only use 1 flow that does the gathering of RE specific data (i.e. fund, table entries, etc), displaying of adaptive card, processing of the adaptive card submit, show status of work done and/or show another variant of adaptive card. I feel it is easier to maintain. However, others will have different in opinion. The beauty of custom work is, there's always more than one way to accomplish the same goal. I will keep this dataServiceUrl option in mind for potential use the future. Thank you.
1 -
@Alex Wong and @Dan Snyder Dan's description is accurate here, and Alex's deduction is also spot-on. The “data” flow is not truly needed and the same end result could have been accomplished without it. We ended up using the data flow as the card was taking a long time to load so the goal was to split the processing time between the two flows which allowed the card to load a little quicker.
CC: @Wendy Bondeson
2 -
@Dan Snyder, I did build the SKY Add-In URL following these instructions. Thanks for confirming!
1 -
@Ashley Moose did I miss a step for it not to populate the data items.
My card shows this, so I changed up the JSON to populate.
"type": "Input.ChoiceSet",
"id": "idUpdateType",
"style": "expanded",
"label": "Type of update",
"isMultiSelect": false,
"value": "1",
"choices": [
{
"title": "Add - Used for all new records or relationships",
"value": "Add"
},
{
"title": "Update - Used for minor changes, ex. misspelling in an email address",
"value": "Update"
},
{
"title": "Remove - Used for a bounced email or other no longer valid information",
"value": "Remove"It works but I am trying to understand how this is supposed to work.
"type": "Input.ChoiceSet",
"id": "idUpdateType",
"style": "expanded",
"label": "Type of update",
"isMultiSelect": false,
"value": "1",
"choices": [
{
"$data": "${mainCard.items}",
"title": "${title}",
"value": "${value}"1 -
@Wendy Bondeson I sent you a message so we can try to set up a screen share to take a look.
1 -
@Wendy Bondeson and I were able to connect and doh! I had two of the same flows uploaded. I have edited the post to include the correct flows.
2 -
@Dan Snyder
Would it be possible for you to demonstrate this at our next user group meeting? We are having trouble understanding this step. The image in the original post isn't showing up which may be why we are unsure where to get the information to encode.3 -
@Hallie Guiseppe Sure, I should be able to make the next user group meeting, I have it as on the 16th?
A couple other things to mention:
- I uploaded two of the same flows in error when I first posted, so if you have not downloaded the first two from my original post in the last week or so, make sure to re-download those.
- I mentioned this in another post, but it seems that when adding new flows with the HTTP trigger it defaults to “Any user in my tenant” for who can trigger the flow. You will need to change that to “Anyone” before copying the links to encode.
I only mention those two notes in case others come upon this post and run into issues.
1 -
@Hallie Guiseppe
Here's a screenshot of the SKY Add-in app configuration:Add-in name: anything you want to call it
Add-in URL: https://app.blackbaud.com/addin-adaptivecard-host/tile?cardServiceUrl=__________this_is_your_encoded_url_of_the_HTTP_flow_trigger_with_anyone_can_access_________&title=title of your custom%tile
This is what the trigger in flow should look like:
This is my JSON Schema (NOTE that the “data” property is specfic to my adaptive card button click processing, you will have your own).
{
"type": "object",
"properties": {
"uit": {
"type": "string"
},
"context": {
"type": "object",
"properties": {
"recordId": {
"type": "string"
}
}
},
"data": {
"type": "object",
"properties": {
"tid": {
"type": "string"
},
"cid": {
"type": "string"
},
"credit": {
"type": "string"
},
"chapter": {
"type": "string"
},
"affinity": {
"type": "string"
},
"fund": {
"type": "string"
},
"appeal": {
"type": "string"
},
"package": {
"type": "string"
}
}
}
}
}
2 -
@Dan Snyder
Yep. On the 16th - I'll get you on the agenda!0 -
@Dan Snyder
I download the update card template to test out an issue Wendy was having (https://community.blackbaud.com/forums/viewtopic/586/70178) and notice that your Get a constituent action's configure run after was selecting (is successful, has failed, and is skipped) for the Validate a user identify token action. I don't know what prompted you to do that, but is not good to do so. with the run after selection, basically even when validation failed, the flow will still run, bypassing the only security in place to ensure data security of your constituent.0 -
@Alex Wong Thanks for pointing that out Alex, it must have been something we were testing and failed to change back. I have updated the flow attached to the original post.
1 -
ETA: The errors are both on the flow import itself, and not the related resources (i.e. connections).
@Dan Snyder I've been able to import the two Constituent Update (Template/Data) Card flows, but both of the Process Constituent Updates from Adaptive Card (SharePoint/RENXT) flow imports are throwing the following error:
Flow save failed with code 'DynamicOperationRequestClientFailure' and message 'The dynamic operation request to API 'sharepointonline' operation 'GetTable' failed with status code 'Unauthorized'. This may indicate invalid input parameters. Error response: { "error_description": "Exception of type 'Microsoft.IdentityModel.Tokens.AudienceUriValidationFailedException' was thrown." }'.
Any ideas?
0 -
Hi @Kevin Fletcher - This is a common error that can occur when importing flows that use SharePoint lists. Normally there is an option at the top of the flow to Save as a new flow. Do you see this option like in the screen shot below (sorry it's blurry, that's just how it's pasting in)?
If you don't see that option, try importing from a different browser. I've had it not appear for me before but then appear when importing through a different browser.
Please let us know if you're still not able to get this to import!
CC: @Dan Snyder
2 -
@Ashley Moose That third bullet with SANF didn't even display on mine in Edge, but it did show in Firefox and I was able to Save As and go from there. THANKS!
2
Categories
- All Categories
- 2 Blackbaud Community Help
- High Education Program Advisory Group (HE PAG)
- BBCRM PAG Discussions
- Luminate CRM DC Users Group
- DC Luminate CRM Users Group
- Luminate PAG
- 186 bbcon®
- 1.4K Blackbaud Altru®
- 389 Blackbaud Award Management™ and Blackbaud Stewardship Management™
- 1K Blackbaud CRM™ and Blackbaud Internet Solutions™
- 14 donorCentrics®
- 355 Blackbaud eTapestry®
- 2.4K Blackbaud Financial Edge NXT®
- 616 Blackbaud Grantmaking™
- 542 Blackbaud Education Management Solutions for Higher Education
- 3.1K Blackbaud Education Management Solutions for K-12 Schools
- 909 Blackbaud Luminate Online® and Blackbaud TeamRaiser®
- 207 JustGiving® from Blackbaud®
- 6.2K Blackbaud Raiser's Edge NXT®
- 3.5K SKY Developer
- 236 ResearchPoint™
- 116 Blackbaud Tuition Management™
- 160 Organizational Best Practices
- 232 The Tap (Just for Fun)
- 30 Blackbaud Community Challenges
- Blackbaud Consultant’s Community
- 18 PowerUp Challenges
- 3 Raiser's Edge NXT PowerUp Challenge: Gift Management
- 4 Raiser's Edge NXT PowerUp Challenge: Events
- 3 Raiser's Edge NXT PowerUp Challenge: Home Page
- 4 Raiser's Edge NXT PowerUp Challenge: Standard Reports
- 4 Raiser's Edge NXT PowerUp Challenge #1 (Query)
- 71 Blackbaud Community All-Stars Discussions
- 47 Blackbaud CRM Higher Ed Product Advisory Group (HE PAG)
- 743 Community News
- 2.8K Jobs Board
- Community Help Blogs
- 52 Blackbaud SKY® Reporting Announcements
- Blackbaud Consultant’s Community
- 19 Blackbaud CRM Product Advisory Group (BBCRM PAG)
- Blackbaud Francophone Group
- Blackbaud Community™ Discussions
- Blackbaud Francophone Group