Dream 100 Marketing and “The Ultimate Sales Machine”

I recently put down Chet Holmes’s The Ultimate Sales Machine. It is one of the best business and marketing books I’ve ever read. And I read way too many. I will attempt to summarize it in one hundred words.

Schedule six tasks everyday. Work on your business from different angles with people in your business once a week for an hour on a specific topic. Train constantly. Drill sales techniques. Use what works for your best people. Build your sales into an education department. Teach them about their market. Give away value. Connect with affiliates. Target your dream customers. Be consistent in your education-based approach. Be unique. Get noticed. Be the trade association. Follow up like crazy. Send a letter now. Call later. Send them something to help with their business. Be personal. Make life long friends. Think positive.

This resonates with what I’ve read from John Jantsch, Noah Kagan, and Jason Fried. It has made me really focused on education. I have a few specific things added to my todo list now:

  1. Create a great whitepaper and landing page(s) meant to collect email addresses. I have a way for people to subscribe now, but it has no focus.
  2. 6 item scheduled todo lists everyday. This really works for me. I am dramatically more focused and productive.
  3. Plan out the specifics of a Dream 100 marketing effort.

The last item is a big one. I need to plan mailouts, followup calls, gifts, and compare costs to customer lifetime value. I need to collect contact information for a targeted list of customers. Finally, I need to execute all of it over months and be immune to rejection. Persistence in the face of (sometimes personal) rejection is a basic sales skill, but it is far from a common skill among software developers. I have the resolve and thick skin, but something about this sort of persistence isn’t natural to me. I think it should be.

Microconf 2011

MicroConf 2011 was an excellent event for bootstrapped solo entrepreneurs. It came complete with two days of great speakers, high quality attendees, and a free lunch from Microsoft. Thanks Patrick. It was all topped off when Andrew Warner and Hiten Shah secured a collection of refreshments and a suite at the conference hotel where many of the speakers and attendees could hang out for hours after the conference ended. A big thanks for that. More opportunities for interaction between attendees added a lot to the experience for me.

I’m going to summarize some ideas that stuck with me from the conference. I will highlight recurring themes from speakers and mention tips that resonated with me from talks and conversations. None of these ideas are completely new to me, but the practical presentation by high quality individuals allowed me to grok them in a way I didn’t before. Being surrounded by people pushing forward using these ideas changes the way you think about them.


Andrew Warner was the first speaker and he led with this idea. Hiten Shah, Patrick McKenzie, Noah Kagan, and Sean Ellis all echoed the need to test and verify everything. The idea of testing exhaustively is not new. Patrick reinforced it with numbers: if you improve 5% per month then you have improved 70% at the end of the year. Interested in 70% more revenue?

Todd Garland and Ramit Sethi disagreed with them in a small way. They wanted people to test. They wanted them to test things that might have a bigger impact first. Throw out testing button colors or pages with 30% conversion rates. Test everything but prioritize testing with other activities. Don’t spend 5 hours testing button colors. Spend a couple minutes once in a while on things like that. Test the bigger things: headlines, value propositions, testimonials, videos etc. Todd pushed the idea that you should build your vision and capitalize on what is working. Test less.

Talk to Your Customers

Many people involved in this space are familiar with the Customer Development process credited to Steve Blank. Hiten Shah spoke directly about that. Nearly all of the speakers had anecdotes about speaking with customers through email, in person, or on the phone. Justin Vincent called all of his customers. Marcus McConnell even called his competitor’s customers.

They used those conversations to understand the customer.

  • Why do you buy?
  • What do you like about the product?
  • What is your biggest concern related to the product?
  • What features do you need added?
  • What features do you not care about?

“Your success isn’t in lines of code, but in what you know about the customer.” – Hiten Shah

You may not have to strictly follow Steve Blank’s process, but clearly you should be talking to customers frequently. Make it practical. One attendee mentioned that he connects with potential customers by posting ads on craigslist. If you are solving someone’s pain, they will want to talk to you. Find them.

Test Pricing and/or Charge More

Patrick McKenzie thinks you should charge more. Double it until you see resistance. Roll back to the previous price at the resistance level and inch it up slower to test. Call it the binary search model of pricing. Many people at the conference told stories about overestimating the price sensitivity of people you can solve problems for.

Double Down on What Works

Sean Ellis and Todd Garland both mentioned this in their talks. If you have customers that love something about the product, you should focus on that aspect of your product and improve what they love. You can always find people to complain about problems and missing features. Focus on what works.

Sean Ellis said the same thing applies to marketing. You can improve how people perceive your product by merely refocusing your messaging around what they already love about the product. Survey the customers to understand what that is.

Focus and Personalize Messaging

Ramit Sethi was the champion of this theme. He gave a great example of how P90X has a website where they market to anyone who is interested, but they have images and videos that connect directly to people. He said if people don’t see that the message is directed at them, they lose interest and leave. P90X shows videos that connect to all types of people in the before and after style. Fat guy becomes skinny guy? Young Mom slims down? Athletic guy gets cut? Etc.

Ramit reinforced that people don’t care about you or your product. They care about solving their problems. The last time you bought groceries did you ponder what it was like to work there or how the employees there would feel about your patronage? No one cares about those details. They have a problem and they want a solution. Your beautiful code, copy, marketing, background, skills, and income are irrelevant to them.

Automation & We Don’t Do One-Offs

Everyone seemed to agree here.  Automate support, SEO tasks, keyword analysis, server maintenance, app monitoring, etc. Use videos to minimize your support burden like Justin Vincent and Pluggio.

Todd Garland made an exception for one-offs meant to make customers happy that didn’t involve one-off work on your product. Noah Kagan implicitly agreed when he talked about treating your customers like your life depended on keeping all of them forever.

“If you aren’t doing automation, why are you in the software business?” – Todd Garland

Avoid Difficult to Lose Expenses

I believe Mike Taber was the first to mention this directly, but Marcus McConnell and a few other speakers had the unenviable experience of signing on to leases and hiring employees that they could not afford.

It isn’t that you should never get an office or hire people. But can you find a month-to-month co-working space? Can you find contractors to fill the gaps?

Avoid expenses as long as possible. Find ways to go around.

No Silver Bullet

An overarching theme developed for me through the speakers and conversations with attendees. There isn’t a single path to success. The things that work still require a lot of work and persistence. It all reinforced Jason Cohen’s idea that quitting is the only way to kill a startup. Talking to customers and testing is great advice, but the reality is a long road of tasks that require discipline, persistence, and willingness to meet failure and rejection.  This is a critical insight.

“There is a silver bullet…your product.” – Todd Garland

I’ll see you at MicroConf 2012. Thanks to Rob and Mike for putting on the event.

Installing Reportlab on Mac OS X 10.5

I’ve decided to implement printable reports across my webapps. The first step was finding a good way to generate pdf files from Python and then integrating that with Django. I chose reportlab because it is pretty slick and integrates with Django for pdf views.


On Ubuntu this was extremely simple. I activated my virtualenv and:

pip install reportlab

Unfortunately this didn’t work for me on OS X 10.5. I received an error:

ld: in /Developer/SDKs/MacOSX10.4u.sdk/usr/local/lib/libstdc++.6.dylib, file is not of required architecture for architecture ppc

I couldn’t find anyone else on Google with this specific problem but a few people with related issues turned me on to the solution. First, you don’t really want to build the ppc architecture stuff. Second, you should try to compile with the libstdc++.X.dylib that you have in /usr/lib. You can do all of this by downloading reportlab and running:

tar xzvf reportlab-tar.tar.gz
cd reportlab-folder/
ARCHFLAGS='-arch i386' LDFLAGS="-L. -L/usr/lib/" python setup.py install

Joy! Now that I’ve got things installed I can knock out these printable reports easily.

Ups and downs and microconf

I’ve been down on Whitetail Census lately as it has been a real struggle to generate traffic and interest. I’m opening myself to alternative ideas for products, but I plan to be extremely careful about vetting market interest and verifying the ability to connect with the market online. I do plan to continue with Whitetail Census and Whitetail Scout as I have been. I even have plans for a new angle on the whole enterprise.

I’m thinking to provide a service that includes the features in Whitetail Scout and Whitetail Census combined with a small twist. The survey features would be de-emphasized and instead I will provide a way to organize trail camera photos where they are automatically tagged and organized for you. I had planned to add uploading photos of harvested deer as a Scout feature in the future. These two features should dovetail together nicely.

I removed myself from pursuing the big QDMA conference this year for several reasons. Most of all, I don’t feel that the traction and interest I’ve generated in the product warrants that kind of expense. If the interest level picks up I can change course and plan to attend future conferences and exhibit at some of them. I think Whitetail Census is harder to understand than I previously anticipated. I need to improve my understanding of what to communicate to people to convey the value or understand what adjustments need to be made for a better Unique Value Proposition.

I decided to attend MicroConf in Las Vegas as a way to network and improve my skills in building Whitetail Software. I think it’s a great opportunity to learn, meet new people, and up my own motivation. The ups and downs of trying to build products from nothing are well documented elsewhere, but the reality of it is much harder to deal with when you live it out. I sometimes find myself giving obvious advice to the TechZing guys when they discuss where their projects are. Implementing many of those same ideas is much more difficult when you have your own emotion, blood, sweat, and tears tied up in it. I find that reconnecting with other entrepreneurs in person, audio, video, or text can really help get the motivation to persevere back up.

Announcing Whitetail Scout

Whitetail Scout is a whitetail deer records management system. That means people can enter harvest and observation data to keep records and track trends to assist in management decisions. It can also be a handy way to compare harvests year-to-year.

I released it into the wild recently and I have big plans for the future of this product. I think it can go in many directions to improve the ease of deer management. I’m always interested in feedback.

How resourceful are you ?

I heard Jason Calacanis on TechZing talking about this subject a while back. He mentioned that in an interview he’d ask people how they would solve a particular technical problem they hadn’t encountered before. The immediate answer was usually to search for it. Tech savvy readers are likely thinking the same thing. His reply to was to ask, “What if search engines are all down?” The point was to continue as far as the candidate would go before they gave up. Each response was looking for the candidate to offer a new option because the previously mentioned one is deemed unsuitable or unavailable. IRC? Wikipedia? Quora? Ask a Coworker? Manual? Office book? Library? Call the company? E-mail a friend? The premise is that people who are smart and get things done will be more resourceful and better able to list alternatives because they can become consumed by solving particular problems. Brainstorming and resourcefulness are (like much else) the products of practice.

I think this idea could be a useful filter for interviews and it lets you look for a certain kind of dogged persistence in a candidate that would be otherwise difficult to discern in a short interview process.

My twist on this idea for my own benefit is brainstorming and becoming more resourceful at customer development. What are the most effective ways to connect with customers and what concrete steps build those bridges? I’m betting on blogs, conferences/meetings, and SEO content. These are common avenues. What needs to be uncommon for success is resourcefulness. Persistence. Determination. Because bootstrapped startups fail only when you quit.

Node.js TLS connections, requests, servers, etc.

The first thing you’ll need to be aware of is that node.js is a fast moving project. This tutorial was written for node.js 0.4.2 but may work or be useful for later versions of node. Secondly, my code examples are in CoffeeScript which compiles to Javascript but has Python/Ruby-like syntax. I find the code to be cleaner and faster to write.

Next up are some administrative details. If you’re going to make TLS/SSL requests you’ll need to have or generate keys and certificates. I’ve included the basic commands to get you started without understanding this step because you need something running now. I understand.

openssl genrsa -out server.key 1024
openssl req -new -key key.pem -out csr.pem
openssl x509 -req -in csr.pem -signkey key.pem -out cert.pem

Fortunately creating a server that listens for TLS connections is quite simple. It is nearly exactly like creating a server that listens without the security using the net lib where here we require tls.

fs = require 'fs'
tls = require 'tls'

privatekey = fs.readFileSync 'server.key'
cert = fs.readFileSync 'cert.pem'
ca = fs.readFileSync 'cert.pem'

options = {key: privatekey, cert: cert, ca: ca}

tlsserver = tls.createServer options, (s) ->
                s.write "This is S(SL)parta!"
tlsserver.listen 8989

You may now be wondering what that hash with options is for. The key is used to encrypt and decrypt on the server side of the connection. The cert is a token used to verify the identity of a server and who runs it. Usually certs are signed by a third party like GoDaddy.com or Verisign. The ‘ca’ bit is the certificate authority which lists certificates that can be trusted without being signed by a trusted authority, trusted authorities to contact for such lists, or the default list of authorities to contact. If you’re using a self-signed certificate like the one I’ve generated you’ll want to include it in your ca string or you will get errors from openssl about self-signed certificates.

The server part of this equation is rather well documented. The client bit, however, is much less elucidated in the node docs. Problem solved.

tls = require 'tls'
fs = require 'fs'

crt = fs.readFileSync 'cert.pem'
ca = fs.readFileSync 'cert.pem'
options = {cert: crt, ca: ca}

s = tls.connect 8989, options, ->
        s.connected = true
        s.write 'Client Connected.'
        s.setEncoding 'utf-8'
        if s.authorizationError
                console.log 'Authorization Error: ' + s.authorizationError
                console.log 'Authorized a Secure SSL/TLS Connection.'

s.on 'data', (d) ->
        console.log 'RCV:' + d

s.on 'error', (e) ->
        console.log error

Questions, suggestions, and comments are encouraged.

Django-Paypal standard subscriptions integration

Want to have a site with PayPal integration using Django with no fuss? That is just django-paypal’s game. I’ll show you how to integrate with Website Payments Standard in a jiffy.

pip install django-paypal

You are using pip, right? If not:

apt-get install python-setuptools
easy_install pip

Whew! Thats better. Let’s fix up your settings.py:

PAYPAL_RECEIVER_EMAIL = "yourbusinessaccount@example.com"


Now, you’ll have to add an entry in your urls.py for the Instant Payment Notifications (IPNs) from PayPal that let you know when people have paid:

urlpatterns = patterns('',
  url(r'^/something/hard/to/guess/, include('paypal.standard.ipn.urls')),

We need a view in views.py. That is easy too:

from django.conf import settings
def subscribe(request):
    # What you want the button to do.
    paypal_dict = {
    "cmd": "_xclick-subscriptions",
	"business": settings.PAYPAL_RECEIVER_EMAIL,
	"a1": "0",	                   # trial price
	"p1": 1,	                   # trial duration, duration of unit defaults to month
	"a3": "29.95",                     # yearly price
	"p3": 1,                           # duration of each unit (depends on unit)
	"t3": "Y",                         # duration unit ("M for Month")
    "src": "1",                        # make payments recur
	"sra": "1",                        # reattempt payment on payment error
	"no_note": "1",                    # remove extra notes (optional)
    "item_name": "PayPal Shows This To The User",
    "invoice": "101",
    "notify_url": "http://example.com/something/hard/to/guess/",
    "return_url": "http://example.com/thanks/",
    "cancel_return": "http://example.com/cancel/",
    "custom": request.user.username,   # put whatever data you need to track things here

    # Create the instance.
    form = PayPalPaymentsForm(initial=paypal_dict, button_type="subscribe")

    context = {"form": form, "encoded_email" : urlquote(settings.PAYPAL_RECEIVER_EMAIL), "paid" : request.user.get_profile().paid}

The reason I’ve included the encoded_email in the view is related to the unsubscribe button we’ll setup in a minute. The button in that view will be a subscription. You can easily modify it to be a buy now button. See the README for django-paypal. If you browse the code on github and checkout paypal.standard.forms.py you can see all the possible options for buttons.

Now we can create the template and the (optional) unsubscribe button:

{% extends "base.html" %}

{% block content %}

{% if paid %}
<h2>Thank you! You are currently subscribed.</h2>
<p id="page-intro">You can cancel anytime online using your PayPal account or from this page.
	If you have any questions or problems please <a href="mailto:you@example.com">email us</a>.

	<A HREF="https://www.paypal.com/cgi-bin/webscr?cmd=_subscr-find&alias={{ encoded_email }}" _fcksavedurl="https://www.paypal.com/cgi-bin/webscr?cmd=_subscr-find&alias={{ encoded_email }}"><IMG BORDER="0" SRC="https://www.paypal.com/en_US/i/btn/btn_unsubscribe_LG.gif"></A>
{% else %}
	<!-- Page Head -->
	<h2>Please subscribe to Example using PayPal.</h2>
	<p id="page-intro">You can cancel anytime online using your PayPal account or on this page.
		If you have any questions or problems please <a href="mailto:you@example.com">email us</a>.

	{{ form.render }}
{% endif %}
{% endblock %}

Keying off of if the user has paid or not means we can use this template for subscribing or unsubscribing. Now go get paid!

WordPress, Ubuntu – Now

I recently found cause to setup some mini-sales sites according to advice I’ve seen from Tim Ferriss, Rob Walling, and others. If you need to get something up fast, cheap, and quick this is for you.

Login to the Rackspace Cloud site and create a new server instance with your favorite flavor of Ubuntu. I used Lucid Lynx 10.02.

ssh root@
apt-get update
apt-get install ufw mysql-server wordpress links

I grabbed Uncomplicated Firewall (ufw) to lockdown the box. It’s an simplified wrapper for iptables on Ubuntu. This will install wordpress to /usr/share/wordpress.

For my purposes (mini-sales site) I wanted the wordpress installation at the domain root. You might want it to be at /wordpress or another url you can check here. I’ll show it both ways here:

# Show apache2 where wordpress lives
#for wordpress at http://example.com/wordpress
ln -s /usr/share/wordpress /var/www/wordpress
# (site root and not /wordpress/)
rm -rf /var/www && ln -s /usr/share/wordpress /var/www
mkdir -p /usr/share/wordpress/wp-updates
mkdir -p /usr/share/wordpress/wp-updates/localhost

If you wanted it at http://example.com/wordpress you’d use line 3 only. Otherwise you need lines 5-7. Now we can install the database and wordpress itself:

# Install WordPress to db using the provided script
bash /usr/share/doc/wordpress/examples/setup-mysql -n wordpress localhost
/etc/init.d/apache2 restart

Now we need to install wordpress from localhost so we’re forced to use a text based browser. Load up links and fill in a blog name and email. The site will give you an admin login and password. Login using that username and password and navigate to Settings -> General. Change the WordPress Address and Blog Address domains to your URL: http://example.com. You’ll want to use http://example.com/wordpress/ if you didn’t install at the site root.

links http://localhost

Finally we can set the permissions and prep the site for being public (be sure to change example.com to your domain):

chown -R www-data /usr/share/wordpress
ln -s /etc/wordpress/config-localhost.php /etc/wordpress/config-example.com.php
/etc/init.d/apache2 restart

Voila! Use your local machine to navigate to your domain. Happy blogging/mini-sales sites.

Goals for Whitetail Software

In the last year I’ve created two full software products while I learned an incredible amount about software, persistence, business, marketing, deployment, and more. I’ve shifted my efforts from creating applications I think are cool to exploring markets I like by talking to customers and trying to pivot ideas toward what people really want or need. I read Eric Ries and Steve Blank among many others to develop my thinking along those lines. I plan to continue calling, emailing, and speaking with people in my market to improve my products and/or pivot to better ideas. The biggest way I’m going to push in this direction in 2011 is to attend conferences both as an attendee and exhibitor to try and connect with customers in multiple ways. I hope to leverage those trips into relationships and customers that give me real traction and word of mouth for the future. This leads in to the specific things I’d like to accomplish this year with Whitetail Software.

2011 Goals

  1. 10 Whitetail Scout (Harvest & Observation Records) Customers
  2. 100 Whitetail Census Surveys
  3. 2-3 posts per month on this blog and on Managing Whitetail
  4. Develop a product that helps people find hunting leases
  5. Integrate all products with Amazon Payments and PayPal
  6. Develop How-To and help videos for the products as a FAQ
  7. Begin a newsletter across Whitetail Software offerings
  8. Experiment with Census pricing and bundling
  9. Relaunch the improved version of Whitetail Scout
  10. Attend 2 or more industry conferences to talk to customers and prospects
  11. Experiment with Organic SEO Content at scale

Conditional on Feedback

  1. OSS project extracting my Mechanical Turk and trust system code into a Django app
  2. AJAX and new features for Whitetail Scout
  3. Develop a site that serves as a directory for the industry similar to Cattle Pages

I’m just getting started on my sojourn to build my own software enterprise from scratch but I have already learned quite a bit in a plethora of categories.  I think one important lesson that you can continually relearn is persistence. Things that have helped me stay the course include support from my wife, a long term perspective on the effort I put into Whitetail Software, and staying focused on the immediate and long term goals as motivation. I think knowing where you want to be in five years and what you think needs to happen this week to get closer to that are critical to accomplishing anything of scale. If you aim at nothing, you’ll hit it every time.