How to automate deep-funnel SEM bidding for B2B Target ROAS
Table of Contents
For performance marketers, not all conversions are created equal. Consider Target CPA, a bidding strategy which sets digital advertising bids at or below the cost-per-action (CPA) you set for it. Target CPA is a great way to acquire cost-effective leads, but it has no way of telling which leads are better than others. For example, a disposable email from an undesired placement appears the same as a buying committee member from your target audience. In fact, a few bad leads can negatively reinforce the bidding algorithm, leading to more bad leads at the expense of high-quality leads. Today, we’ll go over a full walk-through of how performance marketers can capture better leads at superior CPA levels by combining smart automation with fast, easy-to-build API integrations connecting the pay-per-click (PPC) tools they already use.
Traditionally, B2C and shopping campaigns have often been able to take advantage of Target ROAS, an alternative bidding strategy that sets custom bids based on your target return on ad spend (ROAS). However, B2B buyer’s journeys are often much longer and often fall out of the 90-day window for conversions. We at Tray.io use our General Automation Platform to solve the B2B lead challenge by using a combination of CRM-to-Google Ads data integrations alongside automated business logic.
Before we get into the technical aspects of how we build out our smarter lead acquisition engine using the Tray Platform, let’s take a look at how certain business considerations shaped the path for the business logic.
- Responsive - We wanted a solution that would be quick to respond to business or market changes. Target ROAS based purely on closed-won deals would take several sales periods to reflect the changes in account status.
- Data rich - We know that any machine learning (ML) system learns best when you provide more data, and the Google Smart Bidding algorithm is no exception.
- Evolving product - Tray.io is continually improving its product offering by filling product gaps and building more API endpoints. Sometimes the right person finds us at the wrong time. We should still send Google the positive information about how good of a “fit” each lead is.
- Evolving messaging / sales - The Tray.io team is working to clarify our message and explain our amazing time to value, which has shifted our win rate over time. We don’t want to penalize past performance.
- Lead enrichment + lead scoring - We have automatic and manual enrichment components to our lead scoring. This means that there is about a two-day lag between lead conversion and finalized lead score.
- Tools needed - Fortunately, we can build out our process using the tools we use every day, namely Google Ads, Google Sheets, and our CRM, in this case, Salesforce (though you could just as easily use another CRM product). In our example, we also use a customer data platform, in this case Segment, to log additional details such as Google Click ID (GCLID) data, which some CRM tools may overwrite during data transfer.
The buyer’s journey takes time. And while we want to account for the duration of the journey, we also want to pass as much relevant and recent information back to Google’s bidding algorithm to bid more for important leads. As a result, we’ve arrived at a simplified but robust approach of using expected revenue per lead in our calculations. We’ve also decided to use the conversions from two days ago to make sure that we have the most accurate lead score possible. Because our “A leads” (which are most likely to become closed-won deals) perform so differently from other leads, we decided to use A leads as their own conversion event.
We took a recent six-month period of time and grabbed a cohort of leads and opportunities. Working backwards, we calculated the expected revenue for each type of lead. Our current model gives out four potential scores for leads: A (best fit), B, C, and finally, D. Given that each lead score’s expected revenue is so different, it should tell Google that, for example, a B lead is worth 10x more than a C lead. In other words, we get to take advantage of target ROAS in a B2B context! Given that our D leads, the worst fit for expected revenue, weren’t worth much, and we had significant data from the other lead sources, Google’s Smart Bidding team advised us against uploading D leads.
Luckily, Google Ads has a built-in integration with Google Sheets, which lets you automate offline uploads. So all we need to do with the Tray Platform is connect to our CRM, incorporate business logic, and populate our Google Sheet. Thankfully, the Tray Platform gives any business user the power to integrate just about anything (including any cloud services with open APIs and virtually any data source), then build automated workflows to orchestrate multi-step processes from any custom trigger.
Step 1: Schedule the workflow In the Tray Platform, we use a scheduled trigger to kick off our automated workflow an hour before our automated upload from Google Sheets to Google Ads.
Step 2: Prepare the sheet We use our Google Sheets connector and our math helper to delete the rows from the previous runs so that we only have the headers left.
Step 3: Get relevant dates We’ll need to get today’s date, yesterday’s date, and the previous day’s date. We need multiple dates because our enrichment process contains a manual portion and contributes to about a two-day lag. So, we use our platform’s date and time helper to call up the appropriate dates.
Step 4: Get Salesforce Leads Using the dates from the previous steps, we can retrieve the Salesforce leads from two days ago as well as any other criteria (e.g. contains a campaign identifier such as GCLID).
Step 5: Loop through Salesforce leads and test for lead condition Using a loop to parse each individual lead record, we can then use a “true/false” Boolean logic operator to test to see whether each lead fits our criteria of being an A, B, or C lead (true) so we can continue to process that lead. Otherwise, the current lead is a low-value D lead (false), which means we can skip straight to the next record.
Step 6: Write to Google Sheets if lead meets our conditions What happens if our workflow determines that our lead is valuable (it’s at least an A, B, or C lead)? We use our date and time helper and data mapper to map the correct time zone to that lead, and to format the data for Google Ads. We also map the lead score value to its expected revenue and conversion name, then write to Google Sheets.
Step 7: Write a backup to Segment One thing that I’ve found useful is to get a snapshot picture of data intended for Google Ads. Taking a snapshot lets me pull in past data in case of any issues and helps me troubleshoot my records if something breaks. Using a tool like Segment is important because Salesforce tends to overwrite the GCLID field, and you don’t want to lose out on the GCLID that actually drove the event!
Step 8: Repeat process for contacts We store the lead score on the contact for people we have converted to contacts, and so, we’ll repeat the process for contacts, including writing to Segment.
Step 9: Check for null values We want to make sure that there are no Salesforce records (leads or contacts) that are missing their lead score values. So, we include an additional true/false Boolean condition in our workflow that serves as an alert if there are any records with missing values.
Step 10: Send confirmation message After everything is done, you’ll want to send yourself a Slack message to confirm!
At the end, you’ll have a Google Sheet that looks something like this:
(If you’re interested in setting up the final step in the automated upload, Google Ads documentation tells you how to do the rest here.)
We have quite a few ideas about what to do next.
We’ll need to create a workflow in the future to monitor our expected revenue value. On a monthly basis, we run a scheduled job to look at a rolling six-month period to check and recalculate expected revenue. We can easily change the mapped revenue values in the workflow if the expected revenue changes over time.
We can also create another workflow to make sure we’re correctly uploading the expected number of leads. We can create a Google Ads reporting workflow to compare the number of uploaded conversions against our Salesforce records to make sure that there is no deviation. If we detect what we consider to be a significant deviation (using our own custom parameters), we can create an alert to investigate the workflow and report any errors.
Iterate on the model
We can get more sophisticated by looking at other factors and working them into our expected value for each lead. We can work in factors such as offer type, job title, or website behavior to adjust the expected value. The Tray Platform is robust enough and flexible enough to add an endless variety of factors into our calculations. As a result, we can continue to iterate on the business logic to help drive a better ROI for our marketing program.
There are many ways to manage uploaded conversions, but many out-of-the-box solutions or set recipes aren’t dynamic or flexible enough to match your company’s unique business needs. With the Tray Platform, you can easily apply business logic, improve resilience, and quickly catch errors. And as we mentioned, our platform doesn’t just work with one specific tool. Aside from Salesforce, you can easily connect to any CRM or marketing automation platform, and any other app with an open API.
The Tray Platform empowers me to create a solution like this without requiring resources from my IT or business intelligence teams, or from other strapped resources. If you’re interested in discovering more automation ideas to increase efficiency across your organization and drive revenue growth, sign up for our next weekly group demo.