Introduction
At Codit, I manage the blog. We have some very passionate people on board who like to invest their time to get to the bottom of things and – also very important – share it with the world!
That small part of my job means I get to review blog posts before publishing on a technical level. It’s always good to have one extra pair of eyes reading the post before publishing it to the public, so this definitely pays off!
An even smaller part of publishing blog posts is making sure they get enough coverage. Sharing them on Twitter, LinkedIn or even Facebook is part of the job for our devoted marketing department! And analytics around these shares on social media definitely come in handy! For that specific reason we use Bitly to shorten our URLs.
Every time a blog post gets published, someone needed to add them manually to out Bitly account and send out an e-mail. This takes a small amount of time, but as you can imagine it accumulates quickly with the amount of posts we generate lately!
Logic Apps to the rescue!
I was looking for an excuse to start playing with Logic Apps and they recently added Bitly as one of their Preview connectors, so I started digging!
First, let’s try and list the requirements of our Logic App to-be:
Must-haves:
- The Logic App should trigger automatically whenever a new blog post is published.
- It should create a short link, specifically for usage on Twitter.
- It also should create a short link, specifically for LinkedIn usage.
- It should send out an e-mail with the short links.
- I want the short URLs to appear in the Bitly dashboard, so we can track click-through-rate (CTR).
- I want to spend a minimum of Azure consumption.
Nice-to-haves:
- I want the Logic App to trigger immediately after publishing the blog post.
- I want the e-mail to be sent out to me, the marketing department and the author of the post for (possibly) immediate usage on social media.
- If I resubmit a logic app, I don’t want new URLs (idempotency), I want to keep the ones already in the Bitly dashboard.
- I want the e-mail to appear as if it was coming directly from me.
Logic App Trigger
I could easily fill in one of the first requirements, since the Logic App RSS connector provides me a very easy way to trigger a logic app based on a RSS feed. Our Codit blog RSS feed seemed to do the trick perfectly!
Now it’s all about timing the polling interval: if we poll every minute we get the e-mail faster, but will spend more on Azure consumption since the Logic App gets triggered more… I decided 30 minutes would probably be good enough.
Now I needed to try and get the URL for any new posts that were published. Luckily, the links – Item provides me the perfect way of doing that. The Logic Apps designer conveniently detects this might be an array of links (in case two posts get published at once) and places this within a “For each” shape!
Now that I had the URL(s), all I needed to do was save the Logic App and wait until a blog post was published to test the Logic App. In the Logic App “Runs history” I was able to click through and see for myself that I got the links array nicely:
Seems there is only one item in the array for each blog post, which is perfect for our use-case!
Shortening the URL
For this part of the exercise I needed several things:
- I actually need two URLs: one for Twitter and one for LinkedIn, so I need to call the Bitly connector twice!
- Each link gets a little extra information in the query string called UTM codes. If you are unfamiliar with those, read up on UTM codes here. (In short: it adds extra visibility and tracking in Google Analytics).
So I needed to concatenate the original URL with some static UTM string + one part which needed to be dynamic: the UTM campaign.
For that last part (the campaign): we already have our CMS cleaning up the title of a blog post in the last part of the URL being published! This seems ideal for us here.
However, due to lack of knowledge in Logic Apps-syntax I got a bit frustrated and – at first – created an Azure Function to do just that (extract the interesting part from the URL):
I wasn’t pleased with this, but at least I was able to get things running…
It however meant I needed extra, unwanted, Azure resources:
- Extra Azure storage account (to store the function in)
- Azure App Service Plan to host the function in
- An Azure function to do the trivial task of some string manipulation.
After some additional (but determined) trial and error late in the evening, I ended up doing the same in a Logic App Compose shape! Happy days!
Inputs: @split(item(), ‘/’)[add(length(split(item(), ‘/’)), -2)]
It takes the URL, splits it into an array, based on the slash (‘/’) and takes the part which is interesting for my use-case. See for yourself:
Now I still needed to concatenate all pieces of string together. The concat() function seems to be able to do the trick, but an even easier solution is to just use another Compose shape:
Concatenation comes naturally to the Compose shape!
Then I still needed to create the short links by calling the Bitly connector:
Let’s send out an e-mail
Sending out e-mail, using my Office365 account is actually the easiest thing ever:
Conclusion
My first practical Logic App seems to be a hit! And probably saves us about half an hour of work every week. A few hours of Logic App “R&D” will definitely pay off in the long run!
Here’s the overview of my complete Logic App:
Some remarks
During development, I came across – what appear to me – some limitations :
- The author of the blog post is not in the output of the RSS connector, which is a pity! This would have allowed me to use his/her e-mail address directly or, if it was his/her name, to look-up the e-mail address using the Office 365 users connector!
- I’m missing some kind of expression shape in Logic Apps!
Coming from BizTalk Server where expression shapes containing a limited form of C# code are very handy in a BizTalk orchestration, this is something that should be included one way or the other (without the Azure function implementation).
A few lines of code in there is awesome for dirty work like string manipulation for example. - It took me a while to get my head around Logic Apps syntax.
It’s not really explained in the documentation when or when not to use @function() or @{function()}. It’s not that hard at all once you get the hang of it. Unfortunately it took me a lot of save errors and even some run-time errors (not covered at design time) to get to that point. Might be just me however… - I cannot rename API connections in my Azure Resource Group. Some generic names like ‘rss’, ‘bitly’ and ‘office-365’ are used. I can set some connection properties so they appear nicely in the Logic App however.
- We have Office365 Multi-Factor Authentication enabled at our company. I can authorize the Office365 API connection, but this will only last for 30 days. I might need to change to an account without multi-factor authentication if I don’t want to re-authorize every 30 days…
Let me know what you think in the comments! Is this the way to go?
Any alternative versions I could use? Any feedback is more than welcome.
In a next blog post I will take some of our Logic Apps best practices to heart and optimize the Logic App.
Have a nice day!
Pieter
Subscribe to our RSS feed