Researching Landing Page Solutions
Lately, I’ve been doing a fair amount of research on landing pages and services that provide them. My requirements for the landing page are thus:
- It provides an offer that can be redeemed at a storefront
- It has a trackable phone number
- It contains a code generated from the referring page
- It has copy and design that provokes the user to act
What I’m looking to do is generate campaigns for clients who depend on foot traffic for their business. If the customer needs to be inside your store to do business, then I want to to be solving that problem for you.
To do this, I want to generate landing pages that contain a coupon. The coupon will provide a special, promotional offer for the customer. It will also contain a code that will refer back to that original customer and a phone number that can be tracked to determine how many phone calls made to the storefront are attributed to the campaign.
The landing page is the cornerstone of the campaign. I am planning to generate traffic to the landing page from social media, organic search, Google PPC ads, and Facebook PPC ads.
The data generated by the landing page will allow me to determine which of these channels is the most effective in reaching our target market and mold campaign to maximum efficiency.
Before building this landing page myself, I decided to see some of the solutions that were already out there.
The first one I came across was Unbounce.

Unbounce does a lot of cool things if you’re simply trying to flesh out an idea and gauge interest in an idea or a promotion. It does a good job of generating leads, and it makes analytics and testing like A/B and multivariate testing much easier than coding your own from scratch. It also has a number of templates and a wysiwyg editor to change the design of the landing page - a nice feature, but uncessary for me as a web developer.
However, Unbounce didn’t meet my needs for driving foot traffic. If I provided a special offer on an Unbounce landing page that allowed the user to print a coupon to come into the store, there was no way for me to generate a specific coupon for each individual customer. This meant I would need a second page that the unbounce page prompted the user to visit. This second page would need to be coded up by me so I could custom generate the code and promotional materials to get the user into the store. At that point, it makes more sense just to build my own landing page.
My research for a ready-made solution led me to Dukky.

Dukky does 80% of what I want it to do. It creates landing pages for me, but allows me to customize the design myself. These landing pages are organized around a campaign that hinge on collecting names, emails, and other data from potential customers. Dukky will generate custom URLs that point to the campaign landing page that can be deployed specifically to social media, ppc ads, or organic search results. It also generates coupons with custom barcodes so that users can be tracked from the original referer to the landing page all the way to the storefront. That is exactly what I needed with my analytics. Here’s a great video about how it works:
The problem with Dukky is that it forces the user to fill out a form. Now, a good number of my landing pages will require potential customers to fill out information so my clients can understand more about their leads, but for the purposes of generating foot traffic, a customer’s specifics are not completely necessary. Filling out a form with sensitive information like name and email is just one more obstacle to getting that customer into the store.
Also, Dukky doesn’t provide trackable phone numbers. There are certainly services that would be compatible with Dukky to this end, but if I wanted to generate a phone number for a subset of potential customers, I would need to do it all myself. Another reason to just build my own.
Dukky also forces you to buy and use a different url for each campaign. This isn’t necessarily a terrible thing, but I would much rather use subdomains of domains that I already own or that my customers already own. Something like promotionname.clientdomain.com instead of promotionnameclient.com.
Finally, Dukky is expensive compared to similar solutions. I fully believe its worth the price, but Unbounce, for comparison, is $50/month for the base package and free for the 30 days. To run my first Dukky experiment would have cost me nearly 10 times that. Not bad if the campaign is generating $2,500-$15,000 in sales, but not good for just running a landing page experiment.
Unbounce and Dukky both provide excellent solutions for building and tracking landing pages. Both tools seem to be fully worth the money if they meet your specific needs. However, neither of them met mine. Ultimately, I decided to run my first landing page experiment myself. I’ll be documenting my process in a future post.
If you’re a fan of Tumblr’s recently updated Android app, consider the wisdom of Tumblr’s own Android expert Chris Haseman. He recently released his second book, Creating Android Applications: Develop and Design. Available for Kindle download and paperback purchase via Amazon, Chris shows you how to use the powerful set of Android tools to begin creating the next generation of Android applications.
“I wrote the book because learning Android is hard in a few ways,” he says. “Doing a bunch of searches on how to write an Android application gives you information without knowledge.”
Creating Android Applications provides a complete introduction to developing for Google’s mobile OS, offering tons of insights and hard-earned advice. After a tour of how to install and configure the Android SDK and Eclipse IDE, you jump right in to build your first Android project.
“Android has several traps for beginners all of which I’ve fallen into. The book, in a way, is my best attempt to help new people avoid them,” Chris says. “Plus, I’ve always wanted to dedicate a book to my wife, and this seemed like the shortest path to get there.”
Source: staff
This is something I have fantasized about doing. Lowering commitment, freedom from consumerism, cuttings costs. There’s nothing bad about getting creative with thrift stores.
Love is like an hourglass, with the heart filling up as the brain empties.
Jules Renard
Much thanks to Ken P Duddl for introducing me to Renard.
Source: Wikipedia
Sinners in Parish
I’m a huge fan of Jay-Z and Kanye’s Ni***s in Paris. I think its the best hip-hop in ten years. The youth at our church are big fans too. This is for them.
Fall so hard Jesus wanna find me
First the devil try to bind me
Whats 26 years to my eternity
Can you please remind me
Fall so hard, i need saving
Ya’ll don’t know no building can save me.
Could go to church 7 day in a row
and I’d still be in Hades.
Fall so hard, I got fear
Perfect love cast it outta here
Fall so hard, I cant fight
Dont understand I was bought for a price
Disciple, I’m liable to go Prodigal
Take ya pick
Peter, St. Paul, Jonah, Big Fish
Fall so hard, got a broke hip
Not the kind from a hard slip
Jacob’s limping tells why
Wrestlin with God is like a bad trip
Fall so hard, I can’t do
The love deeds I’m designed to
Need a second chance, second try
And be in Warren saving souls too
Fall so hard, cant get away
Won’t rest again for like 6 days
Cold morals, Loud Quarrels
Then spued out his mouth like gut rage
Fall so hard, sin goodbye
Not gonna need no clergy guy,
End sins, burdens, Save me, JC
Fall so hard, Jesus wanna find me
Helps me pray
Helps me pray
Helps me pray
Fall so hard, Jesus wanna find me
Helps me pray
Helps me pray
Helps me pray
He said, Pat, tryin ta overcome your sin?
I said, sir, I am better than most men
The Truth is there is no one good but God
Wanna get to heaven then I’m goin through the Lord
Help me pray, come on J
Friday order: fish filet
Lenten fast, can’t heal pain
JC gonna come and take His house by force again
Choir girl, grab her butt
I lost my key and heavens shut
Betrayed her love now she’s a slut. I need cut.
We always get Christ wrong if you ask me
I keep my hands clean, ma soul is nasty
What’s lyin my lawya?
What’s whorin my sista?
What’s cancer, my healer?
What’s that crucifix, Savior?
Preachers say I’m so pious
Cause I’m sufferin’ from righteous
Indignation and anger
And my soul is in danger, huh?
Source: hipstrumentals.com
POST Tunneling: HTTP DELETE and PUT requests with JQuery and Django-Piston
Note: This post assumes some knowledge of Django. Everyone should have some knowledge of Django, so go get some!
Writing code in the Warren and Youngstown area is probably a lot like selling fertilizer to New Yorkers. Nobody cares how exactly it works, just so long as they don’t have to touch it themselves and it does the job they want it to do. I’ve had a couple of clients lately who have asked me to build them a REST API for their web applications without asking me to build a REST API for their web applications. One of them wanted a simpler user experience (“I want it to be more user friendly, on one page, and I don’t want all these forms jumbled up in different places”), and the other wanted a more maintainable codebase (somebody had all but re-written the Django Forms API in some of the ugliest code you’ve ever seen).
Both clients (customers, not browsers) had a very similar problem - their applications called for all of the data to be input on the same web page in the same context, and too many forms were either confusing the user, or the maintenance programmers. The client (browser, not customer) needed to be communicating to the server throughout the data creation process.
So I decided to build REST APIs for the both of them using Django-Piston.
The great thing about Piston is that it provides classes with methods that correspond to HTTP methods, and those classes and methods can be overriden. The classes can be turned into resources that URLs can be pointed to, which means that one URL can point to one class and different HTTP methods requested at a URL can execute different code on the server.
If you didn’t catch all of that, don’t worry - here’s an example.
Let’s say you have two URLs for blog posts in Django:
from django.conf.urls.defaults import *
urlpatterns = patterns('',
url(r'^blog/post/$', 'blog.handlers.blog_post'),
url(r'^blog/post/(?P<post_id>[\d]+)/$', 'blog.handlers.blog_post'),
)
So when a GET request is made to “http://hostname/blog/post/”, the response is a list of blog posts in JSON. When a GET request is more specifically made to “http://hostname/blog/post/118/”, JSON for that specific blog post is returned.
To provide this functionality, we’ll have to write handlers to return responses to requests to these urls. Our blog.handlers module (referenced in the URLs above) will take care of that:
from django.shortcuts import get_object_or_404
from piston.handler import BaseHandler
from piston.utils import rc
from piston.resource import Resource
from blog.models import Post
class BlogPost(BaseHandler):
allowed_methods = ('GET',)
def read(self, request, post_id=None):
if post_id is None:
return Post.objects.all()
else:
return get_object_or_404(Post, pk=post_id)
Let’s break this down a bit:
- The BlogPost class inherits from the Django-Piston BaseHandler class.
- The allowed_methods field is a tuple that contains strings that correspond to HTTP methods. Allowed values are ‘GET’, ‘POST’, ‘PUT’, ‘DELETE’
- The read method overrides the base class method. It corresponds to the GET HTTP method.
- Because two different URLs point to this handler, the post_id parameter may or may not be available, so its optional.
- An if statement here checks if post_id is set. If it isn’t, it returns all of the posts. If post_id is available, the method returns that specific record, or a 404 if the record doesn’t exist.
- Note that Piston takes care of the JSON serialization.
That takes care of retrieving blog posts, but what if we wanted to create a new one, update a current blog post, or delete a blog post? Well any good REST developer would know that you’d use the same URL and a different HTTP method to achieve the specific functionality. Let’s have a peak at the code:
from django.shortcuts import get_object_or_404
from piston.handler import BaseHandler
from piston.utils import rc
from piston.resource import Resource
from blog.models import Post
class BlogPost(BaseHandler):
allowed_methods = ('GET', 'POST', 'PUT', 'DELETE')
def read(self, request, post_id=None):
if post_id is None:
return Post.objects.all()
else:
return get_object_or_404(Post, pk=post_id)
def create(self, request):
blogpost = request.POST['blogpost_data']
post, created = Post.objects.get_or_create(blogpost)
if created:
return post
else:
response = rc.BAD_REQUEST
response.write('Record already exists')
return response
def update(self, request, post_id):
post = get_object_or_404(Post, pk=post_id)
post.blogpost = request.POST['blogpost_data']
post.save()
return post
def delete(self, request, post_id):
post = get_object_or_404(Post, pk=post_id)
post.delete()
return rc.DELETED
A few things to notice here:
- allowed_methods has been updated to accept all of the possible values.
- The create, update, and delete methods correspond to the HTTP methods ‘POST’, ‘PUT’, and ‘DELETE’ respectively.
- For anyone unfamiliar with Django - I’m taking some very large liberties with model instance creation here. Conceivably, Django model instances could be created and updated this way, but I wouldn’t recommend it.
As an example, a POST request to ‘http://hostname/blog/post/’ will use the POST payload to create a new record for the Post model. A PUT request to ‘http://hostname/blog/post/118/’ will update the Post that has an id of 118. A DELETE request to the same address will delete record id 118.
POST Tunneling
When my web apps consume the APIs that I write, I like to do so with Javascript. Why should my server have to handle the load of consumption when I can have the users’ computers do it?
The problem with consuming a REST API with client-side Javascript with AJAX is that most browsers only give access to two HTTP request methods - GET and POST. We definitely still want to be able to update and delete records in our example. We could just stuff more data into POST requests and do all the handling inside the create method, but that wouldn’t be RESTful or very elegant.
Luckily, there’s an HTTP Header that was dreamt up for just such an occasion: HTTP_X_METHODOVERRIDE. You can add it to your JQuery ajax requests like so:
$.ajax({
type: 'POST',
url: 'http://hostname/blog/post/118',
data: {BlogPost: 'some data'},
success: function(){ alert('Post Deleted'); },
headers: {'X_METHODOVERRIDE': 'DELETE'}
});
This is known as POST Tunneling - making a POST request act like a different type of HTTP request. Of course, without some modifications, your Django server application is still going to handle this as if its a POST request. What you want to do is change the request.method for every incoming request that contains the HTTP_X_METHODOVERRIDE header. To do that, we’ll create a new file in our blog app called middleware.py. See the documentation for more information on creating middleware. Here’s the one we’ll create:
class TunnelingMiddleware(object):
def process_request(self, request):
if request.META.has_key('HTTP_X_METHODOVERRIDE'):
http_method = request.META['HTTP_X_METHODOVERRIDE']
if http_method.lower() == 'put':
request.method = 'PUT'
request.META['REQUEST_METHOD'] = 'PUT'
if http_method.lower() == 'delete':
request.method = 'DELETE'
request.META['REQUEST_METHOD'] = 'DELETE'
return None
Now every HTTP Method is available to our Piston Handler and each one of its corresponding methods from any type of JQuery AJAX request we want to make.
Happy Valentines Day to Me. It appears life is a happy song after all.
Squeezing the Lemon: Tech needs more Bees and Flowers, Fewer Wasps and Lemons
Symbiosis is a natural phenomenon. It describes the various types of biological interactions that occur between species. In Mutualism, it works to the benefit of all the organisms involved - services and resources are exchanged and life flourishes on all sides. In Parasitism, it works to the benefit of one organism and to the detriment of the other - it is a one-sided relationship that, if allowed to continue, leaves the host species drained and lifeless.
Technology, along with all other human endeavors, has evolved an ecosystem comprised of symbiotic relationships. The Builders in tech envision products and services that improve our quality of life and diligitently craft these wares for a populus that wants and needs them. Like the industrious bee, Builders work tirelessly to see a vision realized and the manifestation of their labor advances the species.
But bees cannot build their impressive hives and make delicious honey without help. They require a mutualistic relationship with those in their environment to gain resources and carve out a position therein. So the noble bees go to flowers for nectar in exchange for transporting pollen to neighboring flowers where further nectar is exchanged. The flowers of Tech are able to both catch our attention and pool our resources.
Venture capitalists gather funds from dozens or even hundreds of investors and re-channel them into startups that build hives like Facebook or Google. When the VC-startup relationship mutualistically flourishes, great wealth and great technology are created and the environment blossoms.
Technology journalists report on startups and direct the flow of more eyeballs to their startup subjects (and their advertisers) than any tulip or rose ever could. When the journalism reports on daring new endeavors, or constructively criticizes the bold moves of the Builders of our industry, then they stoke the fires of innovation and inspire intellectual discourse about a myriad of problems - problems they are helping solve. The ecosystem thrives.
The problem in Tech is that neither the bees nor the flowers are very loud. The bee makes no more noise than it needs to do its work, and the flowers portray the beauty of the bee’s diligence without needing so much as a throat clear.
The problem in Tech is that there is another organism in this environment making more noise than it warrants.
Not all of the relationships a bee has our mutualistic. It’s relationship to the wasp is decidedly parasitic. The wasp lays its eggs on bee cocoons, and the young of the wasp eat the bees from the inside out.
One cannot escape thinking about the Lemon.
I’m sorry but I have to say it: The Grammys suck.
— MG Siegler (@parislemon) February 13, 2012
Nothing like bashing something you could never create yourself to really fuel that ego.
The parasites in Technology include VCs, Journalists, executives, engineers, patent attorneys and marketers. Like bees and wasps, you can barely tell them from their counterparts at first glance, but each of them have evolved without a core trait: integrity.
No where has this been highlighted better lately than the ramblings of the Lemon. His foray into Venture Capital has morphed his “journalism” from a biased chasm into an integrity blackhole.
A Diagram of the Lemon’s Integrity
We are long removed from a time when the Lemon wrote about new technology mutualistically - to increase his eyeball flow while influencing and fostering innovation in technology. That Lemon shriveled and dryed up years ago. Unfortunately, we’ve also had to say goodbye to the rabid, Apple troll who garnered pageviews for TechCrunch and filled his pockets with cash payed by advertisers hungry for eyeballs. That Lemon is also dead - given way to a much more evolved form that no longer possesses any remaining integrity genes.
Blogger-Venture Capitalist Siegler is on the Path (pun intended) to being the biggest wasp in Silicon Valley. He outted himself yesterday in his limp response to Dan Lyon’s scathing exposure of the new Lemon:
They get to take a break from reporting about Yahoo personnel news that no one actually cares about to writing passionately about “too insidery” things that no one actually cares about. But with flair!
Which should be read as:
Wait! Stop! Don’t look to closely behind the curtain! What’s back there isn’t important! Just keep listening to the pomp and garbage I’m spewing at you!
Journalism is about exposing inside information. The idea that Siegler is calling out Lyons for writing about integrity issues in journalism speaks volumes to how bad his integrity has gotten.
Any true journalist would be praising Lyons for brining into sharp relief what the Lemon has a vested interest in keeping blurry - bloggers that command a lot of page views cannot keep their integrity as technology reporters AND become technology venture capitalists at the same time.
Instead, he tries to sweep his own lack of integrity under the rug as something that is “to insidery” for anyone to care about.
Shameful.
I would caution any startup considering CrunchFund as an investor to beware. At least one of their partners is a wasp, and you don’t want to let the Lemon turn your business into a hollow cocoon.
Me with a new friend - ASUS Transformer Prime. I’m thinking of naming it Ashanda.
http://www.businessinsider.com/have-idea-for-a-startup-dont-launch-a-company-launch-an-experiment-2012-1
I’m a big believer in this. The most challenging part of Lean is considering your very first experiment and then building an MVP to test it.
The only time I recommend building something more than the most minimal product is when you earn a living as a developer. Lean is about eliminating waste, and whenever you, as a developer, add something cool to your portfolio, its never a waste - even if you’re the only one that wants to use it.



