TwentyTen CRM

This theme is here for archival purposes only. My CRM that’s actively developed is Genesis CRM.

Download the theme on GitHub

by Bill Erickson, Andrew Norcross, Jared Atchison


TwentyTen CRM is a child theme for TwentyTen specifically designed as a Customer Relationship Management tool. It creates a series of taxonomies and custom meta boxes to collect relevant data, displays the data in a useful Dashboard page template, features a Download page template that can be used to copy/paste all the data to Excel for more advanced analysis, and is easily customized to your specific needs. Oh, and it’s free.


About six months ago I started to become overwhelmed by the number of prospective client inquiries I received. It’s a great problem to have, but a lot of prospects were falling through the cracks. I tried Salesforce for about a week, and SugarCRM for about 3 weeks (I must thank Schipul for spending an afternoon walking me through how their company manages their contacts with Sugar).

The two problems I had with all of these CRMs were that it was difficult to put the information I wanted in the system (and leave out the information I didn’t care about), and it was difficult to analyze that data. I wanted a tool that I could customize to my own needs and modify as time went on. As a WordPress developer, I chose the tool I’m most comfortable with.

This theme isn’t perfect for everyone, but it can easily be customized to your specific needs using standard WordPress code, which is exactly what I wanted. I recommend you see this as a starting point, not an end point.


First, due to the type of content we’re putting in this site, I highly recommend you either run it locally, or use a plugin like Registered Users Only to ensure it isn’t public.

  1. Download the theme
  2. Add it to your themes directory and activate. Since it is a child theme of TwentyTen, you must have TwentyTen in your themes directory as well.
  3. I recommend you fill in the Categories, Points of Contact, and Sources taxonomies first.
    1. Categories must contain Prospect (slug “prospect”), Active Project (slug “active-project”) and Closed (slug “closed”) to function correctly. Alternatively¬† you could modify the theme files to use different categories for the sections of the Dashboard.
    2. I use Point of Contact as the method the client initially contacted me (Email form, Email, Phone…). I’d recommend you only use one POC per project as it will mess up the stats in the dashboard if you use multiple.
    3. I use Sources as the person or website that sent the prospect to me. Mine include CodePoet, StudioPress, DIYThemes, Google, Other Referral (you can specify the Other Referral in the custom meta boxes), Unknown…
  4. Go to Appearances > Widgets and populate the three homepage widget areas with widgets. I recommend “Old Prospects” in Column 1, “Active Projects” in Column 2, and everything else in Column 3.
  5. Start collecting data! Just go to Posts > Add New to add a new prospect.


While my default setup might work fine for you, one of the best features of this theme (and WordPress in general) is how easy you can customize it.

There’s two features you should attempt customizing: Taxonomies and Custom Meta Boxes. Note: I’m assuming you are a web developer and are already comfortable coding these types of things. If not, you might want to hire someone to do it.

Taxonomies – Go to twentyten-crm/functions.php. On line 93 you see // Register Taxonomies. This is the code I’m using to create the taxonomies. You can modify the two default taxonomies here, or create additional ones. See the Codex for more information. And of course you can add additional taxonomy terms using the appropriate section of the backend (ex: Posts > Sources).

Custom Meta Boxes – I’m using a wonderful piece of code that Andrew Norcross recently contributed to generate the meta boxes. To see all the meta box options you have, go to /twentyten-crm/lib/metabox/example-functions.php. To modify the existing metaboxes or add more, go to /twentyten-crm/functions.php on line 165.

Once you’ve modified the data you collect on the backend, you’ll want to modify the frontend display of that data. Here’s the three files you should edit:

  • home.php – This is the Dashboard page template.
  • download.php – This is the Download page template.
  • single.php – This is the Single page template

Looking through the code on those pages, you should be able to figure out how to add what you want.

More Customization Tips

  • We’ve added a “Top Panel” to the top that gives you two menus, both editable from Appearance > Menus. If you’d like to replace this with the admin bar (assuming you’re running WP 3.1), uncomment lines 523-525 (look for “Top Panel instead of Admin Bar”).
  • The post editor has been moved into a meta box so you can drag it around and put it wherever you like. If you don’t want to use it, click Screen Options and uncheck “Notes”.
  • I’ve created a bunch of useful widgets for the homepage. If you’d like to create your own, just put them in the /lib/widgets folder. I also added two hooks that some of the widgets use: crm_pre_stat_loop and crm_stat_loop. This loop goes through all the posts in the site and is used to calculate statistics. If your widget needs to loop through them as well, I’d recommend using this instead of doing your own loop in your widget. This way there’s only one loop rather than one for each widget. Look into a widget like widget-other-stats.php for an example on how to use this.


  • 1.3 (2/21/11) A large release with many changes. Here’s a few notable ones:
    • Made the dashboard the homepage (so you don’t need to create a page, set page template, then set as homepage). Widgetized the homepage so you can control what boxes show up where.
    • Lots of tweaks to the backend. Moved post editor into meta box, renamed “Post” to “Contact”, reordered/removed admin menu items, removed dashboard widgets (will create some in a future release), and customized the Contacts column view to include Status, Point of Contact, and Source.
    • Cleaned up the code so it runs better. It should work with debug mode on now! (Thanks Mark Jaquith for the tips)
  • 1.2 (2/5/11)
    • Added isset() to variables in /metabox/init.php and improved method of hiding post editor, based on recommendations by Mark Jaquith
    • Used global variable $prefix to be used in generating custom fields in meta box as well as in the page templates. If you want to use a different prefix, change it once without editing a bunch of files.
  • 1.1 (2/3/11) – Updated the metabox code based on improvements by Jared Atchinson
  • 1.0 (1/31/11) – Initial release

Bill Erickson

Bill Erickson is a freelance WordPress developer and a contributing developer to the Genesis framework. For the past 14 years he has worked with attorneys, publishers, corporations, and non-profits, building custom websites tailored to their needs and goals.

Ready to upgrade your website?

I build custom WordPress websites that look great and are easy to manage.

Let's Talk

Reader Interactions


  1. Todd J. List says

    One of the things I love about the WordPress community is their willingness to share something awesome.

    This looks like a great resource, not only as a tool, but also as a great way for a new developer (like me) to get more comfortable with some of the more powerful pieces of WordPress.

    Thank you.

  2. Marty Thornley says

    Hey Bill,
    Great work! Love the dashboard page but the download page is my favorite aspect so far… I just copy and pasted perfectly right into a Google Doc spreadsheet! Very cool!
    Can’t wait to play with it some more.

    • Bill Erickson says

      Glad you like it! Wait until you see v1.3 coming out this weekend (hopefully). The dashboard is fully widgetized, so you can arrange it however you like and add/remove all the components.

  3. Miijiik says

    thanks for gorgeous and useful theme.

    I just found a little display bug; Client information and Project info wasn’t displayed on single page (on my xampp installation), so I was fiddling around and found out that in single.php, you are calling custom fields this way (which didn’t display anything for me):

    $email = get_custom_field('crm_client_email');

    When I fixed this to be called same way as in download.php template, all is working ok:

    $email = get_custom_field($prefix.'client_email');

    Keep up cool work, and thanks again for this splendid example of using WP.

    • Bill Erickson says

      Not yet. I need to create a bunch of dummy content for a demo to be useful. Right now I’m using actual client data and don’t want it to be public.

Leave A Reply