Tutorial: Building an Ad Platform with DFP
IntroductionTraditionally, a “church-state wall” has existed between journalists and advertising departments. But in a world of hyperlocal sites run by small teams of independent journalists who need some way to monetize their work, there is no room for that wall. Journalists will need to spend at least some of their time thinking about advertising, which includes mastering an ad serving platform. There are many ways to integrate ads with your web site, depending on factors such as:
- How much manual work do you want to do?
- How willing are you to give a cut to ad networks?
- Are you technically prepared to maintain an ad platform?
- Free! (if fewer than 90 million impressions/month)
- High performance/no maintenance
- Nice back-end management system
- Inventory forecasting
- Sophisticated audience targeting
- Lets multiple networks compete, plus AdSense
- Good reporting tools
DFP Consultant Rainey Smith was a guest speaker at Berkeley Advanced Media Institute’s March 2011 Independent Journalists workshop, and delivered an excellent 1-hour presentation on maximizing ad revenue with DFP. While not strictly part of this DFP tutorial, Smith’s talk is highly recommended, so we’ve embedded it here:
Getting StartedDFP is a “layer” on top of AdSense, so before you can get started with DFP, you’ll need a traditional AdSense account, which is either connected to your bank account or configured to send you checks. It could take a day or two for a new AdSense account to be approved, so get started now. In case you’re not familiar, Google AdWords is a program through which advertisers can purchase ad placements across the entire internet. Because Google’s search engines index your site’s content, they’re able to place ads that match the topic of any given page. AdSense is the system through which site publishers can register to have these ads displayed on their own sites. DFP requires you to have an AdSense account for two main reasons:
- When you’re not able to come up with enough custom ads to fill your inventory (your collection of available ad space), AdSense ads will be served in those spots by default.
- For those ads that do fall through to AdSense, Google handles deposits to your bank account.
VocabularyBefore you can be productive in any ad system, you’ll need to be comfortable with the jargon of the ad industry. Here’s a crash course in the terms you’ll see in the DFP interface. Inventory: The collection of all ad space you have available to sell. You can generally think of your inventory as “The number of ad units on a page times the number of pages you serve.” Ad Unit: An individual slot where ads can go. Generally defined in terms of placement on the page, e.g. “Main leaderboard” or “Below article,” but can be more granular if you start serving certain ads only on certain pages, e.g. “Top sidebar square on sports pages.” Ad units should be named descriptively, with names that specify the site, the section of the page, and the ad size, e.g. “
ABCProductsUnlimited_HelpCenter_FAQs_ATF_Left_90x90.” IAB Ad Sizes: The Interactive Advertising Bureau is a working group that, among other things, defines ad sizes to be considered as a general convention across the web. This is important because advertisers don’t want to create differently sized ads for every site they advertise on. A list of common IAB ad sizes is here. Order: AKA “campaign” – a request for a run of ads from a given advertiser, generally focused on pitching a particular product. An order can span across multiple ad units on a site. For example “Joe’s Pizza March Madness Promo” might include four different ad styles, meant to run through the month of March. Line Item: As described in “Order” above, a campaign consists of one more requests for ads to run. Every order must have at least one line item, which defines the ad to run, the ad unit it will run in, the type of creative to run with it, and optionally any custom targeting. Creative: The actual ad that will run in a line item. This can be an uploaded image or Flash file, or a pointer to ad code from another ad network. Targeting: Limiting the scope of the audience to which an ad is displayed. For example, you might want to show an ad only to Spanish-speaking readers, or only to visitors from the local college campus, or only to users with broadband connections. Each line item can be targeted with these options and more. Placement: Think of a placement as a “category bucket,” using criteria such as “Ads on pages that include user-generated content” or “All skyscraper ads on the site.” Placements are optional, but helpful if you hope to gain ads through Google’s AdWords network, since advertisers will be able to sell their ads into your placements. If you intend to sell all of your ads directly, placements aren’t particularly helpful. Forecast: Google monitors your site traffic and, over time, builds up a prediction of how many pages you’ll serve in a given time period. Forecasts are also aware of the sections of your site on which particular ads run. Forecasts are used for predicting the availability of inventory, which is in turn important when calculating ad rotations. Releasing inventory: Frees up inventory that has been reserved by a line item. This lets the forecasting system know it can use these impressions for other reserved line items. In other words, if a line item has been guaranteed to serve, say, 10,000 impressions but you’ve only served 5,000 and now need to end the first campaign, inventory can be released back into the system to make it available to other orders. Order types: When placing an order’s line items, you’ll be able to give each line item a sale type, which assists in the prioritization process as ads compete for attention.
- Sponsorship: Sell a percentage of all impressions.
- Standard: Sell a fixed quantity of impressions or clicks.
- Network: Allocate a percentage of remaining impressions.
- Bulk: Allocate a fixed quantity of remaining impressions.
- Price priority: Remaining impressions go to highest-paying ads.
- House: Serves when no other ads are booked.
- CPD = Cost Per Day
- CPM = Cost Per Thousand
- CPC = Cost Per Click
Define Your InventoryIt’s time to start putting ads on pages of your staging site. Sign into DFP and click on the Admin tab. You’ll see a panel on the left from which you can set up Contacts (people who will be allowed to log in and view reports and campaign progress), Companies (each ad must be attached to a company in the system for tracking purposes), and Network Settings, which you can use to set a name for your entire network of ads. Once that’s done, click the Inventory tab at the top, then Ad Units on the left. You can now tell DFP what Ad Unit spaces are available on your site. Let’s start by defining a slot for your main ad – your “Leaderboard.” Click New Ad Unit. Start by giving the Ad Unit a name. It’s important to use names that include all the information you’ll need to identify it at a glance later on, including:
- The name of the site
- The section or page of your site
- The ad unit’s place on a page
- The ad unit size
MySite_AllPages_ATF_Top_Leaderboard_728x90Feel free to add an optional description if you want your advertisers to have more information about the unit. Select the actual ad dimensions from the Size drop-down. Use the Target Window selector to control whether a clicked ad will be a normal link (_top) or will open in a new browser window or tab (_blank). When linking to other sites on the web, we strongly recommend not using “_blank”. However, links to ads are a bit different from links to content, and setting “_blank” (new window or tab) is the norm for ad links on the web. Ignore the Placements section for now. Take a look at the bottom of the page, where it says “AdSense Inventory.” By default, this is enabled, which means that AdSense ads will be served any time you don’t have enough ad orders to match the actual traffic you’re serving. Click the “Show” link to reveal Ad Type and color settings for any AdSense ads that end up being displayed. Note: If you use AdSense as a fallback, it will only compete with non-guaranteed inventory and other ad networks. It won’t compete with directly placed ads. Important: Google only allows you to serve up to three AdSense ads on any given page. If you define more than three ad slots per page, you must turn AdSense off for some of them. Do this by clicking the Override link in this section. Click Save at the bottom of the page. DFP may tell you that it’s now time to create a Placement to run an ad. However, Placements are optional, and we’re going to ignore them for now. Repeat this process to define two more ad units. In this tutorial we’ll assume you’re working with one leaderboard, one rectangle at 180×150 at the top of your sidebar, and one larger (300×250) rectangle at the bottom of every article, but feel free to modify these sizes to match the needs of your own site.
Generate TagsWith your inventory defined, you can now generate the tags that will communicate with DFP and allow ads to appear on your site. In the Inventory section of DFP, click the Generate Tags link at the left. DFP will display a list of all defined Ad Units. Click the “add” link next to each ad unit you want to generate code for. Click the Generate Tags button at the bottom of the page and you’ll end up with something like this: Don’t worry – you don’t have to understand this code – but you do have to place sections of it in appropriate sections of the templates that drive your content management system. If you don’t already speak HTML, this may be the trickiest part of this tutorial. Because every site is constructed differently, we can’t tell you exactly how to go about this, but here are some guidelines. For our purposes, we’ll assume you’re using WordPress – season to taste if you’re running a different CMS. The top field of DFP’s generated tags is “master code” which enables DFP on your site in general, and defines the names of the ad units you want to display. The bottom field shows as many code blocks as you selected in the previous step. Start by selecting the code in the top field and copying it to your clipboard. Edit the
header.phpfile for your site and find the closing
</head>tag. Paste the DFP master code just above that tag. Now look in the second field of DFP’s tag generator and find the code block named for your leaderboard (pictured below). Copy that block (and just that block) to your clipboard. Since the leaderboard ad will appear at the top of all pages, the code that triggers that block to appear will also go in
header.php, which is already open. You’ll need to determine its exact placement by brushing up on your HTML, but if you’re using WordPress’ default “2010” theme, we can tell you that it should be pasted just after:
<div id="header">which should be at around line 60: Save the template file and upload it to the correct theme folder on your web server. Now we need to go through a similar process for the ad that will be displayed underneath every article. Back in DFP’s Tag Generator, copy the appropriate code block from the second field to your clipboard, and paste it to the appropriate place in your templates. In the case of WordPress’ default 2010 theme, the correct place would be in the template
loop-single.php, just after the line:
<?php the_content(); ?>Finally, we need to get the code block for the sidebar into place. In the case of most WordPress sites, the contents of the sidebar are controlled by the Widgets system, so we won’t need to edit a template for this one. In WordPress’ Dashboard, click on Appearance | Widgets, and drag the “Text” widget into a position in the sidebar. Paste the sidebar ad code into the Widget’s text field and click Save. All set? Now take a look at your site. If all went well, you should see AdSense ads at the three locations you placed them. Why AdSense ads? Because you haven’t uploaded any real ads or placed any orders yet, so DFP falls back on the default, which is AdSense. We’ll take care of that next.
Placing an OrderWith your ad code in place, your site is now displaying default AdSense ads. They don’t pay much, and they’re not very attractive. Your real goal is to attract actual advertisers, receive “creative” from them, and upload it to Google for serving on your site. For this tutorial, we’ll be pretending that Berkeley Advanced Media Institute is your advertiser. Download our set of example ads, unzip the archive, and locate the files that begin with “kdmc-“. Remember that an ad order, or “campaign”, is a request by an advertiser for a run of ads on your site, generally within a given time period. Since an order can span multiple ad units, DFP refers to the various placements within an order as “Line Items.” We’ll be creating one order with three line items, and each line item will have one creative (though it could have more). If we were working with multiple advertisers, we’d have an order for each of them. If a given advertiser were running multiple campaigns, we would place multiple orders. So, the hierarchy looks like this:
Advertiser One Order One Line Item One Creative One Creative Two ... Line Item Two ... Order Two ... ... Advertiser Two ...For now, let’s create a single advertiser with a single order consisting of three line items, each of which has one creative.
New OrderStart by clicking the top Order tab, then New Order: Give the order a name, such as “Berkeley Advanced Media Institute March Workshop Campaign.” Click in the company field and look for Berkeley Advanced Media Institute. If it’s not there, select “Add new company” and enter “Berkeley Advanced Media Institute” (this lets you re-use company names in the system). In the Trafficker field, enter the email address of someone in your organization who is responsible for uploading ad creatives (may as well enter your own email address at this point). DFP will present a single Line Item section (all orders must have at least one item, though they can have more). Give the Line Item a name such as “Leaderboard run.” Click in the Inventory Sizes field and you’ll see a list of the sizes of all inventory you’ve defined so far. Select 728×90, since that’s the size of a leaderboard ad. Enter any optional comments you’d like (these could be a note-to-self, such as “Pizza banner running through March 2012”). Now take a look at the Settings section. The “Type” you select is critical – refer back to the Order Types section of the Vocabulary page in this tutorial for a refresher. For now, let’s assume that Berkeley Advanced Media Institute is running a Sponsorship campaign, since that’s generally the highest-paying type of ad run. While you’re here, experiment with the Type drop-down, and notice how certain fields change depending on the type you’ve selected. For example, a Standard ad lets you set a certain number of impressions or clicks, while a Sponsorship lets you set a percentage of all impressions – this difference matches the difference in the definitions of those two terms in the Vocabulary section. Set the Line Item to Sponsorship, starting immediately, ending one month from now, with 100% of all impressions, and a cost of $50 per day. Notice that, if possible, DFP will use this information to calculate the approximate value of this ad run as “Total Cost.” Ignore the Adjust Delivery and Add Targeting sections for now – we’ll come back to that later. Because each Line Item must have at least one creative associated with it, clicking Save at this point would cause DFP to warn us that the order is in Draft status. Instead, click the Save And … button and select Upload Creatives. On the next screen, DFP will ask you what kind of creative you want to add. This could be an interactive Flash file, ad code from an external ad network, or a basic Image. Choose Image. From the file browser, select the file
kdmc-lb.jpgand give it a name. Finally, enter the all-important click-through URL – this is where users will go when and if they click on the ad. Your advertiser will provide you with the correct URL. For now, just enter http://kdmc.berkeley.edu, or any functioning URL you like. Make sure the “Target ad unit size” matches the size of the creative you’re uploading. On the next screen, DFP will show you what the uploaded creative looks like, and ask you to Approve it – do so. This step is just confirmation, so you don’t show the wrong ad in case a mistake was made during upload. Now you’re ready to add two more Line Items to the order, one each for the sidebar ad and the “below article” ad. Click on Orders at the left of the screen, select your order, and then New Line Item for each. Once all three line items have been added to the order, your order should look a bit like this: Now it’s time to take a look at your site. Are your uploaded ads displaying correctly? Unfortunately, the answer is probably no. That’s OK – there’s a good reason for that, which we’ll discover in the next section.
GotchasThere are a number of things that can prevent an ad order you’ve just placed from showing up – some expected, some not. Knowing these “Gotchas” in advance can save a lot of frustration.
DelaysWe’re so accustomed to having everything on the web happening in real-time, it comes as a surprise when we encounter something that’s not. But DFP is just such a system – it has all kinds of built-in delays. Some are for performance and indexing reasons, others are to prevent you from making mistakes in public. The following actions in DFP do NOT happen in real-time:
- Inventory changes: 60 minutes.
- Line item changes: 15 minutes.
- Line item impression delivery: 30 minutes.
- Line item impression reporting: 30 minutes.
Click Fraud ProtectionOnline ad systems grapple constantly with something called “click fraud” – the practice of inventory owners clicking the ads on their own sites to artificially pump up payments. And when they’re not clicking ads themselves, they’re paying someone else to do it. Google builds a number of protections into the system to prevent click fraud, and the most basic is “IP blocking.” Since you’re logged into the DFP control panel, Google knows your IP address, and can exclude any clicks or impressions on your ads that are generated by you. In order to do this, Google basically makes your own traffic invisible. In other words, because clicks and impressions aren’t registered with DFP, you’ll see unexpected side-effects. For example, once an ad starts running, the status of an order as seen in DFP may not move from “Ready” to “Delivering” as expected. This problem generally only comes into play when you’re developing a site on a non-public “staging” or “development” site, since you’re the only one generating traffic on it. While it’s technically safe to click your own ads while logged in to DFP (since your hits are excluded), don’t overdo it and don’t make it a habit – if you accidentally try it while NOT logged into DFP, you could get yourself booted from the system.
Some Error Messages Are RidiculousDFP includes a “debug” tool that will help you investigate exactly what’s going on as the system is deciding which ad to show in a given slot on a given page. It’s extremely useful and we’ll come back to it later, but be aware that some of the error messages it gives you can be downright misleading. For example, the message “No active right-size creative associated” sounds like it’s identified a problem with image sizes. But in fact, this is one of DFP’s catch-all error messages, and may actually have nothing to do with image sizes at all. Don’t worry – most error messages actually are helpful – not all of them are as whacky as this. In general, pretty much anything you need to learn about DFP not covered in this tutorial can be found in DFP’s own documentation. You’ll find a link to “Help” in the top right corner, and context-sensitive help in the lower left of most screens. In addition, look for the small question mark icons next to certain interface elements – hovering your mouse over those will give you a bit of guidance. When all else fails, use the link in DFP to the “Forum,” where hundreds of DFP users congregate and help answer each other’s questions.
Targeting AdsOne of the most powerful aspects of DFP is its ability to “target” ads at certain groups of people. For example, if you’re running a hyperlocal news site, you might want to display ads for local businesses only to visitors coming from your region – why waste all those impressions by putting them in front of people that will never become customers of those businesses? Or you might want to show a beer and pizza deal only to students from local universities and campuses. Similarly, you might have high-bandwidth, rich-media ads that should only be shown to visitors coming in with a broadband connection. You might want to prevent Internet Explorer users from seeing ads crafted in HTML5. If you want to get really fancy about it, you might want to make sure certain ads are only shown to male or to female visitors. All of this is possible with DFP’s ad targeting system. Targeting parameters are attached to Line Items, and can be set either while placing ad ad or added on later. Let’s return to one of the line items we’ve already created and set some targeting criteria. Click on Orders, then My Orders. Click on an order name, then click one of the line items within it. Finally, click the Settings tab within that Line Item. At the bottom of the Settings panel, you’ll find an Add Targeting section. Along the left side of the Target section, you’ll see a list of targeting categories: Inventory, Custom, Geography, Browsing, and User Domains. The box on the left lets you sort and filter for various criteria, and provides small “add” links. Clicking on one of these links causes that criteria to appear as a list in the box on the right. This is your list of final serving criteria for the line item. Click the small “x” to remove a criterion from the list. In most cases, you’ll want to start with the Inventory selector, and define an Ad Unit in which the Line Item should run (otherwise it is possible the item could appear in other ad units on your site for which its eligible for other reasons.) Let’s skip Custom Criteria for now, and move on to Geography. Try typing in a zip code or city name, then click Find. DFP will locate the region on Google Maps and let you check one or more boxes to select an area. Click the “add” link and that regional criteria will appear in the right-hand Selected Criteria box. Note also the “Matches” drop-down near the top. This is present in all of the selectors, and can be changed to “Does not match.” If you want to serve one ad in a line item to users in your geographical area and another to everyone else, just create two line items, then use the Matches / Does Not Match picker to select which ads are shown to whom. The Browsing selector works similarly, but lets you precisely target your ads to particular web browsers, such as Firefox, Internet Explorer, Safari or Chrome. You can even drill down to specific browser versions if you happen to use an ad technology that doesn’t work in certain browsers (Internet Explorer 6 is particularly problematic for modern web technologies, for example). The User Domains selector works exactly as advertised – it lets you target ads to users visiting from specific domains. This is particularly useful for targeting university students (just enter “berkeley.edu” for example). Click Save, wait a while, and your targeting will kick in. If you want to test targeting for yourself, a good way is to target one line item at Firefox users and another at all other browsers. Then try visiting your pages with Firefox and with another browser – you should see different ads.
DebuggingSince DFP lets ads compete in real-time with one other for highest-paying placements, and because there are so many criteria involved in deciding which ad wins a placement on any given page load, you can imagine that the algorithms involved can become extraordinarily complex. Trying to figure out why a given ad did or did not “win” this real-time competition can be tricky. Fortunately, DFP provides a “debug” mode which can help you figure out exactly what DFP was thinking on a particular page load. To activate debug mode, just append the parameter
?google_debugto the end of your URL. For example, if the page you’re looking at is:
http://example.com/2011/03/17/foothen make the URL read:
http://example.com/2011/03/17/foo?google_debugIf there’s already a question mark in the URL, use standard URL parameter technique to add the parameter. For example, if you already have: