I’m finally done with a week of long hours and hard work in, of all places, Bowling Green, Kentucky. I was regularly working past 3am but I think it definitely paid off.

DJNF Multimedia Project

DJNF Multimedia Project

This past week was the 2009 Dow Jones Multimedia Workshop at Western Kentucky University, with a group of seven other awesome journalists preparing for our internships all around the country. Having well qualified instructors makes such a difference when learning new things. (Turns out a bunch of things I had learned by trial and error were just plain wrong) At the same time I was with other journalists with quite different backgrounds and learned a ton from the people I was working with.

The core of the program was reporting and producing a full multimedia package. We divided into two teams of four and went out into the city to find and create a compelling story. This kind of project is a first for me as all the multimedia I had done before was spot news done with super quick turn around for the next day. Having the time to go in depth and produce a full story is much more satisfying.

The project my team made was about female tattoo artists breaking into the industry. The other team produced a piece on refugees and immigrants settling in Bowling Green. (Here’s where I wish I had had more time. Our site leans heavily on javascript and jQuery for navigation and I didn’t finish making the site cross browser compatible. It degrades very badly in IE. It only works perfectly in Firefox. And I couldn’t figure out blocking for XHR requests. If I find more time this summer, I might try and figure out those issues and turn the layout into a general purpose template for multimedia stories)

Besides the new skills I learned and the new people I met, I had a revelation about how people learn journalism. I’ve always thought that the best way to learn journalism was through hands on experience, but….

Through the whole project there was a strong tension for all of us between doing what we were already good at and doing what we wanted to learn. I spent most of my time on web design even though I wanted to learn photo. Our best photographer spent most of her time on photo despite wanting to learn video. And of course this is kind of natural because people gravitate towards what they’re good at. And there’s almost a duty to your interview subjects to do a good job.

But it also means that once you start going down a particular skill path you are committed and it becomes hard to branch out into learning new things.

Now that I’ve been to one workshop, I’d like to go to one where we have explicit permission to do a bad job so that we’re not afraid to experiment and take on roles that are new to us.


There’s been quite a debate between free and paid content but it’s in quite a sorry state. On one side (mostly old school reporters and newspaper execs) people think that publishers need to charge people for content, block everyone else out, and sue the pants of Google for profiting off indexing stories. On the other side (mostly techies and copyleftists) are free content idealists harping on the line that “information wants to be free.”

But both sides are equally wrong, or at least misguided. Pretty much every company in the world has different products at different prices, why do journalists think they should have just one?

What you really need to do to monetize content is to take a page from the airlines and freemium web services and every other company with a product ever and learn how to price discriminate. Not only will you make much more money doing it, you will produce much better quality journalism as well.

Offer your basic and commodity content for free. Then create high value premium content and charge readers a monthly fee for it. [1]

Alan Mutter has some good ideas for types of premium content you can create. Here’s the economics that underlies it.

The Demand Curve

All content for free.

We have a standard downward sloping demand curve [2] with each point on the curve indicates how much value a consumer is getting from the product. Now if a site gives away all their content, the only revenue they get is from advertising, and the consumers who get the most value from the content pick up a nice chunk of consumer surplus.

Point D represents the smallest amount of value a reader gets from your site. This is likely in the micropayment range, likely just a few cents, but the quantity consumed is also huge. It doesn’t make sense to mess around with micropayments, because the site can monetize their traffic with advertising revenue. For simplicity’s sake we’ll say marginal advertising revenue is constant for any quantity. [3] While you could try charging with micropayments, it likely wouldn’t work. The mental cost of deciding whether or not to pay and then paying is a hefty tax on the process. (I’d argue that trying to charge anything less than $10 at a time or so becomes counterproductive, but the smoother the payment process is the lower this amount can go)

How can you increase revenue? By capturing consumer surplus.

Price Discrimination with Advertising

How to capture more revenue.

We would like to set several different price points at A, B, and C to charge people different amounts based on where they are on the curve. Businessmen and politicians and news junkies get much more value from a news site than casual readers do, but how can we charge them a higher amount than everyone else? Airlines are the classic example. They do it with such a pricing schemes that make sure that you almost certainly did not pay the same amount for your ticket as your seatmate. [4] To do it for a news site, you’ll want to create varied products such that the product offered at price point A appeals to all the readers left of point A. Each of the points A, B, and C need to be different slices of unique premium content that readers will pay different amounts for.

A few more points to consider
  • Judging Value — You need to be able to accurately judge the value of all your content and spend a good amount of time researching and calculating what the proper price points are. I suspect for high quality business news, sites could get away with subscriptions costing upwards of a hundred dollars per year. Things like high end wine or restaurant reviews also don’t make much sense as free content. If someone is spending a hundred dollars a bottle, they’ll pay for a review backed by a renowned brand name.
  • Subscriber value versus site traffic — For any given piece of content, you have a dilemma. You can put it in the premium content pile and restrict access to it, or you can put it up for free. Each piece of content that goes into the free pile increases your reach and traffic, but slightly erodes the value your premium subscribers get and makes them more likely to switch. This is a delicate balance. One way around it might be to delay the speed at which non-subscribers can access content. So that masterful investigative piece might be subscriber only for the first week, after which its open for anyone to read. The kind of high quality, high traffic pieces you want to grow traffic will be the exact same pieces of content you want as premium content to get people to pay.
  • Archives are terrible premium content — A lot of newspapers have their full archives online behind a paywall. Sometimes a very expensive paywall where per article access can cost close to $10. What audience is this supposed to attract? People who place enough value on old news articles (lawyers, academics, other reporters, students writing papers etc.) to pay for them, likely all have access to LexisNexis subscriptions already and won’t pay. And the average reader won’t care enough to pay for an article they stumble across. It seems like they’ve made a terrible subscriber value/traffic trade-off here.
  • What am I buying? — Transparency and convenience are important. With your premium content make it explicitly clear what types of content and privileges a subscriber will get. Any uncertainty here means fewer paying customers.
  • Piracy will be an issue — Remember that when digital content has a price, piracy is going to be a problem. Look at the troubles the movie and music industries are having. You’ll have to be willing to vigorously defend your copyright against sites which spring up and paraphrase all your premium content.
Notes

[1] DO NOT just repackage your current content as free content. It’s almost certainly not good enough. Thinking hard about what sorts of content readers will pay for, you’ll produce better content too.
[2] Different pieces of content have different value to different consumers. Together they form a downward sloping demand curve. A few consumers are willing to pay a lot for content, but this amount drops off quickly. On the right side of the graph, by decreasing the price towards zero, the quantity consumed can be expanded almost to infinity.
[3] In truth, marginal revenue from advertising is probably downward sloping as well, but the market for that is so much more inelastic than that for traffic that it doesn’t matter. That line should also extend all the way to the left.
[4] Nearly every economics textbook has an example about the price of airline seats to explain price discrimination. For them point A are the business travelers that need comfy seats and need to buy them at the last minute. Because the value they get from travel is much higher than average they are willing to pay much more. Point B might be the families on vacation, they’re willing to book well in advance but they might want their tickets refundable in case things change. But they’re also price conscious. If the ticket costs as much as at point A, they’ll just stay home instead. Point C would be the budget travelers and backpackers, who are willing to fly standby on whatever plane has a few empty seats. In the end they all get the same service, transportation from one point to another, but by varying the conditions and terms of each ticket, the airline is able to make much more money.

Looks like this post has gotten a bit of attention. If you found it interesting, you might also enjoy my earlier post 9 ways that newspapers can make money that aren’t advertising.

I’ve also given a brief talk on this topic at the Information Valet conference hosted by the University of Missouri’s Reynolds Journalism Institute. Martin Langeveld did a great write up of it for the Nieman Lab, making some of my points better than I did myself. You can see my slides and get a link to the video recording of the presentation there.


Watch us live at 2pm as Greg Linch, Joey Baker and I discuss innovation in online student news.

Okay, replaced the live stream with a saved version of the session. Hope I didn’t embarrass myself too badly.


My entry in the Tomorrow’s News, Tomorrow’s Journalists blog ring for January. The topic asks:
Do you think it will be the “old” news organizations that achieve the radical transformation they need, or is it more wise (as a journalist) to invest your time in a “new” news startup?

I want to think about this question from the perspective of an investor considering buying a newspaper and implementing a drastic turn-around plan. Or perhaps, with the same money that investor could go off and finance some people to start a competitor. What should they do?

What value do you get out of buying an existing operation?
  • A trusted brand name
  • Established base of readers and visitors
  • A newsroom of talented journalists
  • Equipment, computers, office space, etc.
  • Content archive
What downside is there to buying an existing operation?
  • Piles of debt
  • Institutional inertia
  • High operating costs
What value do you get from starting fresh?
  • Innovative attitudes not burdened by “the way things have always been done”
  • Online only focus from the beginning
  • Low operating costs
And what downside is there?
  • Need to invest in new equipment and software
  • Need to build traffic and viewers
  • Brand name non-existent

Keep reading…


Big news! At long last, the DP has launched it’s first public web site on Drupal at http://34st.com for our weekly arts and entertainment magazine, 34th Street. We’ve been working on developing an alternative to College Publisher since I started my term as Web Editor-in-Chief at The Daily Pennsylvanian in January. After months of waffling and pressure we decided to move ahead with development and committed to launching a new website. And finally, we’re here.

Theming with Zen

Last time, I wrote about the data structure underlying our website running on Drupal and promised that I would write again about theming.

The Drupal theming layer is quite powerful, but can also quickly become incredibly complex. It also depends on module developers to play nicely and make all their code easily themable. It also requires a designer to learn how to work with Drupal and all it’s eccentricities.

Drupal themes depend on layers of overrides and hooks. Drupal core provides a default layout, which can then be modified by modules, then the template engine, then the theme and finally an optional subtheme. At each layer the previous output can be modified or overridden. That way, if someone were designing a set of themes or wanted to present options for a user to customize the site’s look and feel it could degrade gracefully.

Since we weren’t worrying about any of those things, we did nearly everything in the top-most sub-theme layer.


Luckily for us the Zen starter theme makes much of this easier.

To develop our theme, we were lucky enough to have a great starting point in the amazing Zen starter template and it’s great documentation. We made a Zen subtheme as a folder within Zen with their Starter Kit.

Note: One big mistake I made when we started working on our subtheme was naming it “34st”. As it turns out, many of the theme override functions require you to name them THEMENAME_functionname. Unfortunately, PHP variables can’t start with numbers so after some frustration and griping I had to rename the subtheme.

node-type.tpl.php

Content Templates provides a view of all available variables and example values.

Many places advise themers to use the Content Templates module to theme different content types. With Zen however, I found it much easier to just create files in the sub-template directory with certain naming conventions. For our article content type, a file named node-article.tpl.php themes it. For an issue, node-issue.tpl.php contains the theme. Since these files are theming a node, it’s possible to see all the variables in the array by simply doing a <?php print_r($node); ?> in a human-readable format. Content Templates, however can do the same thing, and with a much nicer interface.

For the most part, after finding all the appropriate variables, we simply plopped them into the appropriate places in the template. But, within these template files, we still have complete access to PHP and the entire Drupal API. Which of course means that I get lazy.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php 
//Covering all the different numbers of bylines
if (($node->field_byline[0]['view'] != '') && ($node->field_byline[1]['view'] == '')): ?>
<div class="article-byline">
	<div class="author-teaser-name-nodelink">By <?php print $node->field_byline[0]['view'] ?></div>
</div>
<?php elseif (($node->field_byline[0]['view'] != '') && ($node->field_byline[1]['view'] != '') && ($node->field_byline[2]['view'] == '')): ?>
<div class="article-byline">
	<div class="author-teaser-name-nodelink">By <?php print $node->field_byline[0]['view'] . ' and ' . $node->field_byline[1]['view']; ?></div>
</div>
<?php elseif (($node->field_byline[0]['view'] != '') && ($node->field_byline[1]['view'] != '') && ($node->field_byline[2]['view'] != '')): ?>
<div class="article-byline">
	<div class="author-teaser-name-nodelink">By <?php 
	$numauthors = count($node->field_byline);
	print $node->field_byline[0]['view'];
	for ($i=0;$i<$numauthors-1;$i++) {
		print ', ' . $node->field_byline[$i]['view']; 
	}
	print ' and ' . $node->field_byline[$numauthors-1]['view'];
	?>
	</div>
</div>
<?php endif; ?>

That’s my code for handling all the different possibilities for multiple authors on a single article. For more elegant code, this should be higher up in the templating than the .tpl.php file, but it’s much easier this way.

Teaser versus Full views
For each field, one chooses how it will be displayed in the teaser, and in the full node.

For each field, one chooses how it will be displayed in the teaser, and in the full node.

For each field in a content type, you can choose two ways of displaying it. The Teaser is used when the node is being viewed on the front page, or in a section listing, and Full is the whole article is being read. Pretty self-explanatory. But it does mean that in each .tpl.php file you have to theme both. Here’s a sample.

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php 
if (($teaser) && (!$page)): 
	/*
	 * This case governs how articles show up in section page views, in the nodereferrer on authors,
	 * and everywhere else an article teaser (not on the front) is shown.
	 *
	 */
elseif (($page) && (!$teaser)):
	/*
	 * This case is for displaying the whole article on its own page.
	 *
	 */
endif; ?>

We also get other fun template variables like $is_front so we can do things like so.

1
2
3
4
5
6
7
elseif ((($teaser) && (!$page) && ($is_front)) || (($page) && ($teaser))):
	/*
	 * This first case is for articles that are on the front page or in the sidebar.
	 * articles in the current issue. The second half of the OR only happens when node_view is
	 * manually called like node_view($node_object,$page=TRUE,$teaser=TRUE);
	 *
	 */

For reference, here’s the three different views of a single article.

if ((($teaser) && (!$page) && ($is_front)) || (($page) && ($teaser))):

if ((($teaser) && (!$page) && ($is_front)) || (($page) && ($teaser))):

if (($teaser) && (!$page)):

if (($teaser) && (!$page)):

if (($page) && (!$teaser)):

if (($page) && (!$teaser)):

Importing Data

We received our archives from College Publisher as a set of CSV files. My next post will address how we imported those archives.

What did you think of this post? Got more questions about our Drupal install? Leave a comment. The new website is 34th Street Magazine, poke around and leave us some feedback!

How we did it in Drupal, Part 2 of X
  1. How we did it in Drupal, Pt. 1 of X – The Data Structure
  2. How we did it in Drupal, Pt. 2 of X – Theming with Zen

Joshua Benton of the Nieman Journalism Lab at Harvard just coined a new term, ““Holovaty’s Law”, that I really like. Well, I believe he coined it because Google turns up no results for “Holovaty’s Law”.

The post linked as Holovaty’s Law, by the way, is a classic. If you haven’t read it and you’re interested in news and journalism at all, you need to.

Let me take the concept and run a little further with it. And thanks to Benton, the law already has it’s first corollary!

Theorem: Holovaty’s (First) Law of Online News
Adding structure to information makes it more valuable
1st Corollary
Adding structure to comments generates interesting data

Thoughts? Refinements? Other corollaries?

It seems like there’s a dearth of math geeks interested in journalism. Searches for “law of online news”, “fundamental theorem of online news”, “fundamental theorem of online journalism”, and “law of online journalism” all turn up nothing.


I wrote before about the new 34th Street Magazine website being in Alpha.

This is the first post of a series on what we did to Drupal to make it behave the way we want it to, how we implemented different features and to ask for feedback and advice on how to do future features.

To start out understanding Drupal, it’s important to understand that Drupal was designed and the developer’s focus is largely on creating flexible websites for communities, NOT for publishing or blogging. For instance, there isn’t a natural distinction between readers and administrators among the user roles. (Adding content is at node/add/* not admin/*) A lot of the work involved in setting up a site on Drupal is to work around the default values and settings and make it behave the way you want to.

Part of the joy of using Wordpress is that it’s defined for a very specific purpose and all the development work that goes into it is designed to make it easier to blog. With Wordpress, it takes very little work to go from a default install to writing your first post.

That’s not true for Drupal. No one would use Drupal with only its core functionality and the default settings. But with a little work, it becomes much, much more powerful and better suited for publishing a news website than Wordpress.

The problem I’m still struggling with now is how to import data into Drupal’s database. The database structure is quite complex compared to our current site, or a Wordpress site, but luckily the Content Construction Kit abstracts all of that when the site is being built. And that’s the topic of today’s post.

Nodes, Users and Custom Content Types!

Everything in our system is a node. Stories. Slideshows. Sections. Authors. Issues.

Content types

Content types

The CCK module lets us define all the different information each node needs and tie authors to articles and articles to sections and issues with node reference fields. Each content type is themed separately with a different template and the different ways that piece of content can be viewed are defined by a set of boolean PHP variables.

Our site uses the following CCK content types.

Article submission

Article submission

  • Article – One article of the magazine. Articles have headlines, sub-headlines, date, image, related file and other fields defined in CCK. Articles also have node reference fields to identify who the authors of the article and what section the article is in.
  • Issue – One issue of the magazine, corresponds to the print issue. An issue is a collection of node reference fields that point to different articles. Certain fields of the issue are mapped to different slots on the front page of the site.
  • Photo Gallery – For photo essays or instances in which the image is the primary focus of the story. Behaves like an article in every other way.
  • Author – Everybody who writes a story is an author node. These are not related to users in the system at all, as not every writer will have an account on the website and not every one with an account on the website will be a writer. It also means that we don’t have to worry about deleting user accounts after writers graduate or leave. And while we haven’t done it yet, it would let us create author profiles so our writers can each have a portfolio page that’s more than just a listing of articles.
  • Section – A section of the website, these are done as nodes instead of as a taxonomy term for largely the same reasons as authors are.
  • Overheard at Penn – Overheard at Penn is a series of short snippets of overheard conversation. This is a very basic content type with just a single text field.
  • PDF Version – A PDF of the print edition of the website. Created using the File Field module.
  • Page – A simple static page.
  • Newsletter Issue – The Simplenews module allows for the creation of newsletters. This content type creates a newsletter with a node reference to the issue to be sent, and generates e-mails. It’s also integrated into the user accounts system, so everyone who is registered to receive the newsletter also has an account on the website to comment or for any user generated content areas we might decide to create in the future. Theming newsletters and HTML emails was an incredible pain in the butt, but that’s the subject of another post.
  • At the database level
    Creating a new field

    Creating a new field

    When creating fields and content types, this is all you see. Pick data types and title them. For the most part, the rest of the process is completely opaque. To learn more about the database structure of CCK, there’s documentation in greater detail here.

    There are several tables that store data for CCK fields.

    • node – This table stores the unique nid of the node, and what type it is.
    • node_revisions – This table stores the body content of the node, as well as data about which user created it, when it was revised and what’s in the teaser.
    • content_type_[type] – If a content type has fields that are only used by that content type, this table contains the values of that field.
    • content_field_[field] – Contains the values of that field.
    Theming

    A lot of the heavy lifting in Drupal is done at the theming layer. Luckily Zen makes it all much easier. That’s what I’ll be writing about next time. Some of the other upcoming posts will address how we handle images (Imagecache and CCK), how we theme our newsletters and how we handle multimedia.

    What did you think of this post? Got more questions about our Drupal install? Leave a comment. The new website is at http://beta.34st.com, poke around and leave us some feedback!

    How we did it in Drupal, Part 1 of X
    1. How we did it in Drupal, Pt. 1 of X – The Data Structure
    2. How we did it in Drupal, Pt. 2 of X – Theming with Zen

    In the course of developing Drupal for the DP, we’ve been fortunate that we’ve had to write very little (themeing layer excepted) from scratch. Chalk it up to to the strength and robustness of the Drupal community that nearly every function we wanted, there was a module for.

    One module that I did have to write from scratch was to replicate a function from College Publisher. After copy and pasting a story into CP’s interface, there was a button run all that doubled the line breaks, among other things.

    Drupal wraps text separated by two line breaks with <p> tags and uses the <br /> tag to in-between text separated by one line break. By default, text copied out of InCopy only has one line break between paragraphs.

    When Sean Blanda posted about the Temple News moving to Wordpress, this was one of the 6 problems he laid out as having.

    Keep reading…


    Exciting news on the CMS front.

    34th Street Alpha

    34th Street Alpha

    As some may know, The Daily Pennsylvanian web staff and I have been working on using Drupal to run our website and as a replacement for College Publisher on and off since the spring. The first part of that process is now nearly done and we have a nearly complete website for our magazine 34th Street!

    We made the decision to go ahead and develop and launch a site in Drupal a few weeks ago and since then have been in a somewhat hectic mode scrambling to get all the launch features ready. A great deal of thanks goes to the folks who made the New York Observer site happen and wrote up how they did it.

    Now it’s on to testing and training the other editors on how to use the system and looking for places to make the site work better, and make publishing easier. We also have to write a complete set of documentation for future and current editors on how to use the system, how to modify it, how to deal with Drupal upgrades and what to do in case things go wrong.

    Keep reading…


    Every post you see before this one (one exception) is imported from my old blog at http://albertgate.blogspot.com. This shiny new site is hosted by WebFaction and I’ve been very happy with them so far even if at $9.50 a month it’s a tad expensive for hosting a personal site. Their servers will let me play around with things like SVN and Django.

    Keep reading…