Mark Everard

Hello, I'm Mark – a PhD physicist turned technologist / architect.

Publish all the things!

with 5 comments

If you’ve seen some of my recent posts you’ll know I’ve been playing around with WebHooks. These are simple HTTP requests to endpoints allowing services to exchange data and events.

Integration Platforms as a Service

Those of you cool kids will have known about IFTTT (If This Then That) for some time. It’s a online tool that acts as a way to glue a huuuge number of online services together into simple workflow pairs called ‘recipes’. Each service can provide a number of triggers to the platform, which are then linked to actions provided by other services.

I’ve got a number of personal recipes set up, some useful some not. but all of them are good fun!

  • If somebody tags me in a picture on Facebook, then upload the picture to my OneDrive account
  • If one of my team creates a new GitHub repository then email me
  • If I arrive or leave my office then log the time in a Google Doc.
  • If an astronaut is launched into space then send me a notification

Whilst IFTTT targets individual users, other iPaaS platforms focus more towards business and enterprise. These will become increasingly useful and popular as a cheap means of system integration and data exchange. For example – if somebody submits a payment via the organisation’s payment gateway, log the entry directly into the cloud-based finance system. You won’t need development teams to set these up, just someone to configure the data exchange / webhook endpoints.

Publish your home!

I’ve been playing around with smart home devices (tado smart heating and WeMo lights and switches). I wanted to experiment a little with the API’s they offered.

One of the channels IFTTT offer is called the Maker channel. This is a user specific channel that will accept http triggers to an endpoint and can also make requests to a specified endpoint. It allows you pass up to 4 data points from a trigger or to an action.


Publish…… and there was light, and slippers.

As I’ve demonstrated before, adding webhooks to an existing ASP.NET app is straightforward. I decided I’d hook an Episerver solution up to an IFTTT maker channel, meaning when I clicked the publish button I could make all manner of amazing things happen, like turning my lights on :)

The code to do this is straightforward (see below). I’m using an Episerver initialisation module to hook a handler for the Content Published event. I’ve also built a simple helper method to call the Maker channel API. To use this you’d just have to add in your own API key that you get when you configure the Maker channel on IFTTT.

Written by mark

March 7th, 2016 at 11:00 am

Posted in ASP.NET,C#,Code,EPiServer

How exactly do you need to manage your content?

without comments

Detailed content management requirements are often overlooked in the design and build of a content managed website. This can result in an implementation that lacks flexibility and incurs higher costs over its lifetime.

Dual purpose

Web Content Management (WCM/CMS) implementations deliver two key capabilities for an organisation:

  1. A website, perhaps with a new or updated design or brand.
  2. The ability to manage the website content via a content management system

To achieve the best implementation outcome, it is important start your project with design measures and KPI’s that focus on both the success of the website as a business tool, as well as the CMS that enables it. Too often the focus is on just the website, largely because of the difficulty in measuring how well your content management system works for your organisation.

Whether your CMS is effective is rarely immediately apparent, instead it will emerge over time through your content team’s ability to operate autonomously and a reduction in future development need and cost.

A CMS is for life, not just for launch

Even after a successful implementation, it is still easy to overlook your content management requirements. Marketing and campaign-led activity often have bespoke visual needs which can challenge your existing CMS design and content flexibility. They also often come with fixed deadlines and limited opportunity to fully assess the expected campaign content usage and lifespan.

The default position may be to ‘content manage all the things’, but do you really need to?

It is all to easy to build up technical debt within your implementation by designing bespoke types that are so specialised they offer little or no opportunity for reuse. This feature bloat not only increases the size of your code-base, making the landscape more complex for your technical teams. It also makes the system more complex for editorial teams as they have to navigate additional content types. If you have many content types in your CMS that are only used in a few places then you may already be suffering.

Don’t waste time (or money)

To keep on the right track, you should always have your content editing team as a key stakeholder in any website or CMS development. After all, they are the team that will be using any functionality and be responsible for publishing campaign content / functionality on your website through your CMS. It is only sensible that their feedback is taken onboard.

The basics of content reuse requirements aren’t that difficult.:

  1. I need to reuse this content and/or design in many places across the website
  2. I may reuse this content occasionally
  3. I am unlikely to reuse this content, but I need to be able to change it at short notice
  4. I shouldn’t need to change the content. If I do I am happy to rely on techincal support

The answers will drive very different technical solutions, ranging from fully reusable content managed features to a set of static pages to be thrown away after use. The middle ground here is also useful, which allows more technically minded CMS editors and admins to standup flat HTML pages through the CMS interface (an example for Episerver –

The difference in cost and implementation effort can be substantial.

Why spend money and valuable time building reusable content elements for a one-off campaign if you don’t really need to?

Written by mark

February 29th, 2016 at 11:00 am

Posted in C#,EPiServer,Opinion

London Episerver Developer Meetup Spring 2016

without comments

Spring is on its way (think daffodils and lambs) and so is Episerver’s next Developer Meetup.

Zone have very kindly offered to host the meetup at their laid back offices in Kings Cross. And Episerver will be supplying the pizzas and beers – after all, it’s not a meetup without it.

We have a great line up, covering some exciting new features in Episerver and looking at what it coming too

Episerver Forms

In the Winter Release 2016, Episerver Forms were officially released! Finally, a replacement for XForms! Janaka (from Episerver) will talk through different form examples you can build, re-using them, and customized rendering for display channels, personalization, multi-language and permissions. As well as the new four elements added after Beta; Date time, Range, Rich text and URL.

Commerce Promotion engine

New UK EMVP, Jon Jones, will take us through the new promotions engine in Commerce.

ASP.NET Core 1

(AKA ASP.NET 5) There are big changes coming soon to the ASP.NET framework. We’ll be taken through some of the changes and how Episerver are redesigning the product to take advantage.

Sign up now!

As always, RSVP through our Meetup page, and please let me know if you’ve got any good ideas or want to contribute in any way. Remember, its your group!




Written by mark

February 15th, 2016 at 8:26 am

Posted in Community,EPiServer

RSS feeds for Episerver

without comments

I’ve released a few further tweaks to my RSS / ATOM add-on for EpiserverCHIEF2MORO.SyndicationFeeds.

Whats new in version 3.0?

On request filtering

I’ve taken another look at filtering, which is a feature included from version 2. I’ve modified the inbuilt IFeedContentFilterer to allow Feed pages to filter items by category via querystring parameters. This has caused a breaking change (and helped me understand how abstractions can help stable API design).

The feature allows editors to set up single feeds and for those feeds to provide subsets of data by responding to Category names that are passed via a comma separated querystring value. e.g.,Blog,Technology.

The default FeedFilterer has also been modified so that a content item has to be a member of all categories (both querystring and editor set) to appear. Previously it had to be a member of just one category filter.

Editor set cache

Each feed page now includes a new property allowing an editor to cache the feed output for a given number of seconds. This is to help performance for those feed pages on sites with a large amount of content.


I made some minor amends to help the feeds to validate, and made sure I correctly understood the RSS / ATOM specification in respect of LastUpdated and Publish dates

It’s on Nuget

The source code is available at

A package (currently v3.0.0.0) is available in the Episerver Nuget Feed – – search for CHIEF2MORO.SyndicationFeeds

Written by mark

February 3rd, 2016 at 10:00 am

Posted in ASP.NET,C#,EPiServer

Using WebHooks in an EPiServer solution

without comments

WebHooks are a way of connecting internet / cloud services together. They allow websites to communicate with each other via HTTP callbacks. Services can subscribe (via HTTP) to receive notifications from publishers about a specific event. Publishers, manage these subscriptions and then on each event push notifcations via an HTTP Post to each receiver, at an endpoint defined during subscription.


ASP.NET WebHooks

Microsoft have recently released a WebHook framework for ASP.NET that gives you a pattern for:

  • Handling subscriptions from interested subscribers
  • Sending subscriptions to publishers
  • Sending published messages to subscribers
  • Handling publisher messages from subscribed services (via Receivers)

Along with the basic framework, they have also provided implementations for some very common services like Dropbox, GitHub, Instagram, PayPal, Pusher, Salesforce, Slack, Stripe, Trello, and WordPress

Webhooks in EPiServer

What would an EPiServer implementation / usage of WebHooks look like?

  • Publish content events to subscribers (system to system integration)
  • Publish Form data inputs to external systems
  • Publish / Subscribe to Catalog events and changes from integrated commerce systems (Stock control and pricing)
  • Subscribe to events from external systems (Payments)
  • Subscribe to external content events – Instagram / social

Ascend London

I was invited to talk (along with fellow EMVP Khurram Khan) at the technical track at EPiServer Ascend London 2015. You can download the slides from Slideshare.

As part of a presentation I put together a simple solution demonstrating an EPiServer site with an Instagram receiver that provided a solution to the below user story.

“As a content editor, I want images that are uploaded on a social channel (Instagram) and tagged with ‘ascend15’ to be available in my content management system so I can use them on my awesome website”

The solution contained the following elements:

  • A receiver accepting notifications from Instagram when a image with a tag of ‘ascend15’ was added (using the ASP.NET WebHook framework)
  • A Dynamic Data Store implementation to store the number of notifications received
  • A scheduled job: to request, download and import images into EPiServer as MediaData / IContent items

The solution and even the scenario was a little contrived, so I’m not going to show the code (though it you really want it just drop me a line). It did however work on the day, which when you’re trying a tech demo that relies on the cloud and external services and also your own code; is always nice :)

Written by mark

November 11th, 2015 at 10:49 am

Posted in ASP.NET,C#,EPiServer

Chief2moro.ImageDataExtensions now available for EPiServer 9

without comments

Another short, sharp blog post to note that a version of the CHIEF2MORO.ImageDataExtensions package which is compatible with EPiServer 9 is now available in the EPiServer Nuget Feed. Fellow EMVP Marija Jemuovic did all the hard work, and I got the easy part in blogging about it.

There not much more to say, so here is a space filler…..




Written by mark

October 27th, 2015 at 9:00 am

Posted in ASP.NET,C#,EPiServer

Enhanced RSS / ATOM Feeds for EPiServer

without comments

I’ve released a new version of CHIEF2MORO.SyndicationFeeds. Along with upgrading to EPiServer 9, I’ve also taken the opportunity to add a few additional features based on some feedback and my own real usage.

Advanced Filtering

The library now contains the IFeedContentFilterer interface which provides an extension for any custom filtering you may want to achieve (for example – removing items with empty description’s). The default implementation filters via the EPiServer FilterForVisitor filters (Published status, Access rights, Has a template), though ignores the HasTemplate rule for blocks, so they can still be exposed. It also filters on EPiServer categories and ContentType, both of which are selectable by an editor on an instance of the Feed PageType.

Changing each Item’s summary in the feed.

You can now provide your own implementation of IFeedDescriptionProvider which is an interface that describes how a content item’s feed summary / description is derived. This allows you to provide your own implementation of where the items summary is stored. This may for example be from a common page property across all content types, or may be specific to each content type. By default, each item has a summary like ‘An src link to content with id = {content.ContentLink.ID} and name = {content.Name}’. The IFeedDescriptionProvider extension replaces the previous SetItemDescription delegate way of overriding the summary / description. The delegate is still available to maintain backwards compatibility but is marked as obsolete.

It’s on Nuget

The source code is available at I am happy to receive feedback and pull requests though I need to make a formal and public apology to Thomas Svensen who did indeed send me a pull request, which I ignored like an extremely bad open source steward….. Sorry :(

A package (currently v2.0.0.0) is available in the EPiServer Nuget Feed – – search for CHIEF2MORO.SyndicationFeeds



Written by mark

October 26th, 2015 at 9:00 am

Posted in ASP.NET,C#,EPiServer

Adding GA tracking to Emails delivered using Adobe Campaign

with one comment

Adobe Campaign contains a formula that is executed in the delivery preparation phase which parses a delivery template and modifies all links, so that they are passed through a tracking server. This allows links to be individually tracked to a both an email recipient and a specific delivery.

A link to the BBC news site, is changed to https://t.adobe-campaign.server/r/?id=hcc970,436a07,436a08. The latter url eventually resolves to BBC news, but first is passed through the tracking server, that issues a redirect and records that the link has been followed.

Google Analytics Tracking

Google Analytics can track inbound links to a site and attribute them to a source and an associated campaign. It does this in a number of ways, either via cookies, or for cross-domain links by checking querystring parameters. The following parameters are recognised

  • utm_content
  • utm_source
  • utm_medium

See the following link for further information about each parameter and the ‘meaning’ –

Modifying the Click Tracking Formula

The click tracking formula in Adobe Campaign can be modified to include additional query string parameters within the forwarding record. This is achieved by modifying the NmsTracking_ClickFormula contained in Administration > Platform > Options

You should very carefully test the click tracking formula after making any modifications. Be very sure that the record you enter doesn’t include any spurious white space or line-breaks. Adobe Campaign is very ‘fussy’ about character encoding! As an example, when I first modified the below we discovered that modified outbound links were rendering incorrectly in Hotmail / email clients.

Links within the rendered email body had a line break before and after the URL which Hotmail interpreted as a link without a protocol and so added an additional protocol to the start of the url, so our links looked like https://https://t.adobe-campaign.server/r/?id=hcc970,436a07,436a08 . I’m sure this type of functionality is intentional from Hotmail / Outlook so they can turn entries in text into a fully-formed hyperlink. Regardless, it does show the complexity and why its vital to test your deliveries in a tool like Litmus – test email rendering.

Be very careful about cutting and pasting this as I’ve deliberately added line-breaks and white space to make it readable!

<% if( typeof strPurlTrackingServer!="undefined" && strPurlTrackingServer.toString() ) { %>
<%= strPurlTrackingServer %>
<% } else { %>

<%@ include option='NmsTracking_ServerUrl' %><% } %>/r/?id=<%= type.substr(0, 1) + (<0 ? ( : %>,
<%@ value object="delivery" xpath="@idTracking" %>,<%= escapeUrl("$(urlId)") %>&utm_campaign=<%= variables.utm_content%>&utm_medium=email&utm_source=adobe_campaign
if (document.mode == "forward")
 var d = message.getParameter("d")
 if( d )
 d = d.split(",")
&ap_visitorId=<%=message.getParameter("visitorId") != '' ? message.getParameter("visitorId"):0 %>&ap_category=<%= d[0]?d[0]:'' %>&ap_deliveryId=<%=d[1]?parseInt(d[1],16):0%><%
} %>
if( typeof proposition != "undefined" && proposition.length == undefined )
{ %>&ap_oid=<%= %>
<% } %>

The utm_medium and utm_source variables are hardcoded to be ’email’ and ‘adobecampaign’. These parameters are used by marketing analysts to understand the channel and source system that a visit can be attributed to.

Adding a variable to a delivery template

The above tracking formula depends on the delivery template having a variable named utm_content added into its context. If a template does not have this variable defined then the delivery will fail at the html compilation stage, and that’s always a pain to debug!

A good practise is to have the variable’s value taken from the internal delivery Id. This means your Google Analytics will be able to easily identify inbound links coming from specific emails sent from Adobe Campaign. It’s straightforward to set this within the delivery template as shown below.



Written by mark

October 8th, 2015 at 10:00 am

The real cost of owning a development team

without comments

This post was first published on LinkedIn Pulse on 18th September 2015 –The real cost of owning a development team


Development teams are expensive. There, I said it. If you want a high-performing development team then be prepared to invest.

I’m not just talking about salaries. You’ll also need to equip your team with high-quality hardware and the expensive software tools they need to deliver the solutions you want.

This isn’t news to many organisations. It’s actually not hard to get those bits right, and there are great benefits from having those skills on-tap in-house.

Just putting a bunch of developers in a room, shouting "Go!" and occasionally rewarding with pizza will rarely get you the high-quality solutions you desire.


It’s about the people

What many places struggle to get right is the investment needed in the core of a development team. The people.

Development teams require leadership, mentoring, structured career paths and personal development plans. Just putting a bunch of developers in a room, shouting “Go!” and occasionally rewarding with pizza will rarely get you the high-quality solutions you desire.

Other creative disciplines beyond development perhaps have this slightly easier, as it’s seen as ‘obvious’ that those teams need the room to think and learn.

Take for example a creative design team. They have to work to understand and consume the latest design trends, so they can stay current and produce great work. In my experience this learning need is rarely questioned, perhaps because the design output from those teams is more tangible than the abstract “code” output from a development team. Regardless, the underlying learning need for each team is identical and should be addressed.

Time and direction

The real key to growing your development team is time. This investment allows the team to step back from their primary output and dive into the new technologies and ways of working that could speed up delivery or increase the quality of the technology output. Both valuable outcomes.

Time alone though isn’t enough. You also need leadership and structure. That could be achieved by having a team with a broad mixture of experience, or via a more dedicated architect / lead role helping to bridge the gap between requirements and solutions, helping drive a coherent technology vision.

Again, to those of you working in the industry the above may not seem like rocket science; and really it shouldn’t be. However there are still too many places where there is a attitude of throwing more developers at a problem to get to a solution.

It doesn’t have to be expensive

There are many ideas and ways to give your technology teams the opportunity to learn and improve. Many of them are not as expensive as you might imagine.

  1. On the job training – code / peer reviews are an ideal opportunity to not only increase the quality of the solution but also to share knowledge and build team resilience.
  2. Coding katas – give the team the ability to constantly hone and sharpen their skills by setting aside time for them to regularly practise small development tasks. There are great examples online.
  3. Open source – encourage the team to contribute to an open source project. Here they will learn how to apply their skills in a different environment and learn from fellow contributors. This is even more valuable if your organisation uses open source software. What great karma; to be giving as well as receiving.
  4. Meetups – there are a growing number of outside events encouraging like-minded people to meet up and discuss common skills, techniques and frameworks. Why not encourage your team to participate? Better yet, get them to disseminate what they’ve learnt internally to the rest of the team.
  5. Certification and training – if you have some training budget then paid-for courses not only demonstrate the organisation’s commitment to growing individual skills but are beneficial to your delivery too. Online training courses are relatively cheap and offer a wide variety of subjects.

There’s value to getting it right

Development teams have a very specialised need for learning and growth. Owning a team comes with a heavy responsibility to get this right.

After all, I’m guessing mediocre isn’t your ambition and you want your development team to produce high-quality bug free software? In which case, isn’t it only reasonable to support them and make sure they have everything they need to succeed?

Written by mark

October 7th, 2015 at 10:00 am

Confimed talks for the London Developer Meetup

without comments

One week to go until our next Meetup on 3rd June at the Shooting Star near Liverpool Street.

Have you RSVP’d?

Confirmed talks

“Nested queries with EPiServer Find” – Danie De Kock.

A look into some of the more complex queries and scenarios that can be performed using Find.

“JavaScript Concepts for the EPiServer Developer” – Ben McKernan.

Learn about some of the key JavaScript concepts that developers should know when extending the EPiServer UI

The UnPanel – a panel of opinionated experts will discuss a range of hot EPiServer development topics, set by the audience and seeded by myself!

Hope to see you there

Written by mark

May 27th, 2015 at 3:06 pm

Posted in Community,EPiServer