Showing posts with label Dynamics 365. Show all posts
Showing posts with label Dynamics 365. Show all posts

Saturday, April 13, 2019

May 2019 Events

There are several great events happening in the next few weeks where you can meet #CRMUGDC the Monkey. Make sure you save the date and get registered!

CRMUGDC Q2 Chapter Meeting

  • May 15, 8:30am-12:30pm
  • Location: Microsoft Chevy Chase
  • Speakers
    • Geoff Ables: Designing Customer Engagement Processes
    • Nelson Johnson: Power BI for Beginners
    • Kalpana Sivanandan: Microsoft Teams Introduction
  • Get all the details and register here!
  • Check out more events and discussion in the Washington, DC Chapter
If you can't make it to the May 15 DC event, keep in mind that the Reston, VA and Richmond, VA Chapters always meet the same week. We work together to coordinate speakers and plan great content. These are other great chapters to attend!
For those who will be in Philly early, you can also check out the local D365UG/CRMUG Chapter. Their Q2 meeting will be taking place on Friday before D365 Saturday. Check out the details for the May 17 meeting and get registered!

Sunday, April 7, 2019

Improve Game Night with the Power Platform: Lessons Learned

For the last several weeks I have been working on a project to encourage myself to learn more about Power BI, PowerApps and Flow. I have been procrastinating learning these tools waiting for the perfect use case to test on. However what I really needed was just time and a data set to work with.

I have been procrastinating on learning these "new" tools for far too long. So my main takeaway is that there is no excuse! There are so many resources available to learn. No one needs to be an expert right away, its just important to start trying.

When creating new entities it is always important to plan your data structure ahead of time. In this case I planned for this use case but there are probably additional questions to be answered if this was a more real-life scenario. Additionally there are probably other data points that would be helpful for this. It would be helpful to get this data at the beginning instead of trying to add later.

Power BI was really exciting! Once the data was in the Power BI Desktop it was easy to add in data tables and visualizations. Then it only took a bit longer to figure out how to make the changes I was looking for. I was very impressed with what could be done with only a few minutes of dedicated time. 

PowerApps was not as easy for me. I learned the importance of reviewing the templates and different options available. I initially created a blank canvas app, got stuck and started again with the app from data. Also learned to look at all of the different settings for each element. It was easy to think I could just delete or edit something on the screen when I really just needed to edit the properties. There are so many resources for PowerApps plus a great community to help us out. So I didn't stay stuck for long. Some research and some trial and error.

I liked how I could get to the Flow editor right from the PowerApp. It was quick and painless to make the simple flow and it worked as expected.

These posts have been a long time in the making and the main thing I learned was I needed to stop procrastinating! There are no more excuses. It's time to learn these new tools and start applying them to your organization! Thanks everyone for coming with me on this journey.

How do you learn new tools? How do you find good use cases to test?


Saturday, April 6, 2019

Improve Game Night with the Power Platform: Canvas PowerApp

I am working through a scenario to select and rate Board Games to help push me to learn more about the Power Platform.

At this point we have selected a game and sat down to play. Obviously I won so I want to record a high rating for this game. My goal is to create a PowerApp I can run from my phone. I will search for the game to view details and then add a new rating for played games. This rating will create a new "rating" record in D365. Then our rollup field will automatically update the parent Board Game record.

So let's see if this works. The PowerApp was a bit less intuitive (at least for me) than the Power BI dashboard. So I created several different Apps and forms/screens before getting what I wanted. The end result is not perfect but was achieving my goal of getting in and trying it out.

You start in web.powerapps.com and login to your org. From here you can create a Canvas App starting from Data. I selected Dynamics 365 and my board game entity. This automatically built a list screen where you can search the games and a detail screen to view all the details from the game. These screens can be edited using the options on the right hand side to add fields, remove fields, change layout, etc.
Create Canvas App from Data
Connect with D365

Setting up Data Connection
Now, to create a new Rating record I created a new blank form page. I added a combo box to this page which links to the Board Game list and allows users to search and select one. Then added a Rating scale to fill in the star rating. Then I linked the submit check mark to a Flow. This Flow will push the data from the PowerApp form into Dynamics 365.
List Screen

Rating Screen Details

Finally I created a new button on our main page to get to this Rating page.
Details for Rating Button

Additionally there were a few other navigation edits to make sure canceling goes back to the right page and such. The hard part for me was getting the right logic to send to the Flow which submitted the data. The main issue I had with this was making sure I had a blank form (no data source selected) and then making sure my combo box was only allowing one item to be selected.

Logic to send Data to Flow
Flow to push data to D365

I would like to expand this by allowing someone to go to a detail form and add the rating from there. This can be a day 2 item.

To test this, I downloaded the PowerApps app on my phone and logged in with my trial credentials. Then I was able to add ratings in the same way as when I was testing on the PowerApps site. Finally, I went into Dynamics 365 and saw that the ratings were being added and were being rolled up at the Board Game level.
Mobile View Search
Mobile View to save rating

Ratings being created in D365
Success! Now to see if any friends want to use this at Parties.

Tomorrow we will finish this series with a look back at lessons learned and thoughts from this series. Don't miss it!

Friday, April 5, 2019

Improve Game Night with the Power Platform: Power BI

I am in the middle of working to learn the Power Platform by making a dashboard and application to help select a board game to play for game night. The data structure has been created and current game list imported.

Now we are going to use Power BI to make a Board Game dashboard. My goal is to make a magical list that will update based on some slicers so we can eliminate options that do not fit the people interested in playing.

So first let's get the data in Power BI using XrmToolBox's Power Query (M) Builder. The step by step instructions are available here: https://crmchartguy.com/power-query-builder/

You will also need the Power BI Desktop app. Once you follow the steps from the video above, all of your data will be in Power BI and you can start building visualizations. Within a few minutes of getting the data there I could create a table and create the slicers to dynamically filter that table!

These are simple tasks but I am going to document them for other's just starting out like me.

To create a table, click the table button then select all the fields you want to display in the table. When the table is selected you can drag and drop the columns in the values list on the right hand side to re-order.

To create a slicer, de-select the table and then click the slicer (table with filter) button then select the field you want to filter on.

Once these are created you can just click and drag to move and resize for the look you want.

So in just a few minutes I created the Power BI dashboard below. Moving the slicers will automatically update the results in my table so I can see the games that will fit my requirements based on time and number of people.

My First Ever Power BI Report

You can tell it is working because Scotland Yard was selected as a potential game. Since this is one of the best games ever, it is a success!

Tomorrow we will create a PowerApp to see the Board Game data and enter ratings.


Still some beautification needed but progress is being made


Thursday, April 4, 2019

Improve Game Night with the Power Platform: Data Import

As you may know, I am trying to learn more about the Power Platform by creating an application to help with board game selection in my household. We have already set up the entities. Next is the data import then we will use PowerBI and create a PowerApp.

Since all of our fields are there we can import our data now. We already have the data in a consistent format (remember it was an export from BoardGameGeek) so I am going to review that file and save it as a .csv. I am going to leave extra data in the file (columns I am not importing) so that I know I can easily import more data later. I want to ensure that if I save a data map, I can use it again and do not need to review which columns I had removed the last time.

  1. Navigate to Settings > Data Management > Imports
  2. Click "Import Data"
  3. Select your file
  4. Choose the "Default (Automatic Mapping)" Option
  5. Select the new entity you created
  6. Now map the data to the fields created previously
    Data Map

  7. Click Next, Click Next
  8. Before submitting, enter a name for the Data Map. This will save the mapping you just did so you can use it on future files. This is also helpful when working in multiple environments. You can build and test your mapping in a development environment. Save it, export it, import the map and then import the file into production without worrying about mapping something differently.
    Saving the Data Map

  9. Click "Submit"

Click the "Imports" link to monitor the import. This can also be found in Settings > Data Management > Imports.

Import Success

As you see I had some errors. You can get more details on these by double clicking on the import job and then navigating  to the Failures area. In my case, this was because the value for one of the fields (Minimum Play Time) was outside of the allowable values. Clearly I thought games should not take longer than a 100 minutes. I determined that these are games I didn't want to play anyways so acceptable loss. But if you did care about your errors, then you could export the list from this failure area. Fix the issue either in the file or in your system and then import again.

Reviewing Import Errors


Now your Board Game records have been created and you are ready to start working with this data! Tune in tomorrow to see my first ever Power BI Dashboard!

Wednesday, April 3, 2019

Improve Game Night with the Power Platform: Data Structure

As you learned yesterday, I wanted to learn about PowerApps and decided to do this by improving the game night board game selection process.


As a prerequisite for this learning experiment I exported our board game library from BoardGameGeek (to be honest, most of this was my husband's idea and he maintains this list which he exported for me).

Then I set up a free trial to use. If you need help getting your trail set up, check out my earlier post: How to Set up Your Free Trial.

Now it's time to get started with the "easy" bits. I call these easy because these are the pieces that I already know how to handle. There are a few things we need to create.

  1. New "Board Game" entity with fields to hold:
    1. Name of the game
    2. Minimum play time
    3. Maximum play time
    4. Average Play time
    5. Minimum number of players
    6. Maximum number of players
    7. Year Published
    8. Type (Standalone or expansion)
  2. New "Rating" entity with an N:1 link to the "Board Game" entity. This will capture the date (created on) and an integer score. An argument could be made for this to be a custom Activity type but in this case I think that would be a bit of overkill
  3. New Rollup fields on the "Board Game" entity to get us the average score for the game

Let's start with a solution to keep things classy. I also created a publisher so I didn't have new_ in my screenshots.


Publisher Details


Solution Creation


The solution is created from settings > Solutions > New. Then I created the publisher by using the New option from the lookup field. You can also create your Publishers from Settings > Customizations > Publishers. For more information on Solutions, check out this CRMUG Webinar: Solution Management, Your Customization's on the Move.

Alright, let's create the new Entity. In the solution, click New > Entity. I entered the details as shown below, saved and published.

Board Game Entity Set Up


I set the ownership to Organization because all games will be visible to all users with access to that entity. I made it visible in the sales area and turned off the Communication and Collaboration features. We may decide to use Notes in the future but this can be enabled at a later time.

Now for the new fields. Creating fields can be tedious. There are a few options to speed this up. We could do the import and create new fields on the way in. This is generally not recommended as it is very easy to make a mistake. You can also  create the fields via XrmToolBox.

In most case, I would recommend you create the fields manually. Since these fields are simple and this blog is just for learning and experimentation, that is why I chose to go the exciting route.

So I launched XrmToolBox, connected to my trial and navigated to the Attribute Editor (you may have to download from the plugin store). If you are not familiar with XrmToolBox, check out: Getting Started with XrmToolBox.

In the Attribute editor:

  1. Click "Refresh Entities". This will load all the entities from the trial including the new one we just created.
  2. Select the "Board Game" entity and click "Download Template"
    Download Template from Attribute Editor

  3. This creates an Excel file with the details of all the existing fields. I filled in the details for my new fields. I did not include the details for the Option Set as that seemed likely for disaster.
    Add new fields in the downloaded file

  4. Save the updated file
  5. Back in XrmToolBox, navigate to the file click the "Upload Template" button. This will show you the details of the new fields from the file
    Re-import the field details
  6. Click Save and Publish to push these changes to your D365 environment (or if you are like me: get an error, see your silly mistake, fix it and retake screenshots so it seems like you did it right the first time)

Now back in D365, I see all my new fields and just need to create the final Option Set.
Create Option Set


Ok almost there. Let's create one more entity in the solution.

Create Rating Entity


Then we can create the few fields manually.

Lookup to Board Game Entity


Score Field


Now for the fun stuff! We want a rollup field to give us the average score for this game. So back in the "Board Game" entity, I created a new "Average Rating" Rollup field. This will rollup any related "Ratings" to the "Board Game" as an Average. Later we can decide if we need additional rollup or calculated fields for other uses.

Rollup of Scores from related records

Rollup Details


Finally, I updated the main forms for both entities to contain the new fields I created.

If I was doing this in a real environment, there would be several other things I would do as icing on the cake. First of all, create a workflow to populate the Name field on the "Rating" records. I am always irritated to find an entity where the name field is blank. Then there is nothing visible when doing a lookup, default Advanced Find views contain no data, etc. So The workflow would just set this field to the created on date appended with the name of the game it is linked to. Secondly, I would update the icons of these entities to make them look pretty.

Now that the entities are created, we can proceed with importing the data tomorrow!

Tuesday, April 2, 2019

Improve Game Night with the Power Platform: Intro

I have been wanting to learn more about PowerApps and Flow for some time but have been waiting to think of the best way to handle this. This week is the best time to learn since it is the Power Platform World Tour in Washington, DC

I wanted to work through a scenario that would help me put together and learn so many new tools available for Dynamics 365. So I came up with this scenario for me to start playing with a few different things.

First you should know that board games have over taken my home. I am not sure where they keep coming from but they are definitely multiplying.

Kiser Board Game Collection

Now when you have this many games it can be difficult to decide what to play or to narrow down the options to account for the current audience. So the goal was to make a dashboard where we could narrow down the list of games based on player count, type of game etc. The next step would be to also have a way to quickly input a score for the game played so we could gradually build up ratings and additional data to report on. The true goal is finding the ultimate party game!

Here is the high level steps to accomplish:
  1. Export Board Game library from BoardGameGeek
  2. Create a D365 Trial
  3. Set up entities for holding Board Game information with relevant fields. Create related entity to capture a rating/score.
  4. Populate trial with the data exported earlier
  5. Create a Power BI Dashboard of this data with slicers to help you find the perfect game
  6. Create a PowerApp where a score can be quickly entered
  7. Use Rollup fields to rollup scores and other rating data to the parent Board Game
Then it will be time to play some games! Come back tomorrow for step 1 tomorrow and share your tips for learning these new tools too!

Saturday, March 30, 2019

Sometimes the Problem is You

There has been an odd issue going on in my implementation for the last several months. With the help of Microsoft support, we solved the issue this week! However, the solution is very embarrassing because it was a self-made problem (I guess most of them are). But maybe my failures will help others so here goes!

The Problem

Towards the end of October, users started reporting that they were seeing the "Pending Email" warning when launching D365. We reviewed and saw there indeed there were email messages in pending status waiting to be sent.

All of these were workflow generated emails to a variety of different users. There didn't seem to be a common pattern in what these emails were, who they were to or the workflow that created them.

The Work

First to solve the issue we used a workflow to change the Email Message status back to Draft and re-send. Then we learned that everyone had already received the original message. So for some reason the Email in D365 said Pending Send even though it was actually sent and the Date Sent was even populated.

Next we created another new workflow that just updated the status from Pending Send to Sent. This was not solving the issue but it was preventing users from getting the Pending Send Warning message.

We believed the issue had something to do with our connection with Exchange. Maybe we weren't getting a response in a timely manner or something like that. So the "it's not my fault!" attitude was in full force. We basically started handling the symptoms (running the workflow to change status) and stalled on dealing with the problem.

Finally some bandwidth opened up so we decided it was time to engage Microsoft support on this issue. We worked with them for a little while to get traces, logs, etc. and provided all this data.

The Solution

Microsoft reviewed all the data we sent and said "hey, it looks like there is a workflow firing on all of these emails changing them to Pending Send". What? No way! They must be confused.

Sure enough, I found the workflow they were seeing with the step name they reported. It was doing exactly what they said was happening. I deactivated the workflow and the issue stopped occurring.

Then we thought about the timeline and figured out exactly what happened. (Side tip: we have turned Auditing on for the Processes entity. This makes it easy to check who created the workflow, who activated it, when, when was the owner changed, etc.)

  • Earlier in October we had an issue with some emails failing (actually in a Failed state)
  • One admin went in and created a workflow to change back to Pending Send so Server Side Sync would automatically pick up and re-send the email
    • This was set to run on-Demand
    • Scope = User
    • Run on Create = Yes. This is fine when the owner was that admin. This is just for clean up, it won't be a problem, right?
    • Automatically deleted completed workflow jobs = Yes
  • Later in October there is an unrelated release involving other unrelated workflows
  • Part of the release process is reassigning these workflows to the Service Account we use to run these workflows. I (I will take the blame!) reassigned all workflows recently modified to the Service Account not paying attention to the specific items modified for that release
  • Now all emails being owned by/created by the Service Account, AKA all workflow generated emails, are being set to Pending Send after they are sent
As I said, not all emails were "stuck" in Pending Send status. I think this was still due to timing of the email actually being sent and email owner and those type of factors.

Lessons Learned
  1. It can always be your/my fault
  2. Review the Start When conditions even when just doing "quick"clean up items
  3. When using a workflow for clean up or quick data manipulation, deactivate when done
  4. Always communicate with others who are creating workflows and review so everyone is on the same page
So that is my embarrassing story for the week. I hope Microsoft does not put it on my permanent record. Please share your self-inflicted, system mishaps to help me feel better!

Monday, February 18, 2019

Microsoft Dynamics 365 Upgrading from 8.2.2 to 8.2.3

As part of troubleshooting Server Side Sync we upgraded our on-premise Dynamics 365 environment from version 8.2.2 to 8.2.3 (8.2.3 Details). There were several issues that occurred from this upgrade that I wanted to share to prevent you from falling into the same traps (or at least knowing how to recover when they arise).

Related Articles: Server Side Sync troubleshooting steps, Upgrade from 8.1.8.22 Issues

X-Anchor Header Change
The main reason we upgraded to this version was to ensure all integrations with Exchange used the X-Anchor Header. After the upgrade, this feature needs to be enabled by updating the OrgDB setting UseXAnchorMailboxInExchangeRequestHeader to True.

Navigation
After the upgrade, one of our Navigation menus had additional options. To resolve, I simply edited the navigation as part of the form editor and included this in a solution. Then imported this solution as part of the Live upgrade.

SQL Error
Post-upgrade several users reported getting a SQL Error when attempting to access Dynamics 365. This error would pop up anytime a list of records attempted to load without a wait/timeout. Direct links to Accounts could open but related records could not be viewed.

Teams are heavily used in our environment for access and sharing. We found that each of these users was a member of over 20 teams. When several teams were removed, access returned as normal.

Reopened Tasks
CRM for Outlook is also used in my organization. We have seen cases in the past where tasks or calls were created in Dynamics 365 from Outlook even though they already existed (lots of duplicates!). This issue is no longer occurring, but some tasks and calls are being reopened.

So post upgrade, its important to monitor modified Activities especially where they were created in the past and already have an Actual End populated.

Sharing Advanced Find
The last issue we have experienced (or at least we have found so far!) was related to sharing Advanced Finds. Users were able to share views with individual users but received an error when attempting to share with a team. Downloading the log file revealed "missing prvReadUserApplicationMetadata privilege". The User Application Metadata option is available on the Security Role Customization tab. I granted User level Read Access and this resolved the issue.

Has anyone else upgraded to 8.2.3? Any other issues I should be aware of?

User Application Metadata Security Update



Real life Tales of Server Side Sync

The idea of Server Side Synchronization for Microsoft Dynamics 365 is very exciting. It can enable the syncing you know and love to run even when Outlook (with CRM for Outlook) is not running. 

In my organization, we have teams who are scheduling appointments for other users. So it is important that Outlook reflects the most up-to-date information. If there are overlapping appointments that need to be rescheduled or if a user is not prepared for an appointment this is lost revenue.

So we enabled Server Side Sync to get past some of the limitations of CRM for Outlook (primarily that there needs to be a primary syncing computer and that syncing only occurs when Outlook is running). Unfortunately this did not run as smoothly as intended. Appointments were taking 12 hours to sync if they synced at all!

Things are now running smoothly (mostly) but it took time to get everything right and a lot of help from Microsoft support. Let's talk about the changes and items that helped us.

Background
We have been using Dynamics in my organization since CRM 4.0 and were on D365 8.2.2 on-premise when launching Server Side Sync. CRM for Outlook was in use for most users for the whole implementation. Users are syncing Calls, Tasks and Appointments. We are also using Exchange on-premise.

When enabling Server Side Sync we found that many (40,000+) duplicate calls and tasks were being created. We believe this was due to the history in Outlook and potential disconnects with the data (for example, the task knew it synced at one point but the Outlook profile was rebuilt and lost the connection so a new task was created).

Getting Started
When we launched Server Side Sync we learned several things we should have looked at prior to turning on for all users:

  • We enabled SSS for all users and all options at once (incoming email, outgoing email, and Appointments/Contacts/Tasks). When we were having the performance issues we changed incoming email back to CRM for Outlook.
  • The Email Server Profile was configured as part of our upgrade to 2016 so the "Process Email From" setting was set to October 2016. We updated this to the date SSS was turned on so older emails would not be processed.
  • Outlook sync filters were also configured to sync items after October 2016. We also updated these to the same date SSS was enabled.
  • Power: Throughout the troubleshooting we added more power to everything related to our asynchronous services servers. More CPU, more memory and additional processor cores.
  • Also verify that the Organizer field is on the form for appointments and being set correctly. Verify this is set to a real user who will be syncing For example we had this set to a service account for some appointments (set via workflow) and these did not sync because that user did not have a calendar to sync to.
  • Review your mailbox records and clean up any you do not need. If the user does not need to sync, do not turn it on to sync. If it is a service account or placeholder account of some kind, turn it off and disable it.

Nitty Gritty Settings
There are several settings that Microsoft recommended we update. I will explain the changes we made. When you look at these options you should look at your environment to see which values make sense.

Max Concurrent Connections
There is a suspicious setting in the Exchange Server Profile called "Max Concurrent Connections". This is related to the throttling policy in Exchange. We increased this setting to 100 initially (default is 10) and then increased to 1000. This means you also need to be working with your exchange team to determine what setting they are comfortable with.

AsyncMailboxesPerEvent
By default AsyncMailboxesPerEvent is set to 5. This means that 5 mailboxes will be attempting to process at once on the same thread. We were concerned that if there was an error in one mailbox it could delay the other 4 mailboxes in that group. So this setting was updated to 1. The default has been updated to 1 in some newer versions.

AsyncLongJobThreasholdInSeconds
The AsyncLongJobThreasholdInSeconds was updated to 86400. This value is typically lower for online environments where there are concerns about long-running async operations. The increase was recommended in our case to avoid any issues because of throttling (on the async server) because the sync was taking a long time.

X-Anchor Header and v8.2.3
In our fiddler tracing on the async servers we found that the X-Anchor mailbox header was not included. This is recommended as a best practice when working with exchange (source).

To add this header we needed to upgrade to the latest version of D365 on-premise 8.2.3. The X-Anchor change is not included in the release notes and is not enabled by default. To enable, after upgrading all servers you must update the Organization DB settings to set UseXAnchorMailboxInExchangeRequestHeader to true.

After upgrading to 8.2.3 and turning on the X-Anchor header we saw immediate improvements in the SSS behavior. Additionally some backlogs (SubscriptionSyncEntryOutlookBase table) of items to sync that we were monitoring began to improve after weeks of minimal change.

However we did have some issues with the upgrade. Check out my Upgrade from 8.2.2 to 8.2.3 blog for more information.

Related to SSS, the mailboxes processing during the upgrade needed to have "Test & Enable" repeated to keep functioning and the message sent from this process changed. Formerly the "Test & Enable" email message had a subject of "Test Message". Now it has a subject of "Your Mailbox is now connected to Dynamics 365". Post upgrade, we no longer saw issues with duplicate tasks being created but instead we did see cases of old (completed) activities being updated to a status of open. We monitored these cases via Advanced Find to clean up.

"Understanding" the Mailbox Details
When reviewing a specific Mailbox inside of Dynamics 365 there is a button on the ribbon to "Download Mailbox Details". This gives you a lovely file of information you do not know how to read. So here is what I learned about this file through the process.





  1. Current Date and Time in UTC - All the times in the file are in UTC. If you don't feel like doing the conversion (me!) then you can just check the file name to compare current time to the time in the file.
  2. Processing status - 1 means currently processing. 2 means not processing right now.
  3. Time of last Processing attempt - also stored in CRM "Date Processing Last Attempted"
  4. Next Processing for ACT - ACT = Appointments/Contacts/Tasks. This is the next time a sync will be attempted. This should be just a few minutes after the last attempted processing and should be in the future (i.e. if it's a past time then for some reason it didn't process when it was supposed to).
  5. Last Successful Sync - Time of last successful, completed sync
  6. Last Error on Sync - The last time a sync encountered an error
  7. Processing details - number of items successfully processed on last sync and number of items that failed during the last sync
  8. Error details - full details of all recent errors. These are also visible from the Alerts area of the mailbox. This will show you the full error details if it was not all visible in the interface.

Other Stuff 

There were a few things I skipped over. Throughout the process of working with Microsoft support we provided many logs, traces, mailbox statistics, mailbox details, memory dumps, perfmon details, etc. Some of these were from D365 but also some additionally from Exchange. We also used this tool to look at mailbox details but this did not lead to actionable steps.

After all of the steps above we are still monitoring progress and making sure things are processing as expected. To do this you can review the Mailboxes view and add the "Date of Last Processing Attempt" as well as the Status field. If it has not processed in a reasonable amount of time or is in a failed status, it is probably time to review the Alerts on that mailbox and to run "Test & Enable" again. Keep in mind you can also review all alerts from the Email Server Profile record as well (all Alerts for mailboxes linked to that profile).

Finally don't forget that Server Side Sync for appointments will send out an Appointment invite or changes to the appointment to all attendees including those external to the organization. This was not acceptable in our business so we used a workflow to add text to the appointment that was captured by Exchange to prevent send as recommended in this Community Post.

So has anyone else used Server Side Sync successfully? What has been your experience? What other settings or tips to improve performance have you tried?

Appendix: Queries
There were several queries our consultant worked on with Microsoft to gather more details. I take no credit for their creation, just for seeing the results.

Backlog Status
Shows items currently waiting to be synced.


select sq.*
from (
select sub.FullName, eo.ObjectTypeCode, e.name as ObjectName, eo.SyncState, count(*) reccount
from SubscriptionSyncEntryOutlookBase eo with(nolock) inner join
(select distinct e.name, e.ObjectTypeCode from metadataschema.Entity e with(nolock)) e on eo.ObjectTypeCode=e.ObjectTypeCode inner join
subscription s with(nolock) on eo.SubscriptionId=s.SubscriptionId inner join
systemuserbase sub with(nolock) on s.SystemUserId=sub.SystemUserId
where eo.SyncState<>0
group by sub.FullName, eo.ObjectTypeCode, e.name, eo.SyncState
) sq
order by sq.reccount desc;

Mailbox Status
Show status and details for a particular mailbox. For part of our troubleshooting we actually set this up to run on a schedule and capture the details for specific mailboxes every 30 mins. Update the names list at the end to the users you want to capture for.

select sub.FullName
,m.ProcessingStateCode
,m.ACTDeliveryMethod
,m.UTCConversionTimeZoneCode
,m.PostponeMailboxProcessingUntil
,m.OutgoingEmailDeliveryMethod
,m.Username
,m.ProcessEmailReceivedAfter
,m.ModifiedOnBehalfBy
,m.NoEmailCount
,m.MailboxId
,m.IncomingEmailDeliveryMethod
,m.EnabledForIncomingEmail
,m.NoACTCount
,m.EmailAddress
,m.OutgoingEmailStatus
,m.EWSURL
,m.OrganizationId
,m.PostponeSendingUntil
,m.EmailServerProfile
,m.ModifiedOn
,m.OwnerId
,m.LastActiveOn
,m.TimeZoneRuleVersionNumber
,m.LastAutoDiscoveredOn
,m.TestEmailConfigurationScheduled
,m.IsEmailAddressApprovedByO365Admin
,m.ModifiedBy
,m.Password
,m.TestMailboxAccessCompletedOn
,m.ExchangeSyncStateXml
,m.ProcessAndDeleteEmails
,m.ReceivingPostponedUntil
,m.RegardingObjectId
,m.EntityImageId
,m.CreatedOn
,m.EmailRouterAccessApproval
,m.StatusCode
,m.ReceivingPostponedUntilForACT
,m.StateCode
,m.PostponeTestEmailConfigurationUntil
,m.UndeliverableFolder
,m.MailboxProcessingContext
,m.Name
,m.IsForwardMailbox
,m.TestEmailConfigurationRetryCount
,m.CreatedOnBehalfBy
,m.AllowEmailConnectorToUseCredentials
,m.HostId
,m.LastMessageId
,m.OwningBusinessUnit
,m.EnabledForACT
,m.IncomingEmailStatus
,m.CreatedBy
,m.TransientFailureCount
,m.IsACTSyncOrgFlagSet
,m.ACTStatus
,m.EnabledForOutgoingEmail
,m.RegardingObjectTypeCode
,m.RegardingObjectIdName
,m.OwnerIdType
,m.LastSuccessfulSyncCompletedOn
,m.ProcessedTimes
,m.AverageTotalDuration
,m.LastSyncErrorOccurredOn
,m.ItemsFailedForLastSync
,m.LastSyncErrorMachineName
,m.LastSyncErrorCount
,m.LastSyncErrorCode
,m.ItemsProcessedForLastSync
,m.LastSyncStartedOn
,m.LastSyncError
,m.OrgMarkedAsPrimaryForExchangeSync
,m.LastDuration
,m.ForcedUnlockCount
,m.ProcessingLastAttemptedOn
,m.LastMailboxForcedUnlockOccurredOn
,m.IsServiceAccount
,m.VerboseLoggingEnabled
,m.FolderHierarchy
,m.OfficeAppsDeploymentCompleteOn
,m.PostponeOfficeAppsDeploymentUntil
,m.OfficeAppsDeploymentScheduled
,m.MailboxStatus
,m.OfficeAppsDeploymentError
,m.OfficeAppsDeploymentStatus
from mailboxbase m with(nolock) inner join
SystemUserBase sub with(nolock) on m.OwnerId=sub.SystemUserId
where m.statecode=0 and sub.FullName in ('Last1, First1','Last2, First2','Last3, First3');