In Office 365 notification MC217813 (published 1 July and updated on 15 July), Microsoft announced that: “You will be able to customize profile cards according to your organization business needs. The profile card is sometimes referred to as a contact card or people card.” (Microsoft 365 roadmap item 61502).
The new functionality sounds promising. The profile or people card displays information about someone in different places in Microsoft 365 applications. For instance, you can select an email sender or recipient in Outlook or Outlook mobile to view the details of that person. If they’re someone in your organization, the profile card shows you information from their Azure Active Directory account. The information is more limited for external people.
Customizing the Profile Card
The announcement points to documentation about how to customize the profile card. Essentially, you update the ProfileCardProperty Graph resource to add new information to the Microsoft 365 profile card. Six standard Azure Active Directory properties can be added along with the fifteen custom attributes available for organizations to use as they wish (like CustomAttribute11, which Microsoft recently considered using to identify the room mailboxes needed for its Workspaces feature). Custom attributes are used for many purposes, including to hold organizational information (like cost centers and division names), mark mailboxes for special processing, and so on.
Nice as it is to be able to customize the profile card, the immediate barrier facing many tenant administrators is not knowing how to interact with the Graph to update the ProfileCardProperty resource. Not everyone has mastered Graph programming, and administrators who know PowerShell might not yet have ventured into interacting with the Graph (some examples of using PowerShell with the Graph are listed below).
Graph Explorer Delivers an Answer
As it turns out, the Graph Explorer makes it easy to apply the necessary changes. This is a browser interface to allow people to interact with the Graph and get to know how Graph transactions work against different endpoints, such as Groups, Outlook, Planner, and SharePoint. You can run commands against test data or, after signing into a tenant account, against live data. Programmers can grab code snippets generated for transactions by the Explorer in C#, Java, JavaScript, and Objective-C and include the code in their programs. All in all, the Graph Explorer is a very useful tool.
Using Graph Explorer to Update the Profile Card
The key points about using the Graph Explorer to update the ProfileCardProperty resource are:
Sign in with an administrative account for the tenant.
Select beta from the drop-down list for endpoint types.
Put the update you want to execute in the request body. For example, to add the PostalCode property to the profile card, I put {“directoryPropertyName”:”Postalcode”} in the request body.
Click Run query when you’re ready. If everything’s been done right, you should see a 200 response. This means that the Graph has accepted the update.
Figure 1 shows the Graph Explorer after running a successful update. You can see the 200 response.
Figure 1: Using the Graph Explorer to update the ProfileCardProperty resource with a POST command
You can make multiple updates to add more properties or add all the properties at one time by including them in the request body. For example, this request body specifies three properties to add to the profile card:
Microsoft warns that it takes up to 24 hours for the changes to show on user profile cards. It also seems that you need to add updates one by one and wait until an update is active before applying another. To check the current state of the ProfileCardProperty resource, you can run a GET command to see what’s returned by https://graph.microsoft.com/beta/organization/{tenantid}/settings/profileCardProperties.
Figure 2 shows that I have added two of the standard properties (UserPrincipalName and StreetAddress) and CustomAttribute12. Note that the custom attribute is assigned a display name of “Cost Center” to make its use more obvious to end users.
Figure 2: Checking updates applied to the ProfileCardProperty resource with a GET command
The Microsoft Graph PowerShell SDK can retrieve details of custom properties. For example, this output shows that the tenant customized the profile to include three standard attributes for Azure AD accounts (userPrincipalName, StreetAddress, and PostalCode) and added two custom attributes to display the user’s cost center and preferred drink, which are stored in CustomAttribute12 and CustomAttribute9 respectively:
After the Graph processes everything and applications refresh their cache, you’ll see the customizations show up in the profile cards displayed by applications. Figure 3 shows how OWA displays customized contact information in the Microsoft 365 profile card while Figure 4 shows how the card appears in Outlook Mobile.
Figure 3: OWA displays a customized Microsoft 365 profile card
Figure 4: Outlook Mobile displays a customized Office 365 profile card
The customized attributes don’t appear for guest accounts.
If you make a mistake and add the wrong attribute or want to start over, you can remove an attribute from the organization settings by running a DELETE command in the form:
The notion of having to write code to interact with the Graph might well have turned people away from even considering customizing the profile card. The Graph Explorer allows you to do the job without writing a single line of code. It’s a great example of using an available tool to achieve a goal in a way that the authors of the feature probably never considered.
Is it possible to stop the profile card from appearing – ie if we created a competition tenant but didnt want participants to see personal details about other users in the tenant when they hover over them in Teams.
Hello, I have a question on this. I did a Azure sync to make sure the new custom attributes are showing using the AD Connect application. The attributes came over but the Tennant Schema appended the following “extension_APIID#_customAttribute” to the front of the “directorypropertyname” an when I try to add the attributes to the contact cards and waiting the 24hours nothing shows up. What am I missing?
This is our 0365admin account that i’m using to sign in to graph explorer to get the attributes to show up on everyone’s contact cards. I was following your steps using just customAttribute1 etc… and that didn’t work.
Loading...
I think the real issue is I didn’t know the tenant schema api was adding the prefix to those. We are hybrid right now until we get every mailbox migrated over to O365.
I’m trying to map extensionattribute8 to customattribute8 and display on the outlook client profile area. It displays in OWA but not outlook client, any ideas as to why? It has been longer than 24 hours and I have forced a download of the address book.
If the customattribute8 field is displayed in OWA but not outlook client, what could be a possible cause? Its been longer than 24 hours and address book has been forced to download on the client side. Thank you
It is very annoying when you‘re trying to make this work in a hybrid constellation.. i need the costum attributes visible in the native outlook app, in MS Teams and in OWA. This once again shows me, that Microsoft is lacking behind with things like that.
I think, nobody has a working way to add costumer attributes to the profile card on all mentioned systems..
There’s definitely a limit but I can’t say what it is. I think the practical limit is how much of a custom value can appear on a profile card. You could test to establish the practical limit, which I suspect is much smaller than the theoritical.
{"id":null,"mode":"button","open_style":"in_modal","currency_code":"EUR","currency_symbol":"\u20ac","currency_type":"decimal","blank_flag_url":"https:\/\/office365itpros.com\/wp-content\/plugins\/tip-jar-wp\/\/assets\/images\/flags\/blank.gif","flag_sprite_url":"https:\/\/office365itpros.com\/wp-content\/plugins\/tip-jar-wp\/\/assets\/images\/flags\/flags.png","default_amount":100,"top_media_type":"featured_image","featured_image_url":"https:\/\/office365itpros.com\/wp-content\/uploads\/2022\/11\/cover-141x200.jpg","featured_embed":"","header_media":null,"file_download_attachment_data":null,"recurring_options_enabled":true,"recurring_options":{"never":{"selected":true,"after_output":"One time only"},"weekly":{"selected":false,"after_output":"Every week"},"monthly":{"selected":false,"after_output":"Every month"},"yearly":{"selected":false,"after_output":"Every year"}},"strings":{"current_user_email":"","current_user_name":"","link_text":"Virtual Tip Jar","complete_payment_button_error_text":"Check info and try again","payment_verb":"Pay","payment_request_label":"Office 365 for IT Pros","form_has_an_error":"Please check and fix the errors above","general_server_error":"Something isn't working right at the moment. Please try again.","form_title":"Office 365 for IT Pros","form_subtitle":null,"currency_search_text":"Country or Currency here","other_payment_option":"Other payment option","manage_payments_button_text":"Manage your payments","thank_you_message":"Thank you for supporting the work of Office 365 for IT Pros!","payment_confirmation_title":"Office 365 for IT Pros","receipt_title":"Your Receipt","print_receipt":"Print Receipt","email_receipt":"Email Receipt","email_receipt_sending":"Sending receipt...","email_receipt_success":"Email receipt successfully sent","email_receipt_failed":"Email receipt failed to send. Please try again.","receipt_payee":"Paid to","receipt_statement_descriptor":"This will show up on your statement as","receipt_date":"Date","receipt_transaction_id":"Transaction ID","receipt_transaction_amount":"Amount","refund_payer":"Refund from","login":"Log in to manage your payments","manage_payments":"Manage Payments","transactions_title":"Your Transactions","transaction_title":"Transaction Receipt","transaction_period":"Plan Period","arrangements_title":"Your Plans","arrangement_title":"Manage Plan","arrangement_details":"Plan Details","arrangement_id_title":"Plan ID","arrangement_payment_method_title":"Payment Method","arrangement_amount_title":"Plan Amount","arrangement_renewal_title":"Next renewal date","arrangement_action_cancel":"Cancel Plan","arrangement_action_cant_cancel":"Cancelling is currently not available.","arrangement_action_cancel_double":"Are you sure you'd like to cancel?","arrangement_cancelling":"Cancelling Plan...","arrangement_cancelled":"Plan Cancelled","arrangement_failed_to_cancel":"Failed to cancel plan","back_to_plans":"\u2190 Back to Plans","update_payment_method_verb":"Update","sca_auth_description":"Your have a pending renewal payment which requires authorization.","sca_auth_verb":"Authorize renewal payment","sca_authing_verb":"Authorizing payment","sca_authed_verb":"Payment successfully authorized!","sca_auth_failed":"Unable to authorize! Please try again.","login_button_text":"Log in","login_form_has_an_error":"Please check and fix the errors above","uppercase_search":"Search","lowercase_search":"search","uppercase_page":"Page","lowercase_page":"page","uppercase_items":"Items","lowercase_items":"items","uppercase_per":"Per","lowercase_per":"per","uppercase_of":"Of","lowercase_of":"of","back":"Back to plans","zip_code_placeholder":"Zip\/Postal Code","download_file_button_text":"Download File","input_field_instructions":{"tip_amount":{"placeholder_text":"How much would you like to tip?","initial":{"instruction_type":"normal","instruction_message":"How much would you like to tip? Choose any currency."},"empty":{"instruction_type":"error","instruction_message":"How much would you like to tip? Choose any currency."},"invalid_curency":{"instruction_type":"error","instruction_message":"Please choose a valid currency."}},"recurring":{"placeholder_text":"Recurring","initial":{"instruction_type":"normal","instruction_message":"How often would you like to give this?"},"success":{"instruction_type":"success","instruction_message":"How often would you like to give this?"},"empty":{"instruction_type":"error","instruction_message":"How often would you like to give this?"}},"name":{"placeholder_text":"Name on Credit Card","initial":{"instruction_type":"normal","instruction_message":"Enter the name on your card."},"success":{"instruction_type":"success","instruction_message":"Enter the name on your card."},"empty":{"instruction_type":"error","instruction_message":"Please enter the name on your card."}},"privacy_policy":{"terms_title":"Terms and conditions","terms_body":null,"terms_show_text":"View Terms","terms_hide_text":"Hide Terms","initial":{"instruction_type":"normal","instruction_message":"I agree to the terms."},"unchecked":{"instruction_type":"error","instruction_message":"Please agree to the terms."},"checked":{"instruction_type":"success","instruction_message":"I agree to the terms."}},"email":{"placeholder_text":"Your email address","initial":{"instruction_type":"normal","instruction_message":"Enter your email address"},"success":{"instruction_type":"success","instruction_message":"Enter your email address"},"blank":{"instruction_type":"error","instruction_message":"Enter your email address"},"not_an_email_address":{"instruction_type":"error","instruction_message":"Make sure you have entered a valid email address"}},"note_with_tip":{"placeholder_text":"Your note here...","initial":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"empty":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"not_empty_initial":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"saving":{"instruction_type":"normal","instruction_message":"Saving note..."},"success":{"instruction_type":"success","instruction_message":"Note successfully saved!"},"error":{"instruction_type":"error","instruction_message":"Unable to save note note at this time. Please try again."}},"email_for_login_code":{"placeholder_text":"Your email address","initial":{"instruction_type":"normal","instruction_message":"Enter your email to log in."},"success":{"instruction_type":"success","instruction_message":"Enter your email to log in."},"blank":{"instruction_type":"error","instruction_message":"Enter your email to log in."},"empty":{"instruction_type":"error","instruction_message":"Enter your email to log in."}},"login_code":{"initial":{"instruction_type":"normal","instruction_message":"Check your email and enter the login code."},"success":{"instruction_type":"success","instruction_message":"Check your email and enter the login code."},"blank":{"instruction_type":"error","instruction_message":"Check your email and enter the login code."},"empty":{"instruction_type":"error","instruction_message":"Check your email and enter the login code."}},"stripe_all_in_one":{"initial":{"instruction_type":"normal","instruction_message":"Enter your credit card details here."},"empty":{"instruction_type":"error","instruction_message":"Enter your credit card details here."},"success":{"instruction_type":"normal","instruction_message":"Enter your credit card details here."},"invalid_number":{"instruction_type":"error","instruction_message":"The card number is not a valid credit card number."},"invalid_expiry_month":{"instruction_type":"error","instruction_message":"The card's expiration month is invalid."},"invalid_expiry_year":{"instruction_type":"error","instruction_message":"The card's expiration year is invalid."},"invalid_cvc":{"instruction_type":"error","instruction_message":"The card's security code is invalid."},"incorrect_number":{"instruction_type":"error","instruction_message":"The card number is incorrect."},"incomplete_number":{"instruction_type":"error","instruction_message":"The card number is incomplete."},"incomplete_cvc":{"instruction_type":"error","instruction_message":"The card's security code is incomplete."},"incomplete_expiry":{"instruction_type":"error","instruction_message":"The card's expiration date is incomplete."},"incomplete_zip":{"instruction_type":"error","instruction_message":"The card's zip code is incomplete."},"expired_card":{"instruction_type":"error","instruction_message":"The card has expired."},"incorrect_cvc":{"instruction_type":"error","instruction_message":"The card's security code is incorrect."},"incorrect_zip":{"instruction_type":"error","instruction_message":"The card's zip code failed validation."},"invalid_expiry_year_past":{"instruction_type":"error","instruction_message":"The card's expiration year is in the past"},"card_declined":{"instruction_type":"error","instruction_message":"The card was declined."},"missing":{"instruction_type":"error","instruction_message":"There is no card on a customer that is being charged."},"processing_error":{"instruction_type":"error","instruction_message":"An error occurred while processing the card."},"invalid_request_error":{"instruction_type":"error","instruction_message":"Unable to process this payment, please try again or use alternative method."},"invalid_sofort_country":{"instruction_type":"error","instruction_message":"The billing country is not accepted by SOFORT. Please try another country."}}}},"fetched_oembed_html":false}
What delegated permissions are needed to POST an update to the profileCardProperties?
I didn’t investigate this because Graph Explorer grabs the necessary permissions once you sign in with an administrative account.
Here are the required delegated permissions:
User.Read.All
User.ReadWrite.All
When I try to change the display name, I get a 409 Conflict error. Any idea what’s causing that?
{
“directoryPropertyName”: “CustomAttribute1”,
“annotations”: [
{
“displayName”: “Comms”
}
]
}
Maybe try a different word than Comms? That might be a reserved word. I don’t know, so this is a guess…
Yeah I just tried that, including some really basic names like ABC, etc. It still generates the conflict 409 error. Any other ideas?
Is it possible to delete a profile property? I have tried with the below and keep getting “Bad Request 400”?
DELETE: https://graph.microsoft.com/beta/organization/xxxxxxxxxx/settings/profileCardProperties
REQUEST BODY: {“directoryPropertyName”:”department”}
I wonder the same. I also get a bad request when i try to remove an attribute. If i try to GET the information, I can see the attribute listed there.
DELETE https://graph.microsoft.com/beta/organization/TENNANT/settings/profileCardProperties/directoryPropertyName/postalCode
I´ve added postal code, but it doesnt show up in the profile card. When i tried to delete the attribute from the code, I got a “Bad request” and that it didnt find any object. However if i try to GET the profile card, than I can see the code.
For delete i used: https://graph.microsoft.com/beta/organization/tennant/settings/profileCardProperties/directoryPropertyName/postalCode
Tried this to delete:
https://graph.microsoft.com/beta/organization/xxxxxxxxxxxxxxxxxx/settings/profileCardProperties/Alias
{Alias being the property and an empty Request Body} – about an hour later, I saw that the property was removed from the display.
I am now trying to remove “Business Address” … not having any joy …
Using the Graph Explorer, the query to run to remove an attribute from the organization settings is:
DELETE: https://graph.microsoft.com/beta/organization/%5BtenantID%5D/settings/profileCardProperties/%5BpropertyName%5D
I just did this to remove a custom attribute with:
DELETE: https://graph.microsoft.com/beta/organization/b662313f-14fc-43a2-9a7a-d2e27f4f347a/settings/profileCardProperties/CustomAttribute1
Is that possible to remove Organization tab in the profile card?
I don’t believe so.
Has anyone managed to get postal code to show on their profile card?
Is it possible to stop the profile card from appearing – ie if we created a competition tenant but didnt want participants to see personal details about other users in the tenant when they hover over them in Teams.
Teams doesn’t use the People card. It has its own version which limits the amount of information shown to guests.
Hello, I have a question on this. I did a Azure sync to make sure the new custom attributes are showing using the AD Connect application. The attributes came over but the Tennant Schema appended the following “extension_APIID#_customAttribute” to the front of the “directorypropertyname” an when I try to add the attributes to the contact cards and waiting the 24hours nothing shows up. What am I missing?
{
“directoryPropertyName”: “extension_d21d1be3dd6c42ebb26126a6392c4126_customAttribute1”,
“annotations”: [
{
“displayName”: “Dial Code”
}
]
}
When I post the code in Graph Explorer i get a success message back but nothing is posted to the contact cards.
I haven’t tested this customization with AD Connect. Is the user whose profile you’re viewing a cloud account or an on-premises account?
This is our 0365admin account that i’m using to sign in to graph explorer to get the attributes to show up on everyone’s contact cards. I was following your steps using just customAttribute1 etc… and that didn’t work.
I think the real issue is I didn’t know the tenant schema api was adding the prefix to those. We are hybrid right now until we get every mailbox migrated over to O365.
I’m trying to map extensionattribute8 to customattribute8 and display on the outlook client profile area. It displays in OWA but not outlook client, any ideas as to why? It has been longer than 24 hours and I have forced a download of the address book.
No idea. Outlook desktop takes its own sweet time to do anything…
If the customattribute8 field is displayed in OWA but not outlook client, what could be a possible cause? Its been longer than 24 hours and address book has been forced to download on the client side. Thank you
What version of Outlook desktop app are you using? I think only newer versions support this.
Scratch that – this is only available in OWA I found after testing.
Here is what you can use for the desktop app. Requires registry modifications
https://support.microsoft.com/en-us/office/customize-the-profile-card-in-win32-apps-using-registry-keys-449afd21-6e5e-4b1f-8051-6515630d7537
It is very annoying when you‘re trying to make this work in a hybrid constellation.. i need the costum attributes visible in the native outlook app, in MS Teams and in OWA. This once again shows me, that Microsoft is lacking behind with things like that.
I think, nobody has a working way to add costumer attributes to the profile card on all mentioned systems..
Very very annoying!
Did you log an incident with Microsoft support? If issues aren’t reported formally, there is zero chance that anything will change.
Hello, thanks for this post, but is there a way to customise the “Overview” tab, rather than the “Contact” tab?
I don’t believe so.
Is there some hard limit how long custom contact value can be e.g. how many characters?
There’s definitely a limit but I can’t say what it is. I think the practical limit is how much of a custom value can appear on a profile card. You could test to establish the practical limit, which I suspect is much smaller than the theoritical.