Frequent Suite Bar customization nightmares in SharePoint Online are here to stay

Today on a SharePoint Branding webinar (thanks everyone who could attend, btw), among other things we talked about customizations to SharePoint Online component such as Suite Bar and how unreliable this can be. Well, perfect timing, to prove this point, I’ve noticed subtle Suite Bar change in Excel Online (part of SPO).

Before the suite bar looked pretty useless and thick for Excel Online and other web apps; now it looks like you can change the mame of the file right the suite bar just by clicking on it; you can also share the file:


Those are pretty handy functions but I bet there is markup change; luckily this change is not the same in regular sites such as team sites etc, so no need to panic. TO prove this, I’ve checked the DOM and here is how it looks in Web Apps:

web apps

Which is completely different from team site suite bar:

team site

Moral of the story: stop customizing Suite Bar people :)!


Gearing up for SharePoint Online project

Having several different SharePoint Online projects completed over the last couple of … years really; several bigger ones still ongoing, I thought I would share few things with you that might help you from a technical perspective to avoid things that can’t be done.

In no particular order – here they come:

1. SharePoint Apps are not your typical web parts, there are limitations related to functionality and branding
Ok, so you still have web parts in SharePoint Online but everyone out there says “no more web parts, build only apps”. So you might think, well apps are new web parts. Not quite.
Some of the limitations of SharePoint hosted apps include:
-Only client code is supported in apps
-Where you need it or not – each app gets an app site
-Each app needs to request set of permissions which users just allow otherwise you app won’t work
-Apps parts in apps run on host sites as iframes – so you can’t access or manipulate DOM of a parent

2. Be careful with promised custom functionality in your workflows, you are limited to out of the box workflow actions

SharePoint Online allows you to build workflows in SharePoint Designer – this is old news. However, you can also build workflows in Visual Studio and deploy it to SharePoint Online; just use the Visual Studio 2013 workflow template. The limitations of such workflows are to actions already deployed within SharePoint Online. In other words, you can’t run your own custom actions. Having said that, out of the box actions are quite extensible and there is a lot you can achieve.
Be careful when promising your customers that you can run out of the box workflow on the app site – limitations on that site break workflow initiation even for out of the box workflows

3. Sites created by apps (aka app sites) are limited in functionality, for example tools such as SharePoint Designer and many 3rd party migration tools are not able to connect to them.
Despite the fact that apps sites should be just sites – they have a limited functionality so make sure you test your typical assumptions and test scenarios since some of them may fail. Here are few examples:
-Connecting to an app with SharePoint Designer Fails
-Many third party migration tools are not able to connect to the app site to deploy or read data
-Limited workflow initiation functionality for out of the box workflows

4. Deployment of site artifacts (master pages, layouts, images) should be done with Sandbox Solution; using apps makes it clunky.
Even though there is a theoretical option to deploy your branding and other site artifacts (master pages, content type etc) to a host/parent site using app framework – due to lack of proper support in apps to deploy those artifacts, practical implementation is beyond reasonable.

5. Have old PowerShell to deploy and configure your solutions to SP On Premise? reusing it for SPO will require tweaking
Many of us use automation to deploy site artifacts, solutions etc; I have quite a few PowerShell script that do a lot of magic in SharePoint on-premises. Don’t assume those will work seamlessly in SharePoint Online. Test them, there is a very high chance you may need to do some tweaking. In some cases, functionality is not going to be supported. The reason being, is that SharePoint Online supports Remote PowerShell which has a limited subset of functionality.

6. Be careful with customizing SPO core elements: Suite Bar, navigation, etc – things tend to break when MS pushes out an update

Suite Bar, showing on the very top of any SharePoint Online site is by far the most dangerous place to put your customization into. Many customers will ask you to add their custom links, remove out of the box links and many other requests. Most of such customizations may work at first, but there is a very high risk of this functionality breaking when Microsoft updates UI and Suite Bar is their favorite place from my experience.

I have had several instances when Suite Bar HTML rendering was changed resulting in anything that relies on it break and cause multiple errors on the page. Microsoft doesn’t provide any release schedule on such elements so you might get a nasty surprise one evening. Therefore, best is to stay away from customizing core elements such as ribbon and suite bar in SharePoint Online.

7. Your SPO tenant shares some services with others – remember that when creating solution that use search, user profile, translation etc

There are many clever solutions out there which use Managed Metadata, User Profile and Search Service. Remember that those services run in multitenant environment and latency of those is significant comparing to on-premises system.
To give you some examples:
-Search crawl can take several hours for the new search properties to be picked up
-User profiles take a while to be created manually; even the user profile property page takes few minutes to load up
-Multilingual capability in SharePoint Online which uses timer job can take up to an hour to create a translation package depending on the volume of pages

8. Avoid big bets on solutions that are not officially supported since you never know when those will be officially discontinued (example is BCS support for Kiosk users)
SharePoint Online is evolving and licensing is evolving with it. Depending on how you put together your solution – you may want to sell your customer certain level of licensing (say kiosk user license) based on availability of certain features (such as BCS) when tested the product. Although some features are available, licensing clause may explicitly or implicitly say otherwise. Avoid solutions which are built on limited availability of some features, especially if there are strong indications those features should not be there. You never want to have a core feature to disappear one day because technical hole has been patched and now you have hundreds of thousands of disappointed users.

9. Remember, the storage is now in the cloud: test migration of large volumes of data – you might need to migrate weeks worth of data without realizing it initially
This lessons learnt speaks for itself – when migrating – don’t assume this is going to be fast. Even the most ingenious migration tools out there can’t do much when it comes to transferring data across internet. Test your migration and establish baseline.

There are of course may more lessons and depending on the type of the solution you’re building – you might find several more. Above are the most common when building typical intranet or extranet solution and I hope it will save time during planning and execution of your next SharePoint Online project.



Content Targeting with SharePoint Content Search Web Part

Who wouldn’t want to have targeted content in SharePoint?
Seems like such a logical ask and yet it’s seems like it’s a pain to implement. This post will try to demystify this implementation.
Here is the scenario: You have people in your organization and they’re using their User Profile to describe their interests, say they’re using Ask Me About field:
ask me about user profile property
Wouldn’t it be nice for anyone who is writing articles on that topic to “tag” their content with this tag … then surface in Content Search Web Part on the home page only the stuff that this particular user cares about?

Sure … let’s see how it’s done (I’ll be using SharePoint Online since all of the plumbing is already set up there):

1. First, you need to create a user profile property or use an existing one. I will use an existing User Profile property called “Ask Me About”.
2. Next you will need to extract the “real” name for out of the box properties, as you can see my property is actually named “SPS-Responsibility”
To get to this screen you need to go to SPO Admin -> click User Profiles -> click Manage User Properties -> find your property and click [Edit]
real property name
3. Then you create a new or use an existing managed metadata tree, here is my example
managed metadata terms
4. Next, we associate this tree to a column in a list … nothing complicated here.
5. Now, you need to create at least one piece of content that uses your new column which has managed metadata tree associated with it. That’s not a problem with existing columns and data but for a new column to be picked up by search – you may need to wait till next full crawl and in SPO it may take an hour for a newly created column.
6. Navigate back to your SPO admin center and this time go to search -> Manage Search Schema, since we need to grab exact managed property name created by the search crawl. In my case the name is: owstaxIdTestx0020Column since I named my column in the list as “Test Column” and Sharepoint converted it to taxonomy column
7. Now, we have all of the components, let’s create a query. Add a Content Search Web Part to the page and edit it’s query properties … switch to Advanced Mode.
8. Type in the following query substituting your column names etc … of course:

path:"https://[your site URL]" owstaxIdTestx0020Column:{User.SPS-Responsibility}

Remember to replace owstaxIdTestx0020Column to the managed search property representing your list column. Also, SPS-Responsibility would be whatever you chose for your user profile property.

targeted sharepoint search results

As a result, you will get targeted results as you can see if the preview panel; in my case I am seeing one piece of content tagged with “SharePoint” since it’s in my user profile.

Now what if I have multiple values stored in my user profiles?? like this:

multiple profile values

Well, you need to adjust the search syntax to be bitwise OR, like this:

path:"https://[your site URL]" {|owstaxIdTestx0020Column:{User.SPS-Responsibility}}

Result? …Voila:
multi value targeting

Happy targeting!


SharePoint Apps versus Full Trust or Sandbox solutions

Pressure is on and more and more companies are moving to SharePoint Online for the intranet and extranet and whatever else they have running in their server room. So, Few people asked me, what is the difference between developing apps versus on-premise solutions. The short answer is , a lot and since this is not really a helpful answer I will start a long list of gotchas :) and will add to it as I go along

In here we’re discussing SharePoint Hosted apps just to be clear.

General Stuff

-There is no C# or any other compiled code in apps … everything happens through a JavaScript. If you need to customize anything you need to write JS which calls SP API. The API is powerful but there is a learning curve even to an experienced SP dev.

-When you delete an app which has been installed on the site – your app site gets deleted too … so if you stored some data in the app site and you find it valuable – make sure you backup that data first. This is different from Sandbox or Full Trust solutions in a way when you delete the solution lists and libraries created by that solution live on unless you redeploy the solution and chose to overwrite the list. Not so with apps.


-You can create custom workflows and even build those in Visual Studio, not only in SharePoint designer but those will have to use only out of the box actions available, you can’t create your own workflow actions and deploy them you have to play around with what’s configurable out of the box

-Out of the box approval workflow can be added to any of the lists on the app site but initiation or association form will not load for the list so basically you can’t initiate a workflow.

SharePoint Designer

-You can’t connect and edit the apps site created with an app – you just get an error. This is probably a limitation in SPD (they probably don’t want you to ruin the app site or find out how it works ;)) but nevertheless

Site templates

-You can’t provision your site template as an app similar to what you can do with Sandbox solutions

You own apps versus apps you bought in the app store

-There are certain things which you (as an app) can’t do if you’re in the app store. One of which being that app that is being sold in the app store can’t have Full Control on the parent site – this is actually a huge limitation in a way that app store apps will never (unless MS change it) have a full potential capability of the app that has been developed by a dev and uploaded to the corporate catalog.

Pages and other Assets

-Page, CSS, JS, Image, MasterPage etc provisioning to the parent site using the app involves hacks and not really robust

App Parts – they’re kind of like web parts but not really

-App parts that you build run in an iframe on the page, so it’s not like you can emit some CSS, JS, or HTML that will have access to the parent DOM

-For the same reason as above, you can not style or add JS interaction to app parts by adding your styles or JS to master page since those run in an iframe of the app site and therefore are not really inheriting your master page for the main site

-If elements on your app part take a certain space, and you place the app part on the page which has a limited space – you will end up with scroll bars in the app part because – yes, you guessed it, it’s running in an iframe. This is a huge issue for example if your app has a flyout (for ex a menu) and typically a flyout would fly over other elements on your page – well now that it’s an app part – you can’t – it will just be flying in the constraint of the iframe.

-You can’t really take a third party app part and “wrap it” and pass parameters dynamically. This is my favorite thing to do with we parts that is not possible with app parts. You can wrap a third party web part into your own with a purpose of feeding parameters to web part. This is helpful for example when you have a weather web part that has a web part parameters passing the location name but you want to dynamically pass that data at the time of rendering. You could just wrap a web part in your own custom web part and do that logic – doesn’t work like that with apps parts – it just doesn’t.

-App parts can’t be placed on a master page like controls. So traditional web parts are just user controls or web controls wrapped in a magical web part wrapper which means that you can hardcode your web part into masterpages so that users can’t remove them – there are few valid cases for this. Well, you can’t do that with app parts.

-App pages are not web part pages, so users can’t edit the app home page and customize what they see there. Once you define the app landing page – it is what it is.

More to come, stay tuned …


How to: set up multilingual intranet sites in SharePoint Online

Multilingual sites has never been my favorite in SharePoint, since SharePoint 2007 you had to deal with language pack installations and all the error with setting up infrastructure but now with SharePoint Online things look pretty easy. SharePoint Online is pre-configured with language packs and all the stuff you need to just get your site going.

So let’s take a look at how you set up a multilingual site in SPO.

1. Log into your admin site (mine is: and create a new publishing site collection
2. Once created, navigate to the publishing site collection (mine is: and click Settings (Gear) | Site Settings
3. Click Variation Labels | New Label … now you’re going to set up initial variation label (in my case English-Canada), this is going to be the language in which original content will be published, here is how my configuration looks like:

variations primary language

4. As a result you will get this message “Your new variations are on the way “, so now you need to create labels for any other languages you want to host on your site in my case it’ll be French-Canada

5. Click Ok on the previous screen and then click New Label again, this time the process will be a bit different, step one being again you selecting the language and locale:

step 1

6. Next is you picking what you want to translate and other details shown below:

step 2

7. Next, you pick whether human and machine translation will be permitted. In my case I want both so that machine translation does the first pass and then an editor can go and fix all of the parts that need to be touched up:

step 3

8. Next, you chose whether updates to the source page will be automatically propagated or have to manually propagated:

step 4

9. That’s it, the set up is done:

step 5

Here is the thing though, you will need to wait for up to an hour for SharePoint Online to trigger all the right timer jobs to actually create the hierarchy for your source and variation labels, once this process is complete, here is how your Variation Labels page will look like:

variations created

10. Now each time you go to the root site (mine is:, you will be redirected to the specific locale site in my case it is also my source site (mine is:
In here you can created and edit pages.

Remember it will take about an hour for the hierarchy and pages to be translated back and when they do and you go to the translated counterpart, you can expect the translated pages to appear there similar to my translated page:




How to: Customize the look of the SharePoint Content Search Web Part results

In my last post, I talked about how you can set up your SharePoint site to roll up content on different parts of the site using Content Search Web Part (CSWP).

In that post I mentioned we’d take a look at how you can customize the rendering of the display template for the items that are rolled up so rather than having generic results coming back in a generic look – you can brand them and make them look however you want. You can even have your results show as a slider etc with a bit of extra JavaScript magic.

In this post we’ll take a look at basic components which you’ll need to customize your display templates for the CSWP.

I’m going to be using default set up of Office 365 Developer site in SharePoint Online and steps here apply to at the time of publishing this post.

1. Navigate to the masterpage gallery on your developer site: click Gear | Site Settings | Master pages and page layouts
2. Open the folder: Display Templates | Content Web Parts
3. Download a copy of the Control_List.html and rename it to something like MyControlList.html … this is a file which we’ll be modifying to introduce custom results rendering
You will need to supply this file only if you like to add anything prior to repeating items being rendered, for example some sort of a header. If you only want to modify the actual repeating results and not add anything overarching at the top – you won’t need this file. In our case, I will create an new rendering template for the header section and add a piece of text so we can see how it appears

To do that you need to find the section in this file that starts with this:

<ul class="cbs-List">

and add anything you want to see before the list right before, similar to this:

<a href='[link to all results]'>View More</a>
<ul class="cbs-List">

Change the value in <title> to something like My Custom Rendering, since this is how the user will pick the template from the CSWP settings UI.

4. Save the file (with a new name, make sure) and upload it back to the Content Web Parts. When you save the file and accept the default properties, you will see that accompanying JS file was created.

5. For the items rendering template, find the file Item_TwoLines.html from Content Web Parts, download it and give it a new name, in my case MyItem_TwoLines.html

6. Change the value in <title> to something like My Two lines, since this is how the user will pick the template from the CSWP settings UI.

7. In here you need to locate the following piece:

<div class="cbs-Item" id="_#= containerId =#_" data-displaytemplate="Item2Lines">

and basically the piece above along with the structure is how each of your items will be rendered, so if you need to make any changes to the rendering, add images, add an expanding content – you can do it here.

8. Again, save this file (with a new name) and upload it back to the Content Web Parts. When you save the file and accept the default properties.

9. Now on to testing!
Add a new CSWP to the page and make sure it shows any content just for the demo purposes.

10. Access the web part properties and set the display templates options as shown below:
display templates

Provided of course you kept the names as in the example.
You will see instantly that the web part has a new grouping section in our case it was a View More link as well as any customization you added to the item display – it will show up here too!

end result CSWP renderinf

The benefit of this approach is that you’re reusing a CSWP back end functionality and get any rendering you want, heck you can even get a custom slider this way!



How to: perform data rollups across SharePoint site collections

Say you have a typical corporate site with a home page containing news, events and whatever else data you need on a typical site. Also, if it’s a typical corporate site, you’re also likely to have department sites and various team sites, some of which are site collections and other sub sites.
The structure may look close to the one below:

site collection structure

With a structure like above, it’s often that users ask to see various information published on the home page on their respective sub sites and vice versa. Whether those are news, calendar events, announcements or wiki pages – you can use SharePoint Content Search Web Part (CSWP) to achieve this goal. CSWP uses search index to pull information across multiple sites, also you have your usual security trimming etc.

Let’s take a look at an example where you can use CSWP to share announcement across sites.

1. Create a list of an announcement type (aka Announcements App) on the root site collection
2. Create a managed metadata term set (Gear | Site Settings | Term store management) representing Category of the announcement
This will allow our announcements to be categorized and administrator can chose to show rollups of certain categories only on specific sites

announcement categories

3. Back in our announcement list, add a new column to that list representing a category and make it a managed metadata type column, set the column to consume data from the term tree we have just created. Remember the name of it since we’ll need it later. In my case, for reference let’s call it MyAnnouncementCategories

category column term settings

4. Create an instance of at least one announcement which uses the term set column. This piece if very important since search will need to crawl this piece of content in order to create searchable properties which we’ll need later.

5. If you’re using SharePoint Online, at this point you will need to wait until search crawl has completed and picked up your content. From my experience it may take 1 or 2 hours until this is done. if you’re using on-premises environment, you can expect for the crawl to happen faster plus you can always trigger it and have your properties created within minutes.

6. Navigate to the site where you’d want to see the roll up of announcement and add an instance of CSWP, add a Content Search Web Part and access it’s properties

cswp properties

7. Click the Change Query button and switch to Advanced Mode

8. In here under the Query Text add the following:

(contentclass:"STS_ListItem") owstaxIdMyAnnouncementCategories:#1e44855f-c4d8-43a1-96cf-69bd67a51197

Above query filters all of the crawled items which:
-Are list items
-MyAnnouncementCategories is equal to desired taxonomy term representing a category you want to filter on. Typically after SharePoint completes it’s crawl of data and picks up managed metadata property, it will create a managed property representing taxonomy ID of the managed metadata column. The name of the column usually has a format of owstaxId[ColumnName] so in our case it’s owstaxIdMyAnnouncementCategories. The GUID following the filter can be taken from the term store management tool. For examaple, in my case the unique ID of the Category 2 is as shown below:

unique ID of the category

This means that you want to filter announcements by certain category on one site and by different category on another site – you can do such filtering by specifying the Id of the category.

The cool part of this is that if you chose a parent category Id, you will see all of the items tagged with a parent category and child categories.

9. Save the Web part properties and test the query.
Remember if you’re using SharePoint Online the crawl may take some time for new items to be picked up so you might want to create some demo content tagged differently prior to doing the whole web part configuration to give it some time.

In a next post, I’ll demonstrate how you can style the results returned by CSWP to make them look how you want.



SharePoint MVP for 2014/2015!

It’s that time of the year when summer MVPs are renewed and newly awarded MVPs are invited to a very special club.
First off, good news! I’m still in!
It never gets old, it’s always one of the most exciting news of the day … and it has been my 6th year that I will be a SharePoint MVP.
A lot has changed since and a lot of things are still coming …
Just a week ago or so I’ve been lucky to participate Microsoft Envisioning Tour, pretty good video you can see here:

The video looks pretty futuristic, but just as when 6 years ago when I first became an MVP, a lot of things seemed to be impossible, now are completely an everyday norm!

Like for example:
-I can actually view a Word Doc on my phone while my chauffeur is driving me to work ;)
-At my local RBC branch I can actually use a Surface like table where I can browse stuff while waiting in line
-HD TV walls are becoming bigger and bigger and more crisp … everywhere … can’t wait to have a wall like that in my living room in few years
-Nearly every platform has a digital marketplace and I can buy apps for most of the devices I use
-The cost of hosting this blog dropped 70% and it’s running on platform that knows how to scale automatically if all of the sudden one day I become celebrity
-etc etc

All I’m saying, that I am really excited to be part of this … never failing to surprise and amaze technological miracle, and meet and connect with people that make it happen. My main hope and desire is to continue orbiting and flying through this black matter and to connect and inspire others just as inspire me every day!

Now onto watching a well deserved 45 min of Netflix show!


SharePoint Summit – October 27-29, 2014, register now for an early bird!


As some of you may know, SharePoint Summit 2014 is coming again to Vancouver this year after a great success last year.

SharePoint Summit is here to give you a 360 degree view of the best practices and methodologies you will need to plan, implement and manage successful SharePoint-based solutions designed to meet your organization’s business needs and be adopted by your end users.

“Discover.Innovate.Build” are the main themes of this event, featuring MORE THAN 60 outstanding training sessions (3 of which are mine! yay!) to help you make the most of SharePoint and maximize your people’s productivity and effectiveness.
There is an early bird, so you better check it out now if planning to attend:

Hope to see you there!