M365 Philly Virtual Post Event Material

I wanted to provide a follow up to M365 Philly Virtual. At the time of the event, I wasn’t sure how we were going to share the recordings. A YouTube channel was created for SPS Philly which is the group that organizes the M365 Philly (formerly SharePoint Saturday Philly) as well as the Tri-State Office 365 User Group. The user group meets on the 2nd Tuesday of each month and will meet virtually for at least the remainder of 2020 and likely the first 3-6 months of 2021.

The recorded sessions take some time to edit so it’ll take some time before they’re all released but subscribe to the channel and get notified as the sessions are released.

I’m kicking around some ideas for content for the YouTube channel. I would prefer to release content occasionally on the channel so that it’s not only populated when we have an SPS event.

Want Content?

If you’re interested in following along, there are several places where you can do so.

For M365 Philly content, follow us on:

For Tri-State Office 365 User Group content, follow us on:

  • Twitter @TriStateO365
  • Meetup
  • If any sessions are recorded, they will be posted on the YouTube channel above.

Using AI Builder’s Form Processing Model and Flow to Extract Data from PDF Files

In the previous post, Getting Started with AI Builder’s Form Processing, I walked you through how to setup a model that will identify fields and their values in a pdf. In this post, I will show you how to use that processor to extract those values and store them as metadata for the pdf when it’s uploaded to a SharePoint document library – making the files filterable. Let’s dive right in.

Flows for AI Builder are special and do not follow the typical flow creation process. Typically, you would go to My Flows and start creating an automated flow. In this case, we want to go to Solutions and then click the New Solution button.

I’ll call this one SPL Invoice Processor. It also asks you to select a Publisher and I’m going to select the default publisher for the org. Your options are that or a CDS Default Publisher.

Once the solution is created, you’ll see it at the top of the page. Click on the link and then you can start creating your flow or other solutions. Think of SPL Invoice Processor as a container.

At the top of the page, you’re going to click on New and select Flow.

Give your Flow a name. Just to differentiate it a little, I’m going to call this flow SPL Invoice Processing Flow.

Next, you can select your trigger which in our case is going to be the “When a file is created in a folder” SharePoint trigger. In the screenshot, you can see that I’m searching for “file created” to narrow down my options below.

Once the correct trigger is selected, you can hit the create button and on the next screen, you’ll provide the url and document library name and then click the Next Step button to select your next action.

Next, you’ll want to filter down to the AI Builder actions and select Predict from the available actions.

Predict provides a single dropdown with a list of the available models. Select your model from the dropdown but if it’s not there, you may need to go back and publish your model. If it’s published, select “Enter custom value” which will turn the dropdown box into a text field where you can enter the name of your model. In my case, my model is called SPL Processor and it was in my dropdown. If you haven’t created a form processor at this point, check out my previous post where I walk through the steps needed to create one that will extract data from invoices. When you select a model, it’ll then ask you to select a document type and provide the document. Since I’m expecting pdf files, I’m going to enter “application/pdf” and provide the File Content that comes from the trigger.

We want to update the item fields values for the newly created/uploaded document. So I’m going to get the list of available properties first before I can update them. Add the Get File Metadata using Path action (If you use Get File Metadata, you’ll get an error when you try running the flow). This will allow you to get properties like the item id which will be needed to update that appropriate item in the library. For the File Identifier, we’re going to select x-ms-file-path-encoded which comes from the trigger.

Next, we are going to add the “Update file properties” action and get the details for our current file. We’re getting the item id from the previous action.

The Invoice Number, Client Name, Client Company, and Service Offered will come from the Predict actions output.

The end result will look like the following. Note that each entry that comes from Predict is the value so I’m providing “Invoice Number Value”, “Client Name Value”, and so on.

Now, it’s time to test this flow out. I’ll drop 5 invoices into the Invoices library and the following screenshot are my results.

One thing that you might notice above is that my invoices were 3 digits and you’re seeing a single digit invoice number above. That’s just SharePoint stripping the leading zero’s from the front of an integer. If I wanted to see 001 – 005, I could convert Invoice Number field into a Single Line of Text field. So there you have it. It’s pretty simple to automate the extraction of data from pdf files using AI Builder and Power Automate. This example was just a simple data extraction solution but you can do so much more. One thought that comes to mind is pulling the invoice total and if it’s above a certain number, kick off an approval process or notification. You can do the same if the number is too low. Maybe you have different steps depending on the type of service you’re offering? Once you can extract what you need, you can build all kinds of solutions based on that data. I encourage you to sign up for a free trial. It’s a pretty cool service.

Getting Started with AI Builder’s Form Processing

I’ve been speaking at conferences on various artificial intelligences topics lately and one of my demo’s is of AI Builder’s form processing. If you look around, you can find some examples of this and the common one is around extracting information from invoices. Invoices are the easiest types of forms to get a hold of so that’s probably why they all seem to be the same concept but with AI Builder’s form processing, the only requirement is that the forms are standardized.

Creating a Model

Getting started is super simple. AI Builder is an additional cost, but fortunately, you can kick the tires with a free trial. https://powerapps.microsoft.com/en-us/ai-builder/

AI Builder is a component of Power Platform so you can access it via Power Apps or Power Automate. In the next screenshot, you’ll see me accessing it from Power Automate. Under the AI Builder menu, you’ll want to go to the Build menu item which will show you the list of trainable models. (Lower on the page is a list of models that are already trained for you but we’ll be focusing on the Form Processing trainable model in this post).

AI Builder does a fantastic job of walking you through what you need to do. When you click on Form Processing, it’ll prompt you for a name for your AI model, it’ll tell you what you’ll need which in this case is 5+ documents with the same layout, and it’ll show you examples and best practices.

I’m going to name my model “SPL Processor” and hit the create button. Next, it’ll walk you through each step starting with uploading the 5+ documents that you will use to train the form processor.

I clicked the Add Documents button and it gives me some options for gathering those documents. I’m going to choose to Upload from local storage and I’ll upload 5 completed invoices from my local files.

A popup will appear showing you your selections and then you just need to click the Upload documents button.

It’ll then show you if the files uploaded successfully.

Analyzing Documents

After the files are uploaded and you hit the close button, you’ll be taken back to the Add Documents step and you’ll see your uploaded files plus an Analyze button below.

Once you hit the analyze button, a pop up will show you that it’s analyzing.

Identifying Fields that you want to Extract

Next, you’ll need to identify the spots in your files where you want to extract data. You’re documents should be a specific template so the fields should appear in the same spot each time.

Click the image of the file, and a pop up will again walk you through what it expects you to do. The processor seems to make an attempt of highlighting where the content will come from but this is your opportunity to define exactly what you want to extract. This is the processor’s attempt.

You can start highlighting the values that you want to pull out by dragging a box around the values. In the following image, you can see that I highlighted the invoice number and the callout shows and that is where you can provide the name of the field which I named “Invoice Number.” I’m going to repeat this process for the remainder of the fields.

The end result will look similar to the next image. There’s going to be a Confirm Fields button at the top right. Click on that button when your done identifying each of the required fields then repeat those steps for the other 4 documents that you uploaded.

The remaining documents are easier to tag. You can highlight the value and select the field from a list.


Next, you’ll want to Train the model. You see a summary of your model, which includes the fields that you selected. It’s just informational so you can click the Train button here.

Now you’ll wait a few minutes as your model is training.

Once it’s trained, you can click on the model and you can perform some quick tests and if all looks good, go ahead and publish.

Taking it out for a Test Run

If you click the Quick Test button, you’ll get a popup where you can drag and drop a sample into. It’ll give you a visual of all of the fields that it found. when you hover over the fields, you’ll see the name of the field that it identified, the value, and the confidence score. I find that when you are working with a structured file with typed responses, the confidence score is usually 100%. In my example, the city, state, and zip are very close to each other so they may cross over their boundaries and in those cases, you’ll see slightly less confidence scores and by slightly less, I’ve seen 98%. I’ve seen the confidence score go dramatically lower on a handwritten form where the handwriting was sloppy and crossed boundaries. For example, when the client name crosses over where the processor is expecting to see the company name.


At this point, you now have an invoice processor that is trained against a specific template. Your processor doesn’t need to be an invoice. As long as you have a consistent template, you can use that. In my next post, I’ll show you how to create a Flow that will use the processor to extract values that will be saved to a SharePoint list.

M365 Philly Virtual 2020: Behind the Scenes

If you follow me, you may recall that last year, SharePoint Saturday Philly returned for the first time in 4 years with a new group organizing it. It was something that we had been talking about for a while at user group meetings and finally, we pulled the trigger and it was successful. If you attended, you probably saw me running from room to room, non-stop, constantly checking on speakers and sponsors with a piece of paper where I was jotting down any issues that came up. That became my lessons learned sheet and I was going to make a few improvements to the process and event this year.

The pandemic hits us and all public events at our venue get canceled for a month – at first. I host the Tri-State Office 365 User Group and we meet every month on the 2nd Tuesday so that cancelation forced us to cancel our March meeting. Then we got word that the venue was going to continue to be closed so we decided to go virtual in April. SPS (or M365 Saturday Philly as we were calling it) was scheduled for May 9th but it was becoming clear that it wasn’t going to happen. The user group meeting in April went well and we postponed the conference but we started kicking around the idea of going virtual. We weren’t sure what the logistics would look like, but then the Microsoft 365 Virtual Marathon happened and that was all we needed.

The Planning

We watched the marathon and some of the team actually participated in it. They had some technical issues at the beginning of the event but it stabilized throughout. I learned the logistics that went on with it and Mike (one of our organizers) and I spun up our own practice Live Event to see how the controls would work. Manpreet, another one of our organizers, also had a massive event scheduled for a week before M365 Philly so we used what we learned there to prepare for this event but before that event, we still had quite a bit of work to do.

Sometime during the planning phase, Tom reached out and offered to help. He got us connected with someone who was also involved in the M365 Virtual Marathon and we all got on a call to understand what we needed to do, things we needed to consider, issues that we might have, etc. That meeting was invaluable because as I said, Manpreet had a massive event coming up and the tips we got from that call potentially saved us from a lot of pain.

To Find Sponsors or Not to Find Sponsors, that was the Question

We’re nearing the event and we were behind in our marketing. I also went back and forth on whether or not to look for sponsors. The reason we get sponsors is to cover our expenses which include food for the attendees and any swag that you might give out. Since we were going virtual, my only expense was going to be the raffle so I didn’t put anywhere near the amount of effort that I did the previous year in looking for sponsors. I took the sponsor package that I created the year prior, removed any details that came with being onsite, and slashed the prices. Any money that came in would go to funding the next in-person event since I didn’t really have any expenses this year outside of the raffle. Technically, there was one more expense. I bought a cooler for the drinks prior to the cancelation of the in-person event. I did send emails out to a few businesses and that was near the date of the event so I wasn’t expecting to get sponsors. Typically, you want to start reaching out to businesses months in advance because they budget for things like that and reaching out sooner would allow them to account for it. The planning for this event was done in roughly 2 months which is shorter than the time you spend on an in-person event. In the end, businesses affiliated with the team sponsored the event.


Mixed into all of the above was the reopening of the call to speakers. We had some submissions from the in-person event still in our queue but when we announced that it was going to be virtual we got an uptick in submissions from an international pool of speakers – which, thinking back on that was so cool. We ended up with 100+ sessions submitted. We used Sessionize to get session submissions but hadn’t used it before so we made some assumptions and I found the lack of documentation to be annoying. It’s not difficult but there are a few buttons where you’re thinking to yourself, “what’s about to happen here?”

What I did next was add the team to Sessionize to make the selections. I also configured it so that the speakers were anonymized (very cool feature by the way). When we were making the selections, the names were replaced with fake name. (Manpreet was wondering why he didn’t recognize any names for a day or two). Sessionize then puts 3 sessions side by side and you can rank them by 1st, 2nd, or 3rd. You can also skip or ignore a session. Let’s say you don’t know enough about the topic to make a decision, you can just ignore it. I don’t know what that does to the calculations though – like i said, the documentation is non-existent.

You also have the option of grouping the selections by their category so if the speaker says their session is a developer topic, we can pit the developer topics against each other or we can mix all the topics together and do it that way. The sessions also appear randomly so you will end up voting on a session multiple times but you would be ranking them against a different group of sessions.

The Selections

We did a lot of work in a short period of time. We put this event together in a shorter period of time than we would’ve if it were an in-person event. Because of that, I made the decision to keep the call for speakers open later than I should’ve. I should’ve closed it 1 or 2 weeks sooner to give the speakers time to prepare or make arrangements. I didn’t account for the number of submissions to be so much higher so I could’ve closed it sooner.

Once we ranked everyone’s sessions, Sessionize gives you an overall rank for each one and what we did next was we sorted each session from highest to lowest. We then just selected everyone from top to bottom and we skipped sessions where the speaker already had a session selected. Many speakers submitted 2 or more topics so there were a few sessions skipped. I also, initially, skipped my own session which was in the top 20 selections. (I wonder if the team knew that it was my topic). I ignored my own session when I saw it in the head to head rankings.

When the initial 33 accepted sessions went out, many of the speakers accepted. A few pulled their sessions because they weren’t available during the event and one didn’t confirm so we simply selected the next best presentation where the speaker had not already been selected. There was a point near the day of the event where we had 2 gaps to fill and I felt like that was too short of a notice to accept new speakers. Rather than asking the speakers to present a 2nd topic, Manpreet and I added our sessions to the schedule.

My original plan was to roam the event checking in on sessions. In the end, I produced the Eagles virtual room from beginning to end and placed my session on the first day to get it out of the way early so that I could focus on the event. Manpreet became the roamer, looking into issues as they came up.

The final 3 day lineup was impressive. Our keynote speakers were great, our speakers were informative, and the feedback was overwhelmingly positive.


The cool promos, speaker banners, day schedules, and social media push were all Tom. He did a great job putting that material together. The tweets alone would’ve been very difficult to do while also focusing on the event. He made sure that something was going out as speakers were about to go live.


We had 9 producers (including the 4 organizers) to manage this event. You really need one producer per track and an additional person who can help with any technical issues that may come up. In our case we needed 4 producers on the first two days and only three for the last day plus that roamer/support person. The event ran 4 hours each day plus an additional hour on that last day for the wrap up. M365 Philly Virtual was in the middle of the work week, so we wanted more producers just to spread the load. I couldn’t ask the team to take 13 hours out of their work week. We had several people volunteer to help and we were able to give people a break. The team stayed on anyway, but the break allowed them to focus on support.

The Event Itself

For the most part, the event went well. He had the hiccup right out of the gate with the 1st keynote audio. I talk about it in a previous post but I neglected to enable system audio so the attendees couldn’t hear our audio. After that, day one went smoothly. The producers were able to handle any issues that speakers had and the feedback from day one was great.

Day 2 apparently was without incident. I am not aware of any issues at all. Day 3 however, had some issues. Apparently, there was a service degradation issue that day so our attendees were having issues watching the keynote and a little bit of the first sessions. It wasn’t everyone either. Two of our organizers were seeing issues on devices where they were logged in as attendees while another organizer and myself were not experiencing issues. Manpreet put in a call with Microsoft and got a quick response but there wasn’t anything we could do. I believe the suggestion was to log in with a mobile device, but one attendee reported in the Q&A that it didn’t matter which device he/she was using, the experience was the same. Shortly after the first speaker session began, all indications were that things started to stabilize.

My Day 3 Keynote Fumbles

While scrambling to figure out why we were having connection struggles, I became part of the show… and I did not see that coming. Going in, I knew that our 3rd keynote speaker likes to be interactive but Live Events doesn’t allow for much interactivity. The audience can ask questions via the chat, producers and speakers can see the questions but the audience can’t unless we publish them. There’s also a 10-15 second delay for the audience so if you ask them a question, you had a 10-15 second wait before they even began responding to it which is not idea for live interaction. While he was speaking, I was chatting with the team trying to figure out what the deal was with the connectivity issues. That’s when things got interesting.

So our keynote speaker asks a question that I partially heard. Something about musical collaboration. I scrambled and responded with “uh, I’m not good with pop culture references” but I should’ve guessed the answer because I’ve heard him ask that question before. Face palm! Apparently the question was what bands collaborated on “Walk this Way.”

So I hang my head and go back to the issue at hand and more questions started coming. I remember saying in the team chat “WHAT IS GOING ON?!” followed by the following gif.

That’s when Tom said “You’re part of the keynote now.” At that point, I left the issues to the team and I stayed focused on the talk. Now, I actually am bad at remembering pop culture stuff, and I probably would’ve only gotten half the question right was I not distracted. It was a funny experience thinking back on it. My wife gave me a hard time about that one too.

While I’m at it, there was another funny keynote moment that happened on day 2. I have a tendency to speak low in general but even more so when I speak on the phone or on a microphone. I don’t know why, I guess I feel like I’m yelling when I speak normally on those devices. Anyway, on day one, I was doing that very thing and I guess I came off as slightly monotone. Right before going live on day 2, Tom and I were having a conversation with Heather Newman and 1 minute before going live, Tom says “Hey Jason, use your excited voice” and goes on mute. My response was “wait, what?!” And then we go live.

Wrap it up

Overall, the event was simultaneously fun and stressful. We were doing something new – connecting an international group of speakers to an international audience over a virtual conference. We provided great value to the attendees. We connected our speakers to a new audience. We had people connecting from the US, UK, Netherlands, India, Mexico, Spain, Canada, Germany, China, and more. The 4 of us enjoyed providing this type of value to people and have done several events together. I’m grateful to have had the opportunity to work with this team in putting this event together and I look forward to working with them on future events.

Presenter Tips for Virtual Events

July 2020 has been busy for me. I was involved in the LightUp Virtual Conference as a producer for 5 sessions, and a speaker for 1 session. In between my producer and speaker duties, I left the event to host my user group. The next day, I helped organize a virtual lunch and learn at work, and one week later, I’m organizing, producing (12 sessions), and speaking (1 session – included in the producer totals) at M365 Philly Virtual, which was a 3 day virtual SPS Event. If we add them up, I was involved in 20 virtual sessions in a 9 day span and here are some of the things that I took away from them.

The Tech Check

Probably the single most important thing you can do is a tech check. Organizers should schedule time before the event to meet with everyone involved and make sure that they can:

  • log into the event with the credentials and machine that they will use during the event,
  • share their screen if necessary,
  • make sure their web cam works,
  • make sure their audio works
  • make sure you understand how the tools work (this one is mostly for producers)

Even if you have done virtual events before, attend the tech check. Probably the most common issues that I saw was presenters being unable to log in, share content, or use their laptop audio which forced them to dial in. Each of these happened more than once and in each case that I can recall, it was a work laptop and we believe that there was a policy put in place to limit features when connecting to an “outside” tenant.

Experience Check

When doing a virtual presentation, you’ll want to remember to do a few things so that your audience can enjoy the experience and not decide to leave the virtual room for another presentation. If you’re going to use your web cam, make sure the lighting is right. A light directly above you might appear like a harsh spotlight. A light directly behind you might make you look like a shadowy Bond villain.

Image result for shadowy bond villain

A light directly in front of you/behind your web cam should balance you out a little. Play with the lighting to see what works best for you.

Another very important thing to remember is that you may have someone watching that has vision trouble. If you’re showing text in a slide or code, bump up your font size so that everyone can see. If there are things that you can’t control, like the font size in your browser’s address bar, use a magnifier tool. Windows has a tool called Magnifier. Hit the Windows key and the + key to zoom in. Hit the Windows key with the key to zoom out.

Similarly, your browser content should be bumped up. I got feedback from one of my session where someone mentioned that they had trouble seeing a Flow that I was presenting. I spoke through each step so that everyone could follow along but that’s not enough. An attendee must be able to see what your talking about so make sure you bump up whatever you’re presenting and keep in mind that it may not look as clear for others. The feedback was anonymous so thanks for the tip, whoever you are.

Video Content

This one is a little tricky and you need to test this one out with someone. I think it’s fair to ask the organizers if you can test any video content during the tech check. I was a victim of this during our pre-recorded keynote session and I witnessed issues with other videos.

When I was sharing the keynote, I neglected to check a very important checkbox in Microsoft Teams. When you are playing a video in Teams, you need to check the “Include system audio” checkbox; otherwise, your audience will not hear the video.

I’m playing the keynote, and I start seeing the Q&A start to light up with people letting me know they can’t hear. I think someone may have given me the answer on how to fix it but I was looking somewhere else. We ended up not showing the keynote that day. Now we did a test run, but the people involved were producers and we heard it fine. The attendees were the only ones who couldn’t hear and if we had tested with all kinds of users, we may have caught that sooner.

Another issue that we saw was when a presenter had a video embedded into a PowerPoint slide. I’m not sure why it was happening, and I still need to look it up, but whenever the video played, the screen would freeze. So as the speaker kept presenting, it started to become clear that we were supposed to be seeing something other than the slide that was being shown.

The 3rd issue was with another keynote. In this keynote, the speaker also had a video embedded in a slide and it worked just fine, but the audio was super loud so when he began commenting on the video, we couldn’t hear him. Luckily, the video was an entertaining clip showing off object detection in an action packed 007 scene.


This one is not that big of a deal but since it’s a feature in PowerPoint, I feel it’s good to share. Often times, people will put their deck in presentation mode which will take up the full screen and hide your toolbar. During their presentation, they come to a point where they need to demo something so they take the deck out of presentation mode to access their demo and then when they go back to their deck, they switch back into presentation mode. Well, you don’t need to go in and out of presentation mode. Simply hit ctrl + T and your presentation will stay in presentation mode but your taskbar will appear. This only matters if you are don’t have a 2nd screen to project from or if you happen to be in presentation mode on your main screen and duplicating that screen to another that people are watching.

Things that are out of your Control

Virtual events are difficult because you can’t simply run over to someone and ask for help. You have to send a chat message, wait, and then troubleshoot. There’s going to be random tech issues that you can’t do anything about. I listed a few above. I had one session that I was producing where the speaker’s Wi-Fi gave out and he couldn’t rejoin the event. In our final day of M365 Philly Virtual, there was a reported service degradation going on early in the day causing some people to not be able to see the keynote or experiencing large delays. In those situations, there’s really nothing you can do. That’s part of the risks of doing virtual events. Take it in stride, communicate with your audience, and keep your fingers crossed that it doesn’t continue. You just have to roll with it.


Practice! Show your presentation to others, get feedback. See what works and what you can tweak. If you are an attendee, provide feedback. Presenters are putting a lot of effort into creating demos, preparing slides, practicing their presentations to fit within the allotted time. If there’s something in their presentation that would’ve made your experience better, share it. I now know that when I’m presenting something in Power Automate, I should change my browser zoom settings so everything of importance is visible to all and I may not have ever thought of that. It took my 4th time giving that talk to get that feedback and now I’ll know to do that if I give that talk a 5th time.

M365 Philly Virtual Event

Last year, we brought back SharePoint Saturday Philly. Prior to that, it had been 4 years since the Philadelphia area saw a SharePoint Saturday. The event went well and we were excited to begin planning for this year’s event. Based on feedback, we decided to move the event to May instead of June. Additionally, we decided to change the name and call it M365 Saturday to reflect that the event wasn’t really just a SharePoint event, but as we all know, this year was full of changes for everyone and practically everything.

Things Change, New Plans Begin

Covid-19 hits, and the event went from a certainty to a day by day, let’s see where it goes situation. Eventually, we got word that there weren’t going to be any more public events at our venue for some time and we had to make a decision. Early on, we kicked around some ideas about possibly turning it into a virtual event.

We talked about whether we should keep it on a Saturday. We felt that no one was going to want to sit at home in front of their laptop all day on a Saturday after doing that very same thing all day that week. I kicked ideas around with members of my user group and one thought was to treat it similar to a user group where we would meet each night for a week with multiple sessions each night. That also felt like it would be exhausting for everyone including attendees.

The Decision

Finally, we decided to treat it like a lunch & learn and schedule sessions for 3 days. The ideas was to treat them as coast to coast lunch & learns starting with the first sessions at noon EDT and ending each day at 4pm EDT (or 1pm PDT). Obviously, we would like attendees to sit in on as many talks as they can but scheduling them within those hours, we felt, would give people an easier time to catch at least a few during their work days.

Now the plans are set, topic submissions are flowing in, speakers selections will start a little early, and testing the technical side of this event is underway. I’m looking forward to our 2nd annual event even if it isn’t what I envisioned it was going to be. This pandemic has dramatically shifted plans and given us some cool ideas for the future of M365 Philly.

Event Information

M365 Philly Virtual is on July 21-23. For more information, visit our site at SPSEvents. There you will find the attendee registration form, Sponsor request, and if you’re interested in speaking, there’s a link to submit topics. Some selections will begin early (week of July 6th) and the final selections will occur next week (week of July 13th).

I'm Sick of Meetings

We’ve all been disrupted by COVID-19. I have coworkers losing their minds having to work from home. I personally had some pretty productive days during the first few days of this mess but then…. the meetings started to pile up. If I’m not in a Teams meeting, I’m on a Zoom, a phone call, and in one accidental case, a Skype meeting. I understand that it’s the obvious way to stay in touch, but to be honest, when everyone defaults to scheduling a call, it’s a drain on productivity and makes it difficult to effectively do your job. When that happens, it’s time to start setting boundaries.

Should I Attend this Meeting?

The first question you have to ask yourself is, “do I need to be in this meeting?” Most people will say, “yeah, I was invited.” Not so fast. Maybe start by asking questions like:

  • Would anyone notice if I didn’t attend?
  • Do I have anything of value that I need to provide?
  • Am I going to provide more than a short update that can be sent via an email?
  • Am I saying anything new since the last time we met?
  • Do I need to attend the full hour?
  • Was I snoring last time?
  • Could this be a simple email/chat message?
  • Do I know what this meeting is about?

Now, that last question is important. If a meeting doesn’t have an agenda or a goal, it’s pretty safe to say that the organizer is going to be winging it. I’m guilty of this myself but with the whole social distancing/self quarantining nuisance, it’s time to stop.

What can you do?

Meetings are ingrained deep in people’s bones and in their souls and you’re probably not going to change them while we’re dealing with this pandemic so I guess that’s it, I’ve got to suck it up and attend meetings. NO! Here’s what I’m doing and it’s sort of simple. Block your calendar from meetings with your own meeting. That’s right! Fight fire with fire. Don’t go crazy and block all of your available time. You just need to block enough time to eliminate frequent context switching and be productive.

You can manually do this but it can be tedious. If your organization uses MyAnalytics (https://myanalytics.microsoft.com) like mine does, you can use that tool to automate it. Let’s take a look at the product because if you haven’t sensed it from the above, I’ve had it with meetings.


MyAnalytics provides personal productivity insights. Now, the numbers below are patterns from the last 4 weeks but I’ll say that I think my numbers are slightly off. I’ll explain later.

There are 4 areas where the tool with help.

  • Focus
    • Shows you how much focus time you have. Focus time is defined as 2 consecutive where you’re not in a meeting.
  • Wellbeing
    • Shows how much Quiet time you have. In other words, the amount of time outside of your working hours (which in my case is set to 8am-5pm) that you haven’t been sucked back into work.
  • Network
    • Shows you how many people you’ve collaborated with in the last 4 weeks and past 12 months. So the people you’ve emailed, chatted, met with in that time. It even shows you things like the amount of time you’ve spent collaborating with specific individuals and what percentage of their emails you’ve read. I’m not going to show those numbers but I have someone in my list that I’ve only read 25% of their emails. Yikes.
  • Collaboration
    • Shows how you communicate throughout the day.

The Categories and Numbers

Ok, so I mentioned earlier that I think my numbers are off so now is a good time to explain. The tool suggests that 63% of my time has been focus time but it’s basing that number on my calendar and doesn’t (can’t) factor in impromptu meetings which seems to be my life lately. So 63% is wrong because with the number of meetings that I get pulled into, I know that I don’t often get 2 hours of focus time; HOWEVER, I will now start having more focus time.


The Focus page lets you automatically schedule focus time. You can see the green checkmarks in the top section under my focus plan. On each of those days, it found 2 hours that someone hasn’t monopolized and blocked it off with a meeting. On days that it couldn’t find 2 consecutive hours, it booked 2 separate 1 hour blocks for me. As soon as I did that, people stopped booking my time and started asking me when would be a good time or “hey, are you free at this time?”

The Focus page also gives you some good tips and insight. So you can see that I read more than half of my emails within 30 minutes of receiving them and that my calendar for the upcoming week usually fills up by Friday.

You can click on the View Suggestions link under each section to get advice with justification behind the suggestion.


Wellbeing, or the “are you in danger of burning out” page, shows you how many quiet days you’ve had in the past 4 weeks, or days where you didn’t work outside of normal working hours. I seem to average 3 quiet days per week and that’s horrible. I’m a bit of a workaholic and that’s partially due to my imposter syndrome. If I’m not working, I’m studying something. It’s unhealthy, and this page will just slap you in the face with that fact. I’m not surprised by the pie chart on the right.


The Network page is less of a slap in the face as it simply shows you how many people you’ve interacted with. In the last 4 weeks, I’ve emailed/chatted/met with 40 people and 140 in the past 12 months. Further down on the page, it also suggests people who you might want to keep in touch with or flag as important contacts.


The Collaboration page shows insight into your meeting habits. This one shows that I typically spend 30% or 13 hours of my week in meetings and 75% are recurring (again, not all my meetings are on my calendar). Realistically, I average somewhere around 17-22 hours / week in meetings.


I’m sick of meetings and the reality is that while we’re dealing with this pandemic, it’s going to get worse and we need to take action so that our constant connectivity doesn’t hinder our productivity. If you have MyAnalytics, use it so that you can understand how you spend your time and certainly use it to take control of your time. That simple feature to automatically block time is wonderful. If you don’t have MyAnalytics, that’s fine. You won’t have some of the cool insights but that shouldn’t stop you from booking 2 consecutive hours on your calendar where you can take care of what you need to take care of.

Troubleshooting SPFx running in a Docker Container

I recently had a chance to do a “3 city tour” for the Global Microsoft 365 Developer Bootcamp in Iselin, NJ, Malvern, PA, and NYC. I got to present alongside Tom Daly and Manpreet Singh. During the NYC event, we were joined by Peter Ward who presented the 4th session. (Session Info)

During those presentations, I walked our audience through setting up their development environment. That included, creating a tenant, setting up the app catalog, installing node, gulp, yeoman, and the spfx yeoman generator. We saw all sorts of errors during this session, from permissions issues, to version conflicts. Because of those issues, I mentioned during each session that Docker is a good way to avoid the issues that we were facing and a good way to speed up setting up an environment for new developers or new project members.

Setting up Docker was beyond the scope of these sessions because of time and we had all levels of experience in the rooms. From people who never wrote a line of code to experts.

Once you have Docker up and running, there are a few steps that you’ll need to do before you can get your spfx web part running. For this post, I am using a Docker image that was built from node:8.9.4 and I am using SPFx 1.9.1. I also created a simple SPFx web part with all the defaults. Node 10 is the recommended version.

I won’t walk through setting up Docker here. I’m assuming you have it installed and understand how to run a container. If not, Waldek Mastykarz is a good source for getting started.

Workbench is Unreachable

Once you have a solution, the first thing you likely will try to do is run a gulp serve to make sure everything is running and instead of being able to access the workbench, you’ll be greeted with the following.

In order to fix the unreachable page, you’ll need to make edits to the serve.json file found in your project’s config folder.

The old file will look like this:

  "$schema": "https://developer.microsoft.com/json-schemas/core-build/serve.schema.json",
  "port": 4321,
  "https": true,
  "initialPage": "https://localhost:5432/workbench",
  "api": {
    "port": 5432,
    "entryPath": "node_modules/@microsoft/sp-webpart-workbench/lib/api/"

We need to add a hostname that points to Your new serve.json should look like the following.

  "$schema": "https://developer.microsoft.com/json-schemas/core-build/serve.schema.json",
  "port": 4321,
  "https": true,
  "hostname": "",
  "initialPage": "https://localhost:5432/workbench",
  "api": {
    "port": 5432,
    "entryPath": "node_modules/@microsoft/sp-webpart-workbench/lib/api/"

Running a gulp serve again should fix the workbench.


The next issue comes when trying to load the web part. You’ll see an SPLoadedError.loadComponentError message. I’ve seen the web part work the first time you drop it on the page, but then this error comes up after refreshing or adding the web part on the page a 2nd time.

Go to the following path in your project: \node_modules\@microsoft\sp-build-web\lib\SPWebBuildRig.js. In that file, somewhere around line 91, you’re going to find the following:

const serve = spBuildCoreTasks.serve;
            debugBasePath: `${serve.taskConfig.https ? 'https' : 'http'}://${serve.taskConfig.hostname}:${serve.taskConfig.port}/`

After the first line that sets the serve constant, you’re going to want to wrap the mergeConfig logic with an if statement. It should look like the following when you’re done.

 if (!spBuildCoreTasks.writeManifests.taskConfig.debugBasePath){
                debugBasePath: `${serve.taskConfig.https ? 'https' : 'http'}://${serve.taskConfig.hostname}:${serve.taskConfig.port}/`

You also need to set the debugBasePath that is referenced. In order to do that, you’ll need to go to \config\write-manifest.json and add the debugBasePath with the localhost as seen below.

  "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/write-manifests.schema.json",
  "cdnBasePath": "<!-- PATH TO CDN -->",
  "debugBasePath": "https://localhost:4321"

Once those 3 steps are done, you should have a functioning web part. Just make sure you re-run gulp serve and load the page from https://localhost:5432/workbench. That will redirect you to https://localhost:4321.

Planning SharePoint Saturday 2019: Behind the Scenes


I recently had the pleasure of organizing SharePoint Saturday Philly on June 22nd. The last time that SPS Philly was around was 4 years ago. This was my first time organizing this event, or any event for that matter, and I thought it would be nice to write down my experience.

Early Planning

During a meeting of the Tri-State Office 365 user group, a brief discussion broke out where several people expressed their desire to see SPS Philly return to our area. After that meetup, a few of us got together and started discussing what it would take to restart the event. We kicked around a few basic ideas like how to run the event with a tight budget, how many people to plan for, where to buy/rent the required items (tables, coffee, sodas, etc), and identifying the people that we need to speak to in order to host the event at the Microsoft Malvern office. We even discussed whether the event should be called SharePoint Saturday Philly or Office 365 Saturday Philly. I chose to go with SharePoint Saturday for this year, but I’m certain that it’ll go by a different name next year.

In January, I decided that I was definitely going to give it a shot and needed to choose a date. In talking with someone involved in past events, we felt it was best to avoid the winter months so I was looking at May 25th but the SharePoint Conference was scheduled for the week before. SPSDC was also eventually lined up for the beginning of June. I wanted to keep some distance from those two events so I then thought, “how about mid to late July?” No luck, SPSNYC was lined up for July. (I’m actually writing this on the day of SPSNYC.)

I finally decided that June 22nd was going to be the day. In February, I reached out to the SPS Events folks to request a site for my event info. They set me up with one and sent me a pdf which was essentially a checklist of common tasks for the event.

Sponsors and Speakers

During the month of February, I started to figure out how I was going to collect payment from sponsors, what my sponsor package would look like, setting up a domain and a social media presence. In March, I got word that another person, Manpreet Singh, inquired about hosting SPS Philly so I reached out and he and I met up and started to finalize the sponsor package and our plan for reaching out to businesses who might be interested in sponsoring. On March 15th, the call for speakers opened and then the call for sponsors on the 18th.

Over the next few months, we made sure to mention the event frequently on social media. I aimed to tweet at least two times per day on @SPS_Philly Shortly after, the speakers started to submit topics. Now things started to get interesting.

I started reaching out to potential sponsors via email; usually in the evenings or during my lunch break. This method resulting in a very low response rate. Many times, I would reach out to the wrong contact. If I couldn’t find a contact person, I would reach out to a sales or marketing team or a business’ info or contact account. The info/contact accounts were practically useless but they were last resort. I’m not sure if those accounts were monitored but I did start receiving marketing material from those accounts in many cases. There were a couple of businesses that showed interest very early on, but never pulled the trigger.

I eventually started getting responses and in many cases, it wasn’t until the 2nd or 3rd follow up email. I kept a spreadsheet of everyone I contacted, when I contacted them, if they responded, and any notes from our exchanges. Then things started to get scary. At this point, I’m committed. There was nothing that was going to make me postpone or cancel this event. That’s when I saw 2 tweets by the previous organizer that made me nervous. The 2nd tweet was as follows:

I kept pushing forward, reaching out to local businesses, businesses that deal with Office 365 and Azure, businesses that have sponsored regional events, and even some that were sponsoring the SharePoint Conference. More bad news was around the corner. I spoke to another local event organizer who mentioned that local sponsorship in general has been down and to compensate, he needed to start charging attendees to come to events so that the sponsor fees could be low enough to entice sponsors. This wasn’t an option for me if I wanted to stay under the SPS Events umbrella. One of their only rules is that the events are free to attendees. I had to keep reaching out to businesses. My co-organizer also attempted to reach out to some businesses, in person, at local events. They also expressed interest but never pulled the trigger.

Failed Diversity and Inclusion

While all of this was going on, I wanted to do something to promote diversity and inclusion, partially because my wife and I had a daughter the previous year and since then, the topic has been a little more front and center to me. I had no idea what this was going to look like at first and by the time I started doing anything about it, it was probably to late. I reached out to a couple of women led groups in the tech industry but didn’t get a response. I spoke to others and no one could think of what it would look like. It wasn’t until the event was nearing that I finally had some ideas but it was too late to organize anything. At a minimum, I thought it would be cool to have 50% of our speakers be women but we never got enough submissions to do that. We received a wide variety of topics so it worked out that I was able to accept every presentation submitted by a woman. A few backed out Every woman that submitted a topic was accepted; the topics were varied enough that I didn’t have to make decisions on one person’s presentation vs another. Several, 4 or 5, had to back out. In the end, we had 3 women speakers.

Budgets and Estimates

Meanwhile, my persistence was starting to pay off and the sponsors started coming in. Others started responding to my messages but I reached out to a few more just a little too late for them to budget for the event. Now that the funds started to come in, I started to solidify my shopping list and estimates. The food estimates were spot on. We had some left overs but not too much. The drinks, however… that was a different story.

I found a breakdown of items purchased for past events and I based my numbers off of that. The past event had 300-400 people and I capped this event at 200 so I bought half of the items listed. Well… it seems that people don’t drink sodas anymore (I don’t either) and it showed. Here are the left over drinks and there were many more that you can’t see in this photo. I still have the water, orange juices, and apple juices. I gave away the sodas.


In addition to buying too much soda, I didn’t get enough coffee. I went by the stores judgement on how much I would need for the amount of people who were planning to attend and it was grossly under estimated. The first shipment of coffee was done before the first session ended. It may have been done before the first session began. A 2nd shipment came in with the lunch order and that one lasted longer.

I also rented some tables and that was the one thing that I expected to go smoothly and oddly enough, it didn’t. I placed an order through a local shop who services that location frequently. I ordered a good number of tables and asked for them to be delivered on Friday as late as possible. We agreed to 4pm. It needed to be late because Microsoft shares that building and they didn’t want to interfere with shipments for the other business. Well, they delivered the tables at 8am on Friday and it turns out, that’s not unusual for them. Luckily, it didn’t interfere with other shipments that day.

Speaker Dinner

Over the couple of months leading up to the event, my biggest concern was the budget; especially after seeing those tweets about the past event and getting feedback about recent events. I shopped around quite a bit when deciding what would be on the menu and from where. Once we were nearing the event, it was looking like I was going to have a solid budget. I was keeping the speakers up to date about looking for a venue for the speaker dinner. It was between a hotel restaurant where I secured a room block for the speakers, and P.J. Whelihan’s Pub. The hotel got back to me fairly quickly and there wasn’t much time left so I went with the hotel. That turned out to be a good decision because the food was pretty good. I was glad that we were able to have the dinner. It was great getting to know these speakers.

Game Day

The doors opened early for us to setup. I had some volunteers arrive at 7am and we started unloading the drinks and moving the tables. Breakfast also started arriving. Surprisingly, the setup continued all the way until the beginning of registration. I planned on saying a few words of welcome in the beginning but never got around to it so everyone just went from the food to their sessions. From here on out, I was running around the building and it wouldn’t stop until happy hour. My phone is setup to track my steps. It’s something that I setup for a work competition a while back and never turned off. By the time lunch rolled around, I had crushed my daily goal. I was hoping to actually see a few presentations but that never happened. Between checking on registration, food, making sure the sponsors had what they needed, and checking in on the speakers, I didn’t have enough time to actually sit in on any of them other than to take pictures.


The feedback for the event was overwhelmingly positive. The speaker surveys where very positive as well as the event surveys. The event survey asked the attendees to tell us what they’d like us to change and what we shouldn’t change. The attendees really enjoyed the venue and the food. A few of the changes requested included, adding more time to the sessions and less time to the breaks, adding opening remarks, better communication around session changes and the lunch and learn sessions, more sessions, and use PowerApps/Flow to collect feedback. Someone suggested Philly themed food like pretzels (I did look into it but most of the food was coming from the same location for simplicity and they didn’t have pretzels).

I agreed with most of the feedback and plan to address them next year.

Lessons Learned

Some people saw during the event that I was running around with a schedule in my hands. On the back, I was making a list of lessons learned. Here are a few:

  • Choose an earlier date
  • Order more coffee!!
  • Make time for opening remarks
  • Use eventbrite for all registrations (including speakers and sponsors)
  • Buy less soda
  • Set a deadline for lunch & learn topics (our platinum sponsors got their own lunch sessions but I didn’t get all of the topics in time to add them to the schedule)
  • 5 sessions per hour instead of 6. We did 6 sessions per hour b/c the venue had strict room capacities but to be safe, I chose to not account for no-shows.
  • Make sure I have scotch tape (thanks for the tip Nancy!)
  • Delegate better. I have a tendency to take on everything when it’s crunch time but now that I know what’s involved, I should be able to manage that better.

There are more items on my list but these were some of the more important ones.

Final Thoughts

Overall, the event was successful but we did have a larger than average no-show rate. On average, an SPS event has a 20-30% no-show rate. I suspected that it would be a little larger for us and it turned out to be correct. We had close to 50% no-show. We had a week of terrible storms and that Saturday was about as perfect of a day as you could ask for. We had people coming in and out too so it might have seemed a little more than that to attendees. There were people who only stuck around for the morning sessions and people who only attended the evening sessions.

I joked that the event was like my wedding day. Fun, lots of emotions, and in the end, a bit of a blur. I’m looking forward to doing it again next year and I’ve even started looking into hosting other events. Nothing confirmed yet, but I’m looking into a few things. If I do, I’ll keep you posted.

I couldn’t have done it without the help from so many people and I am very grateful for all their help. From Mike Mukalian, Manpreet Singh, Tim Ferro, Bill Wolff, and Tom Daly for their advice, direction, and help, to the volunteers, speakers, sponsors, and attendees who helped make it all a success. Thank you all.

Office 365 AI Series

Over the course of a couple of years, I’ve written several AI related topics that occasionally get brought up so I thought I’d group them together. Enjoy!