These days, being able to produce video is becoming more of a necessity than a “nice-to-have” for online marketers. Check out these stats: Creating a video of a product increases the likelihood of a purchase by 144% Having a video on your homepage can increase conversion rates by 64-85%. 100 million hours of video was watched on Facebook just over a year ago. Guess what that number is now? As the figures show, video is the future, and video marketing is the key to the right promotion of your product or service. Lucky for us, the iPhone shoots beautiful video…
CORGI HomePlan provides boiler and home cover insurance in Great Britain. It offers various insurance policies and an annual boiler service. Its main value proposition is that it promises “peace of mind” to customers. It guarantees that if anything goes wrong, it’ll be fixed quickly and won’t cost anything extra over the monthly payments.
CORGI’s core selling points were not being communicated clearly throughout the website. Insurance is a hyper-competitive industry and most customers compare other providers before taking a decision. After analyzing its data, CORGI saw that there was an opportunity to improve conversions and reduce drop-offs at major points throughout the user journey. To help solve that problem, CORGI hired Worship Digital, a conversion optimization agency.
Lee Preston, a conversion optimization consultant at Worship Digital, analyzed CORGI’s existing Google Analytics data, conducted user testing and heuristic analysis, and used VWO to run surveys and scrollmaps. After conducting qualitative and quantitative analysis, Lee found that:
Users were skeptical of CORGI’s competition, believing they were not transparent enough. Part of CORGI’s value proposition is that it doesn’t have any hidden fees so conveying this to users could help convince them to buy.
On analyzing the scrollmap results, it was found that only around a third of mobile users scrolled down enough to see the value proposition at the bottom of the product pages.
They ran surveys for users and asked, “Did you look elsewhere before visiting this site? (If so, where?)” More than 70% of respondents had looked elsewhere.
They ran another survey and asked users what they care about most; 18% of users said “fast service” while another 12% said “reliability”.
This is how CORGI’s home page originally looked:
After compiling all these observations, Lee and his team distilled it down to one hypothesis:
CORGI’s core features were not being communicated properly. Displaying these more clearly on the home page, throughout the comparison journey, and the checkout could encourage more users to sign up rather than opting for a competitor.
Lee adds, “Throughout our user research with CORGI, we found that visitors weren’t fully exposed to the key selling points of the service. This information was available on different pages on the site, but was not present on the pages comprising the main conversion journey.”
Worship Digital first decided to put this hypothesis to test on the home page.
“We hypothesized that adding a USP bar below the header would mean 100% of visitors would be exposed to these anxiety-reducing features, therefore, improving motivation and increasing the user conversion rate,” Lee said.
This is how the variation looked.
The variation performed better than the control across all devices and majority of user types. The variation increased the conversions by 30.9%.
“We were very happy that this A/B test validated our research-driven hypothesis. We loved how we didn’t have to buy some other tool for running heatmaps and scrollmaps for our visitor behavior experiment,” Lee added.
Conversion optimization is a continuous process at CORGI. Lee has been constantly running new experiments and gathering deep understanding about the insurance provider’s visitors. For the next phase of testing, he plans to:
Improve the usability of the product comparing feature.
Identify and fix leaks during the checkout process.
Launching a new business idea or deciding to develop a new product for your company is not without risk. Many of the best business ideas have come from inspiration, intuition or in-depth insight into an industry. While some of these ideas have risen to dominate the modern world, such as search engines, barcodes and credit card readers, many fine ideas still result in bankruptcy for their company, due to insufficient demand or failure to properly research customer desire. If you build it will they come? Often smart business entrepreneurs can still make big mistakes. With new product, service or business…
If you’ve been following the web development community these last few months, chances are you’ve read about progressive web apps (PWAs). It’s an umbrella term used to describe web experiences advanced that they compete with ever-so-rich and immersive native apps: full offline support, installability, “Retina,” full-bleed imagery, sign-in support for personalization, fast, smooth in-app browsing, push notifications and a great UI.
But even though the new Service Worker API allows you to cache away all of your website’s assets for an almost instant subsequent load, like when meeting someone new, the first impression is what counts. If the first load takes more than 3 seconds, the latest DoubleClick study shows that more than 53% of all users will drop off.
What would more traffic to your blog post mean to you? Image source.
What would 100,000 views on a blog post mean to you?
Depending on the goals of your blog, it could mean thousands of new subscribers and fans.
But it could also mean new customers — big traffic means big exposure and big exposure means big growth.
We’ve been publishing content at Groove for the last five years. We’ve messed up a lot, we’ve learned a lot more and we’ve grown from nothing to over $300,000 in monthly recurring revenue through content marketing.
Today, ourblogs are the single biggest driver of growth (as in, real money) for our business.
If your goal is to get 100,000 people to see your post, then you need to pick a topic that a lot more than 100,000 people are interested in.
What that includes:
Painful problems that lots of people or businesses have
Aspirational goals that lots of people or businesses have
Controversial issues that lots of people or businesses are divided on
What that doesn’t include, from a content perspective:
Your product, service or sales pitch
Hyper-niche problems or goals that tiny corners of your market have
There’s huge potential in writing insanely targeted pieces, but if you want lots of traffic, start with a topic that already gets lots of traffic.
Think of a highway with thousands of cars on it. It’s a lot easier to build an off-ramp and siphon some of that traffic off of the highway than to build a whole new unconnected road and try to get cars to drive to it.
How do you know you’re picking a big enough topic?
Start with the problems that you know your market has (if you’re lost, here are some questions to ask to get you started).
Then validate the idea by searching for it
Start with simple Google searches, trying different terms around your topic (think like your reader, and use the exact language that you’ve heard your market use).
It’ll become clear to you pretty quickly whether it’s a crowded market with tons of content written about it (good), or something that very few people write about and, therefore, care about (bad).
You don’t need expert-level Keyword Planner skills here. Type some topic ideas into the “Your product or service” box, and click “Get ideas.”
This is what you’re looking for:
Keywords around the exact topic you want to write about should add up to a lot more than 100,000 searches per month.
This is what you’re NOT looking for, as you’ll have a hard time scrabbling together 100,000 views:
Again, we’re not going into advanced SEO here, and there’s lots more you can do with tools like this.
But you don’t need to be an SEO expert to get lots of traffic. This step is all about getting practical validation about the audience size for your topic.
You’ve got the traffic — now how do you convert it?
Here’s a little inspiration: 10 overlay examples to turn your blog traffic into leads.
By entering your email you’ll receive weekly Unbounce Blog updates and other resources to help you become a marketing genius.
2. Writing the post: Be bold
Once you’ve picked a topic you want to write about, you can write your post.
There are three things that every post needs to be if you want to succeed in content marketing:
Valuable: Can readers take your post and DO something with it to improve their current condition?
Interesting: Does your content make reader want to keep reading from beginning to end?
Unique: Does your content stand out from the rest of the content being written about that topic?
All three are “table stakes” for effective content marketing. But for the purposes of this post, where we’re focusing on traffic, let’s assume that you can handle making your post valuable and interesting… so let’s focus on the third: being unique.
Imagine a choir singing a melody; everyone looks the same and sounds the same, so you can’t really tell the difference between any two voices.
That’s what most content markets look like. Homogenous. Image source.
Now imagine Kool-Aid Man busting through the brick wall at stage left and belting out a tune that nobody in the choir had ever even considered before.
Kool-Aid Man turns heads. Kool-Aid Man is impossible to miss. Don’t join the choir. Be Kool-Aid Man. Image source.
How can you be bold like Kool-Aid Man?
Approach the topic in a way that nobody else has before
The first step of which includes looking at how everyone else is approaching the topic.
In our case, there were hundreds of articles about how to write for your business’ Facebook page, tips for promoting it, how to make sure that people saw it, what kinds of content to produce for it and so on. Everyone was part of the choir, talking about the best ways to approach Facebook for business.
We decided to be Kool-Aid Man and give our readers permission to not spend time on Facebook at all. Here’s the post title we chose:
Facebook simply hadn’t worked for us for lead generation as well as other channels had, so in the spirit of focusing our very limited resources on only the highest-ROI efforts that we knew would work, we decided to delete our Facebook page and not spend any more time on it.
We were happy that we did, and we thought that others could benefit from a bit of focus, too. And beyond that, we wanted to offer a reality check to remind readers that just because all of the “experts” talk about something, doesn’t mean you have to do it.
And so we wrote the post, the one that busted through the brick wall and didn’t look or sound anything like the choir.
Of course, when you write a post like this, a lot of people will disagree with it. Many will even be offended.
But a lot of people will agree, too. And the more worked up someone gets about your post, whether they agree with it or not, the more likely they are to share it with others.
So pick a side. The more contrarian, the better. And defend it vigorously.
3. Find distribution channels: Identify the gatekeepers
If you had 100,000 people on your email list, then getting 100,000 views wouldn’t be that hard. But let’s assume that you, like most people, don’t have a list that big (yet).
Well, there are lots of people out there that do.
This step is driven by simple math: it’s a lot more time-consuming to get your post in front of 100,000 people, one by one, than it is to put it in front of 50 people who will each want to share it with 2,000 others.
That’s distribution strategy. It’s the “influencer marketing” that has become a bit of a dirty word because so many marketers are doing it poorly.
Let’s go over how to do it well.
First, identify the influencers (the gatekeepers to your 100,000 people)
This is the most time-consuming part of the strategy, but it’s critically important. Skip it or skimp on it and you can kiss your traffic dreams goodbye.
This used to be an extremely painstaking process for us that involved hundreds of hours of Google research. Now it’s just a pretty painstaking process that involves several hours of Google research, plus a few hours using BuzzSumo.
Here’s what you do:
First, find as many content pieces as you can that have done well and that relate to your topic using BuzzSumo’s topic search:
Next, click on “View sharers” for each post.
You’ll get a list of influencers that shared the post:
This makes for a terrific place to start your outreach.
Get as many influencers as you can, cutting out the obvious dead ends (bots that curate content, fake accounts), and put them into a Google Sheet (here’s the one we use — just make a copy and steal it).
Try to get your list to at least 100 great leads whose total audience exceeds 5 million people (that means that you just need to get in front of 2% of them successfully to get 100,000 readers!), and add to your BuzzSumo-sourced list with:
Google research (search for the topic you’re writing about, and see who’s already written about it)
Twitter search (same approach: see who Tweets about the topic you’re covering)
Quora (if the question that you’re asking has been asked on Quora, see which influencers posted opinions)
Influential members of online communities and platforms related to your market
Quick side note:
Content marketing is a long game, and you’ll be a lot more successful if you view it that way. Nowhere is that more true than with influencer outreach.
You’re a lot more likely to have success with influencers who know and trust you because you’ve put in the time to follow and read their content, share it with others and contribute thoughtful perspectives in their comments sections. These are efforts that pay off dramatically over time, and I recommend you begin blocking off an hour or two each week to do that with everyone whom you see as an influencer in your market.
That will increase your success with this next tactic exponentially, though it will still work if you haven’t done this yet (it’ll just be harder).
4. Tell influencers about your post: Stand out
The next step is to tell influencers about your post.
The approach that we’ve used (something we originally saw in a Derek Halpern video many years ago) rests on three key pillars:
Take the time to make every outreach email deeply personal and honest: Mass emails are annoying and, often, useless. Nobody will want to build a relationship with you when it’s obvious that you’re sending them a canned outreach email. Personalize each email with an authentic reason as to why you’re reaching out to this person.
Never send your content in the first email: Almost everybody does this (“Here’s my post, please share it”). Not only is it rude, but it makes you look like everyone else. If you don’t understand why this is rude, read Permission Marketing.
Ask for feedback, not promotion: Again, everyone asks influencers to promote their posts. Remember: don’t be the choir. Ask them for something that’s not only more valuable, but that they’re probably more willing to give: their feedback.
The “authentic” in “authentic reason” is key. Find a post that they’ve written before, and actually do something with it.
I loved your post about email marketing myths; I had no idea that Tuesday isn’t actually the best day to send. Just shifted an upcoming campaign to Friday to see what happens
I know you’re an expert on this, and I’d love to get your thoughts on a post I’m working on about some surprising results I found when A/B testing subject lines.
Do you mind if I send you a link?”
Now, one of a few things will happen:
They’ll ignore you. Cool, move on.
They won’t give you feedback, but they’ll respond. In some cases, because you didn’t do what 99% of marketers do (ask them to promote your post), they’ll do you a solid and share your content.
They’ll give you feedback.
#3 is the absolute best outcome you could hope for, because not only do you get helpful feedback from an expert on the topic, but now they’ve invested time in the creation of your post. Now it’s their post, too.
So when you incorporate your feedback and come back with a request to share, they’ll be more than happy to help:
5. Find what works: Have fun with it
If you repeat this process across 100+ influencers, you will eventually get big traffic. In the example above, the post hit 100,000 unique page views around 80 days after publishing.
If you do this across 10+ different blog posts and different influencer markets, you’ll get even more traffic over time. And if you do it for a long time, you’ll turn your content into a significant and dependable source of new leads for your business. Because the first step to converting on-site visitors is getting them there in the first place.
You’ve got the traffic — now how do you convert it?
Here’s a little inspiration: 10 overlay examples to turn your blog traffic into leads.
By entering your email you’ll receive weekly Unbounce Blog updates and other resources to help you become a marketing genius.
But you’ll get the best results if you have fun with the process. Play with it and test different things at every step of the strategy:
Choose topics that seem weird to you (but that have big audiences)
Experiment with making your argument in different ways and formats (infographics, videos, etc.)
Try different scripts and calls to action for your outreach emails
You won’t break anything, I promise. The worst that you’ll do is get a negative data point that you learn and grow from.
Viral content marketing is both art and science
As you can see, getting 100,000 readers takes both art and science.
On the art side, writing is important and you have to make an interesting, useful and unique case. And you have to pitch it to influencers in an empathetic and honest way.
But ultimately, the art gets you nowhere without understanding that achieving your 100,000-reader goal can be broken down using science: start with a much larger pool of readers, test different ways to build relationships with the gatekeepers, track what works and what doesn’t and keep experimenting until you get there.
And don’t forget that you won’t win by joining the choir.
Like any potions master would attest, the secret to a great elixir lies in the measured combination of its ingredients.
Over the years, Titan PPC, a full-service pay-per-click advertising agency based in Vancouver, has developed a “magic formula” for designing lead generation landing pages that convert at average of 15% or higher.
The secret ingredient? For company founder, Patrick Schrodt, it doesn’t boil down to just one.
Any smart marketer knows that when visitors reach a landing page, they won’t all have the same intentions for being there. Some may have clicked an ad looking for a plumber in West Seattle where others may have clicked one looking for a plumber in Capitol Hill.
But if your client is a plumbing company that serves the entire Seattle metropolitan area, your landing page should show both the visitors from West Seattle and Capitol Hill that you’ve got the service they need in the location they want it.
In other words, you want to use geo-targeting to make your landing pages especially relevant to your prospects. As Patrick explains:
There’s always been geo-based searches and there always will be. For our own campaigns, we’ve gone as targeted as including a map on every landing page. We highlight a visitors location on the map depending on the where their search is coming from — people go crazy for it!
And the conversion rates don’t lie.
Watch this clip to hear how Titan PPC used geo-targeting to increase a client’s on-page conversion rates from 6% to 33%, practically overnight.
Interview with Patrick Schrodt, founder of Titan PPC.
2. Use (awesome) images to break up your body copy
Never judge a book by its cover… right?
Well, fact is, when a prospect reaches your lead gen landing page, the first thing they’ll do is judge your offer or product by the way you’ve presented it to them. And they’ll do it within seconds.
That’s why you want to make sure it looks so good they won’t want to leave.
The key to keeping prospects interested? Great photography. According to Patrick:
Images help prospects get a clear picture of your client’s product or offer, and it shows them you’re a professional.
Titan PPC adds full-page horizontal image galleries throughout their lead gen landing pages.
It helps break up a visitor’s attention as they scroll by giving them something nice to look at.
But you can’t just slap a bunch of images into a gallery and hope that it all comes together.
If you’re going to source images for clients, you have to make sure you grab photos from a series. I’ve seen landing pages where it’s obvious that each image belongs to a different suite and it’s not coherent or nice to look at.
Check out this example of cohesive image galleries on one of Titan PPC’s lead gen landing pages for a lawn mowing client in Philadelphia:
Screenshot of cohesive image galleries, landing page designed by Titan PPC.
3. Remind visitors why they are on your page
Remember that bit about making sure your landing pages were super relevant to your visitors? Well, that sometimes means reminding them exactly why they are on your landing page.
Why? Because it brings a prospect right back to where you want them: the form.
It works because every time a visitor sees something visual and eye catching [like the image galleries], they’re then prompted to fill out the form.
4. Make the form match the offer
Speaking of taking prospects back to where you want them, the design of a form on your landing page should never be an afterthought. That means weighing, measuring and sifting every item from the questions to the CTA so it’s fully optimized to ensure a conversion.
It’s so key that the form matches the offer. Otherwise a prospect will just be turned off.
So if your client is offering a 100% free quote on plumbing services, then the form on your landing page should reiterate, loud and clear, that the offer comes at no price.
Sounds pretty straight-forward, doesn’t it?
But matching a form to an offer also means making sure you have a solid understanding of your target audience. As Patrick explains:
For real-estate clients, the CTA is always to download a free floor plan. But for clients that are service based, like plumbers or roofers, the CTA is always to get a free quote.
It all comes back to personalization: different types of prospects want to see different kinds of offers. According to Patrick, real-estate prospects want the feeling of exclusivity, whereas service-seeking prospects are probably just looking for the cheapest way to fix a runny faucet or leaky roof.
Titan PPC’s last tip for optimizing the form? Make the form catch your prospect’s attention.
We always put a starburst or icon in the corner of the form. It’s usually something like ‘100% free’ so it pulls a visitor in and reminds them why they want to fill it out!”
Here’s an example of what Patrick means:
Screenshot of a high-converting landing page form, designed by Titan PPC.
From showing your visitors ultra-relevant content to making sure that content has awesome design and flow, the landing page magic formula is all about giving prospects exactly what they’re looking for and expecting to see when they land on your page.
Care to try some of Patrick’s tricks yourself?
Sign up for a free 30-day trial of Unbounce and try the Hyperion template, a design inspired by Titan PPC’s powerful elixir for high-converting landing pages.
What’s going on in the industry? What new techniques have emerged recently? What insights, tools, tips and tricks is the web design community talking about? Anselm Hannemann is collecting everything that popped up over the last week in his web development reading list so that you don’t miss out on anything. The result is a carefully curated list of articles and resources that are worth taking a closer look at. — Ed.
Autumn is nearly over, winter is coming to Germany and on the weekend the forecast predicted the first snow for the Bavarian Alps which is near where I live. Time to read about Service Workers, and some abstract topics like teaching complex algorithms, and how to be more objective.
Is there a concept like ‘a complete product page’?
Chances are if you have ever found yourself on a product page you have figured out the basic elements:
The Product Image
The Product Specifications
The Call to Action buttons.
The Payment methods.
Shouldn’t that be enough to make a sale? The user lands on your product page, a self explanatory title to the product he wants finds him, he reads the specifications (color, size, material, make, model, related features), after a glance he starts to look around for the payment methods. He likes it, presses the CTA button and bam! Sold! Works like the good old brick and mortar stores, or not?
The better question is; Is there something like complete shopping experience?
The answer is ‘Yes’.
That’s precisely what persuades them to press the CTA button.
Put yourself in the customer’s shoes..
You get into a retail store to buy pasta, you are greeted by the nice security guy at the door.The store manager smiles at you. You are pointed to the right shelf.
You scan through the variety of pasta (Spaghetti, Fusilli, Penne and Farfalle in tempting packaging). One has a free dip to go with it, you take it.
On the next shelf you find some dried rosemary, “Why not make it an exotic recipe?” you add it to your cart.
Now, you are looking for your preferred brand of ketchup, the staff member arranging goods on the shelves tells you they are out of stock.
A lady, another customer, exchanges greetings, casually mentions she loves the Tabasco and the Sriracha from a particular label. You take a bottle each.
The sign boards take you to the cash counter.
The lady at the cash counter wears a reassuring smile. She suggests you buy the fresh herb instead of the dried rosemary and offers to get it quick for you, you oblige.
A little guilt for overspending creeps in, you cancel one of the exotic sauces “I don’t need Sriracaha.”. The friendly lady at the the counter smiles and excludes it.
In analogy, your product page is the retail store. The friendly security guy , the store manager , the staff member, the options, the distractions ,the freebies, the branding ,the other customer, the sign boards, discount coupons, the reassuring lady at the cash counter who cares about your recipe enough to add fresh herbs to it are all product page elements.
Why would you press that button or make a purchase without the complete experience online?
The curious case of Benjamin (pressing the conversion) button.
Persuasion: The Reason Your User Will Press the Button
Subtle and not so subtle psychological factors are at play when persuading people to buy. Cialdini’s six principles of influence govern the product page elements as well. Here is a classification of the functional product page elements listed down for your convenience.
Reciprocity (It’s a Give and Take)
In simple terms tell your consumers you care and they’ll care to buy from you.
‘Hey, we want to save you some money, here’s the coupon for this product in your cart.’
‘If you want to talk we have a discussion board.’
Live chats and availability pop ups make your eCommerce site more interactive and human. Who doesn’t like a considerate seller?
The eager to help staff member at the mart and the lady at the counter know this secret. They are doing their job well by being helpful and responsive.
We want to belong to a common set of values, actions or belief. The consumer feels a sense of ownership when he sees ‘My Account’, ‘My shopping history’ mentioned on the product page. A history or an account is his investment into the website and hence a commitment. This commitment has to be reinforced with warranties and insurances under applicable conditions. Remember, if there is a store you visit often you are more likely to buy from them.
Usual Payment methods
User Account Login
Shopping (Buying) History
Suggestions Based On Your Shopping (Buying) History
Opt-in Form Or Subscription Form
Add this to cart
Terms Of Service Agreement
Credited points / Regular customer points
Links to E-wallets/ Bitcoins
If there is a store you visit often you are more likely to buy from them.
Social Proof (Since Everyone I Know is Doing It)
82% of consumers trust a company more if they are involved with social media. Belonging comes with acceptance. After commitment the human tendency is to look for validation. Validation on social and eCommerce sites comes with increased trust. If multiple users give rave reviews about an enlisted product people are more likely to consider buying it. Here other elements may include social share buttons which allow people to share and take an opinion on the enlistments they are interested in. That other lady at the sauce shelf shopping for the exotic sauces is the retail store’s social proof without even knowing it.
The page elements to influence by Social Proof are listed here:
Authority doesn’t mean you command your users to buy enlisted wares. It means that you create an awe around your products or your brand. How to do that? Has the enlisted product been endorsed by an ambassador? Was the product in news recently? Has it won any kind of recognition or awards? If so mention it, the product is more likely to sell; there’s a halo around it. The same applies to your eCommerce portal/brand name. If you have it, flaunt it!
Tech Specs with special features
Audio Visual advertisements
Product Endorsement Links
Authority puts a halo on the product, one must trust what wears a halo.
Likability (Like It…Will Take It!)
Liking makes a strong positive bias. This is not just acceptance this an out and out affirmation of your brand. Liking is an all-encompassing factor. It includes the UX, UI , and product presentations. It also means crazy copywriting that could lure the more adventurous buyers into visiting your website often, thus turning them into the creatures of habit who get committed to buying from you. It could be the underrated convenience that comes with the user interface or the overrated graphics, slides or product videos.
Include these product elements to be more likable:
Product Details Or Specifications
360 Degree Views Of Products (Photos And Videos)
Photos And Videos In Different Situations
Step by step Explanation Of Usage Of Product – Photos And Videos
Photos And Videos Of The Product When It Is Working
Sorting Options For Reviews
Options For Gifting This To Someone Else
Ability To List Products By Different Criteria
‘If You Bought This You May Like’ (Cross-selling)
Recently viewed products
Tools To Zoom In On The Product
Scarcity (It’s a Tease)
Multiple marketing campaigns promote limited editions to up their sales. The moment you tell your buyers that there are only a few of them left, there is an urge to click that button before anyone else does. ‘We are not telling you to buy this, we are just saying it’s now or never’. Then look at them go for it. But be sure not to create a false sense of urgency, that’s going to hurt your credibility in the longer run.
‘We are not telling you to buy this, we are just saying that it’s now or never.’
In a previous article1 I introduced mobile back end as a service (MBaaS) which aims at giving app developers the ability to create seamlessly new feature-complete cross-platform native and web applications.
The next step is implementing a complete demo application using those ideas. Through this real working application, you will be able to see the areas in which MBaaS provides value. This first part will walk you through a messaging application demo powered by the Kinvey application and explore how to leverage user management, file storage and the data store.
The second part will complete the demo and demonstrate how to leverage two key pieces of Kinvey functionality: the permissions provided by the data store, and push notifications, which are enabled through the business logic functionality.
Before jumping into the demo application, I want to highlight a few points. First, because I am using a real app to discuss MBaaS, knowledge of the development platform would be extremely helpful. I am leveraging iOS with Swift. In addition, knowing how to integrate with back-end services would certainly be helpful, in order to understand more about what Kinvey is doing under the hood. While all of this is helpful, the application’s full source is included; feel free to analyze the code at your own pace.
Secondly, because the demo application has more of an enterprise focus (as opposed to a consumer focus), I chose Kinvey2 for the MBaaS platform. In the last article3 I walked through the process of evaluating MBaaS providers. Note that Kinvey is not a free service, and licensing terms are attached to its SDKs (as one would expect). Licensing terms are included with each SDK download. You can get more information at the following links:
In the past three years, several clients have approached me about developing an internal messaging platform for their organization. This need has led to the success of such companies as Slack6 (which we use internally at Universal Mind7) and others like it. Because this was a common request, I wanted to see what it would take to implement a basic one-to-one messaging solution for an organization over top of an MBaaS solution.
To help you understand these concepts in a real application, I have provided the application’s entire source code. You can check it out on Github, “WaterCooler Demo8.”
To illustrate how an MBaaS solution can power an app like this one, we need to meet a few key requirements. Users should be able to do the following with the app:
create an account and set up their profile (including name, title, profile picture, email address and password);
log in (and be required to log in only once — at least until they log out);
exchange one-to-one messages with other members (visible only to the sender and recipient and inaccessible to other users);
browse a directory of members who currently have an account on the platform;
manage and update their profile information;
be alerted through a push notification that they’ve received a new message.
The following sections detail how I used Kinvey to meet these requirements. While I won’t go into detail on how every part of the application was created, I will give full context of the areas where Kinvey was leveraged.
The demo application is an iOS app targeting iOS 8+. It utilizes Swift (Xcode 6.1.1 and iOS 8.1.3).
The user interface was created following standard UI principles for iOS. It leverages Auto Layout12 (both within the storyboard and programmatically). The creation of this interface is beyond the scope of the article, but hopefully the example code will be helpful for your iOS applications.
Getting Started With Kinvey
If you’re following along, you’ll probably want to build the source code and run the application yourself. To do this, you will need both to create a Kinvey app and to include the credentials for the app in your code.
Creating a Kinvey App and Environment
To create a Kinvey app and environment, you will need to create a Kinvey account13. After signing up, select “Get Started with Your First App.” From this page, give your app a name, select iOS and the platform, and then click “Create App.”
From here, you will have an app created with a single development environment. Clicking on the “Development” environment will take you to the console. In the console, you will see both your appKey and appSecret in the top right. Copy these pieces of information because you’ll need to include them in the iOS app.
Configuring the iOS Application
Once you have created your Kinvey app and gathered your credentials, grab the code from the repository. Next, open the AppDelegate.swift file and update these values in the application:DidFinishLaunchingWithOptions: method.
// Extracted from AppDelegate.swift (http://tuck.cc/1w7wkyI)
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
// INCLUDE YOUR KINVEY CREDENTIALS HERE
let appKey = ""
let appSecret = ""
Once this is in place, you should be able to run the application as expected. If you want to run the application on a device, you will have to update the code signing as provisioning profiles (as with any iOS application).
For more information on setting up an iOS application with Kinvey, check out the “Getting Started16” tutorial.
One foundational element of any MBaaS is user management. This application will leverage user management to control individual user accounts and their respective profile information, as well as provide a directory of all users in the system. Just as with the rest of the functionality we will cover, this integration is provided through Kinvey’s iOS SDK17.
Creating a User
The first step in the process is to enable a user to create an account. When a user launches the application, they will land on the view that allows them to either log in or sign up. If the user selects “Sign Up,” they will be taken to the “Sign Up” page, which will guide them through the process of entering their profile information. When this process is complete, the code below is executed, which creates an account and logs the user into the application.
In this example, you will see the KCSUser class. This class handles the representation of a user and is also the gateway for all operations related to user management:
// Extracted from SignupViewController.swift (http://tuck.cc/1vsaWcr)
// Set the parameters of the user
var userParams = [
KCSUserAttributeGivenname : firstNameField.text,
KCSUserAttributeSurname : lastNameField.text,
KCSUserAttributeEmail : emailField.text,
kWaterCoolerUserTitleValue : titleField.text
// Save the user to Kinvey
KCSUser.userWithUsername(emailField.text, password: passwordField.text, fieldsAndValues: userParams) (user:KCSUser!, error:NSError!, result:KCSUserActionResult) in
if(error != nil)
println("USER NOT CREATED - ERROR: " + error.description)
// User created successfully
// Do other tasks, such as uploading profile picture to the file store
In this case, the fields for first name, last name and email address are include in the KCSUser object. However, Kinvey allows us to save other pieces of data in this object as well. The user’s title will be saved in one of these additional fields. An extension to the KCSUser object is also included (as seen below) to make it easier to access this value for a user within the application:
// Extracted from KinveyExtensions.swift (http://tuck.cc/1vsb5N7)
// Create a constant for accessing the title key from the user object
let kWaterCoolerUserTitleValue = "title"
return self.getValueForAttribute(kWaterCoolerUserTitleValue) as String!
If the user selects the option to log in from the landing page, they will be able to enter their email address and password (which they entered in the sign-up process). They are presented with an alert if their attempt is unsuccessful, and if they log in correctly, they are redirected to the main view of the application.
// Extracted from LandingPageViewController.swift (http://tuck.cc/1vsbeAe)
// Get the values from the form
let username = loginEmailField.text
let password = loginPasswordField.text
// Attempt to log in to the application
KCSUser.loginWithUsername(username, password: password) (user, error, actionResult) -> Void in
if(error == nil)
// Let the user know an error occurred in login. In this case
// we just present an alert using the UIAlertController.
let alert = UIAlertController(title: "Failed Login", message: error.localizedDescription, preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Cancel, handler: (alertAction) -> Void in
// Present the alert
presentViewController(alert, animated: true, completion: nil)
// There is already a segue defined to the main threads view.
// We need to perform this segue if we have a successful login.
performSegueWithIdentifier(WaterCoolerConstants.Segue.Login, sender: self)
From the profile management page, the user can log out of the application. Upon doing this, Kinvey’s iOS SDK also does some additional work in the background, including clearing out any cached values. In this example, after logging out, the user is redirected back to the landing page.
// Perform the log-out and send the user to landing page
@IBAction func logout()
performSegueWithIdentifier(WaterCoolerConstants.Segue.Logout, sender: self)
To fulfill all of our requirements, the application also needs to provide a list of all users. A special collection, KCSCollection.userCollection(), provides access to the collection of users for an application. Once you have created a store from this collection, you can query it as you would any other data collection. The following example illustrates how to fetch all users for the application:
// Extracted from KinveyDataManager.swift (http://tuck.cc/1vsd0Bp)
// Create the app data store corresponding to the users collection
lazy var userStore:KCSAppdataStore =
let userCollection:KCSCollection = KCSCollection.userCollection()
let store = KCSAppdataStore(collection: userCollection, options: nil)
// Fetch the users from the user store
func fetchUsers(completion: ([KCSUser]!, NSError!) -> ())
userStore.queryWithQuery(KCSQuery(), withCompletionBlock: (results, error) -> Void in
if(error == nil)
self.users = results as [KCSUser]
completion(results as [KCSUser]!, nil)
}, withProgressBlock: nil)
Note: For more information on managing users with Kinvey’s iOS SDK, be sure to check out the “Users20” guide.
One powerful feature of many MBaaS solutions is file storage. In our WaterCooler application, this comes into play when a user creates an account and adds a profile picture. We could also leverage this heavily to extend the app to support the uploading of images within messages. In this process, the file is uploaded to a content delivery network (CDN) and, like any other piece of data, has a full configuration of permissions.
// Extracted from SignupViewController.swift (http://tuck.cc/1vsaWcr)
// Upload the profile picture to the Kinvey file store
func uploadProfilePicture(completion:(file:KCSFile!) -> ())
if((self.photo.image) != nil)
let photoData = UIImageJPEGRepresentation(self.photo.image, 1.0)
KCSFileStore.uploadData(photoData, options: fileParams, completionBlock: (file:KCSFile!, error:NSError!) -> Void in
, progressBlock: nil);
// Once we have completed the file upload, assign the file ID to the user
// using a custom attribute
func assignProfilePictureIdToUser(user:KCSUser, picture:KCSFile, completion: () -> Void)
user.setValue(picture.kinveyObjectId(), forAttribute: kWaterCoolerUserProfilePicFileId);
user.saveWithCompletionBlock (user:[AnyObject]!, error:NSError!) -> Void in
In the code above, two distinct steps are occurring. First, we are uploading the profile picture to the file store. Once this process is completed, we are updating the user with the ID that the file store has returned. In this manner, we are leveraging yet another custom property on the user to store an identifying piece of information. Now, anywhere we display a list of users, we can also display their profile picture.
Note: For more information on working with files in Kinvey’s iOS SDK, see the “Files21” guide.
One of the benefits of Kinvey’s iOS SDK is that it allows you to map your Swift (or Objective-C) objects to Kinvey collection objects. The KCSUser class is a special class that is already defined and mapped to the user object, but in our case we will create two additional data classes that map to conversations and the messages within them.
WaterCooler Data Model
The WaterCooler data model will have two main entities, Message and MessageThread.
The MessageThread class will be responsible for representing a conversation between two users. It will contain information about the users involved in the conversation, as well as a reference to the last message sent in the conversation.
Within Kinvey, the entityId is a special field. If you do not assign a value to it, the system will assign one when the object is saved to the data store. In our case, we will go ahead and define a special value that maps to the two users who are in a conversation for the MessageThread class. The method that calculates this value can be seen below:
// Extracted from MessageThread.swift (http://tuck.cc/1w7jdOd)
// This method simply takes a user and the current user and creates
// an ID based on the alphabetized array of user IDs between these
// two users. In this way, we don't have to fetch additional information
// when displaying the message thread view.
class func threadIdentifierForUser(user:KCSUser) -> String
let userAIdentifier:String = KCSUser.activeUser().userId
let userBIdentifier:String = user.userId
let identifiers:[String] = [ userAIdentifier, userBIdentifier ]
let sortedIdentifiers = identifiers.sorted
$0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedAscending
The Message class will be responsible for tracking an individual message within an overall conversation. This class contains information about the message, including its time, contents, sender and related message thread. To get all of the messages for a particular conversation, we simply query based on the threadId of the conversation. The following code fetches all of the messages for a predefined message thread:
// Extracted from KinveyDataManager.swift (http://tuck.cc/1vsd0Bp)
func messagesForThread(thread:MessageThread, completion:([Message]) -> ())
let query = KCSQuery(onField: "threadId", withExactMatchForValue: thread.entityId)
messagesStore.queryWithQuery(query, withCompletionBlock: (results, error) -> Void in
completion(results as [Message])
, withProgressBlock: nil)
Data Model Relationships
Kinvey supports data model relationships within both the core data store as well as the iOS SDK. In our situation, the lastMessage property on the MessageThread class is one such instance. When we fetch a thread, it looks at specific methods in our class to determine how it should handle references to other collection objects. In our case, the following methods allow it to treat this reference as a Message instance:
// Extracted from MessageThread.swift (http://tuck.cc/1w7jdOd)
// This method tells Kinvey to save the message in the lastMessage property
// when the thread is saved. If this method were not included, the message
// itself would not be saved when the thread is saved.
override func referenceKinveyPropertiesOfObjectsToSave() -> [AnyObject]!
// This maps the properties in the class to specific values in the Kinvey
// data store.
override func hostToKinveyPropertyMapping() -> [NSObject : AnyObject]!
"entityId" : KCSEntityKeyId,
"lastMessage" : "lastMessage",
"metadata" : KCSEntityKeyMetadata
// This method tells Kinvey that the lastMessage property is a member of
// the Messages collection. (You need to put the name of the Kinvey collection
// here and not the name of the class.)
override class func kinveyPropertyToCollectionMapping() -> [NSObject : AnyObject]!
"lastMessage" : "Messages"
// Here you tell Kinvey which class to map the lastMessage property to. This
// is how it knows how to build the object when it fetches it from the server.
override class func kinveyObjectBuilderOptions() -> [NSObject : AnyObject]!
let referenceMap:[NSObject : AnyObject] = [
"lastMessage" : Message.self
KCS_REFERENCE_MAP_KEY : referenceMap
Data Model Classes in Swift
For data model classes to work properly in Swift, they need to be able to leverage the default initializer. This means you need to have a default value for each property within the class. You can still leverage convenience initializers, as we have done here with the Message class:
// Extracted from Message.swift (http://tuck.cc/1w7kkgB)
// This initializer creates a Message instance based on the message text
// and the recipient ID. This is the initializer that is used when a
// user creates a new message in a conversation.
senderId = KCSUser.activeUser().userId
self.messageText = messageText
entityId = NSUUID().UUIDString
metadata = KCSMetadata(userIds: [recipientId], includeActiveUser:true)
Note: For more information on the data store and data modeling in Kinvey, see the “Data Store22” guide.
Through this process, we have completed the core of Kinvey interactions for the application. However, with all of this in place, two key requirements still have not been met: data permissions and push notifications. In the next article, we will explore the permissions model in Kinvey, as well as the business logic functionality provided by the platform.