QuantumAdsLab Logo Quantum Ads Lab
Custom columns in Google Ads — when the default metrics don't tell the whole story, you build your own
Custom columns in Google Ads — when the default metrics don't tell the whole story, you build your own

Custom Columns in Google Ads: Advanced Formulas for Reporting

Summary

What you'll learn in this article

  • What custom columns in Google Ads are and how the formula editor works
  • The full syntax: arithmetic, comparison operators, and conditional logic with the if function
  • The advanced formulas I actually use in real accounts — with complete, copy-ready code
  • Why composite metrics surface insights that standard columns hide
  • How I structure report templates built around custom columns, and what changed in the way I read campaign data
  • Common mistakes and edge cases to avoid when building custom column formulas

The first time I opened the custom columns editor in Google Ads, I used it for something trivial: dividing conversion value by cost to get a metric I already had, ROAS expressed differently. That was a waste. Custom columns in Google Ads are not a cosmetic feature for renaming existing metrics. They are a formula engine that lets you define entirely new KPIs, composite, conditional, cross-metric ratios, that live inside the reporting interface alongside all standard data.

After years of building reports for accounts of different sizes and types, my relationship with custom columns changed completely. I stopped thinking of them as a nice-to-have and started treating them as the primary lens through which I read account data. This article is about that shift: not just the syntax, but the reasoning behind specific formulas and what they tell you that standard columns don't.

Throughout, I start from the official Google documentation and flag where direct experience on real accounts leads to more precise conclusions, particularly on which formulas genuinely change how you read the data and which only look impressive.

What custom columns in Google Ads actually are

According to official Google documentation, custom columns are user-defined metrics you create through a formula editor inside the Google Ads reporting interface. They appear directly in the columns panel alongside standard metrics, clicks, impressions, cost, conversions, and can be sorted, filtered, and exported like any other column. The key difference: they don't exist until you define them, and their value is computed in real time from the formula you write.

Google describes custom columns as a way to combine metrics using math formulas. That description is technically accurate but undersells what's possible. Once you add conditional logic, the if function, custom columns stop being calculators and become behavioral classifiers.

What custom columns are not

Before going further, a critical clarification: custom columns are a reporting-only feature. They do not influence Smart Bidding, they do not affect Quality Score, they do not alter how the auction treats your ads. Whatever formula you write, the result exists exclusively as a number in a report. This matters because it removes any anxiety about "breaking something", you can build experimental metrics freely, knowing they have zero operational impact on the account.

Where to find them

Custom columns are accessible from any table view in Google Ads, campaigns, ad groups, ads, keywords, by clicking the columns icon in the top right of the table, selecting "Modify columns", then "+ Custom column". The editor opens with a metric selector, operator buttons, and a preview that shows computed values for the current date range. The full overview of the feature is documented at About custom columns, and the step-by-step creation flow at Create custom columns.

What experience shows: the limit is high enough that it's never a real constraint, Google allows up to 1,000 custom columns per account, but the practical ceiling is much lower. On a working account, more than 10–15 active columns turns the table into noise. The skill isn't creating columns, it's deciding which 5–7 deserve to stay visible.

The formula editor: syntax and capabilities

Understanding what the editor can and cannot do prevents frustration. Here's the complete picture of Google Ads custom column formula syntax. The full reference is documented by Google at Create custom columns, with the complete list of supported functions at About functions in custom columns and the full column list at About columns in custom columns.

Column names in text mode

The editor has two modes: visual (ovals you click to add filters) and text. In text mode, column names must be typed exactly as Google lists them, with no spaces or special characters, names are case-insensitive but spelling must match. For example, impressions is Impr, cost is Cost, conversions is Conversions, and conversion value is Conversion_value (or All_conversion_value for the "all conversions" variant). The formulas below use these text-mode names so you can paste them directly.

Arithmetic operators

The four basic arithmetic operators work as expected: +, -, *, /. Parentheses control order of operations. Division by zero returns no value (a dash in the table), not an error, important to understand when building ratios that could have zero denominators.

Basic arithmetic — cost per click
// Cost divided by clicks; rows with zero clicks show a dash
Cost / Clicks

Comparison and logical operators

The formula editor supports >, <, >=, <=, =, !=. Logic is handled by the and, or, and not functions, written in lowercase like any other function: and(x, y, ...), or(x, y, ...), not(x). These return true/false values and become meaningful only inside an if expression. Note that comparisons need parentheses to enforce order of operations, Clicks * 2 > 10 won't save, but (Clicks * 2) > 10 will.

Conditional logic: the if function

This is where custom column formulas in Google Ads become genuinely powerful. The if function evaluates a condition and returns one value if true, another if false. The syntax is:

if syntax
if(condition, if_true, if_false)

The condition can use any arithmetic result, any comparison operator, or combinations of logical functions. The return values can be constants, metric expressions, or nested if statements, enabling multi-branch logic. The return value takes the same data type as if_true and if_false.

Nesting if statements

Google Ads supports nested if statements, which makes it possible to build tiered classification logic. Deeply nested formulas become hard to debug, but 2–3 levels of nesting is stable and covers most real-world use cases.

Nested if — three-tier performance bracket
if(
   Conversions / Cost >= 0.05,
   3, // High performer
   if(
     Conversions / Cost >= 0.02,
     2, // Mid performer
     1 // Low performer
  )
)

This returns a numeric score (1, 2, or 3) that you can sort and filter by. It doesn't tell you why performance differs, but it lets you instantly rank campaigns or ad groups by relative conversion efficiency, which is the first step in any optimization workflow.

The advanced formulas I actually use

Below are the custom column formulas I've built and refined over years of working on real accounts. Each one exists because a standard metric was telling an incomplete story, and I needed a better question to ask the data. They're written in text-mode column names so you can paste them straight into the editor.

1. True efficiency ratio (not ROAS, not CPA)

ROAS and CPA are useful, but they flatten different types of conversions into a single number. When an account tracks both high-value and low-value conversion actions, the aggregate metric is misleading. This formula expresses conversion value against cost on a readable scale, producing a score that better reflects the actual business impact of a campaign.

Weighted conversion efficiency
// Ratio of conversion value to cost, scaled for readability
( All_conversion_value * 100) / Cost
From experience

On accounts with mixed conversion types, form fills and purchases in the same campaign, I always create this column alongside standard ROAS. The two numbers often diverge significantly, and that divergence is itself an insight: it tells you that high-volume, low-value conversions are inflating ROAS while the business-critical actions are underperforming. Without the weighted ratio column, this stays invisible in the default view.

2. Click efficiency: actions earned per unit of cost

Comparing CPC across campaigns is standard, but CPC alone doesn't tell you how efficiently each campaign turns spend into clicks at scale. This formula computes clicks earned per unit of cost, normalized to make the numbers readable, a quick "click value per €1,000 of spend" lens.

Clicks per unit of cost
// Clicks earned per unit of cost, normalized to 1000
( Clicks / Cost) * 1000

3. Conditional spend alert flag

This is one of the most operationally useful formulas I've built. It returns 1 when a campaign has spent above a threshold but has zero conversions in the selected date range, and 0 otherwise. In a table sorted by this column, all "spend with no return" rows float to the top instantly, no manual scanning required.

Spend-without-conversion flag
if(
   and(Cost > 50, Conversions = 0),
   1,
   0
)
From experience

I adjust the cost threshold depending on the account's average CPA. For accounts with a €10–20 target CPA, I set the threshold at 2× target CPA, so the flag fires when spend is at least 2× what should have produced a conversion. For high-CPA accounts (B2B, automotive), I raise it to 3–4×. The formula itself stays identical; only the number changes.

4. Quality-adjusted CTR

Click-through rate is one of the most looked-at metrics in any Google Ads account, and one of the most misread. A high CTR can mean compelling creative, or it can mean a highly specific audience that almost never converts. This formula adjusts CTR by the conversion rate, producing a metric that reflects not just how many people clicked, but how many of those clicks were worth having.

CTR × CVR — quality-adjusted click rate
// CTR weighted by conversion rate, filters out clicks that don't convert
( Clicks / Impr) * (Conversions / Clicks)
Note: This formula can be simplified to Conversions / Impr, which is algebraically identical. I prefer the explicit form because it keeps the two components visible and makes the logic easier to explain to clients or collaborators reading the report.

5. Micro-conversion bridge metric

On accounts where the primary conversion (purchase, lead form submission) is low-volume, micro-conversions, page views, time on site, add-to-cart events, carry the signal load. This formula computes a blended "engagement score" that weights primary and secondary conversions differently, giving lower-funnel signals a visible representation in the reporting layer.

Blended engagement score (primary + all conversions)
// Primary conversions weighted 5×, all conversions 1×
( Conversions * 5) + All_conversions
From experience

The weighting factor (5× in this example) isn't arbitrary, it should reflect the actual value ratio between primary and secondary conversions in the specific business. For an e-commerce account where "add to cart" converts to purchase roughly 20% of the time, a 5× weight is roughly correct: one purchase ≈ five add-to-cart events in expected revenue terms. I derive this number from the account's own conversion path data before deciding on the multiplier.

6. Campaign-level CPA triage

Instead of sorting by CPA and reading through the list, this formula classifies each campaign into one of three cost-per-acquisition states relative to a target. It returns a numeric code (0, 1, 2) that maps to categories I define in the report legend.

CPA triage classifier (target: €30)
if(
   Cost / Conversions <= 30,
   2, // On target
   if(
     Cost / Conversions <= 45,
     1, // Within 50% of target
     0 // Significantly over target
  )
)

Sorting this column ascending puts the worst performers first. In accounts with 20+ campaigns, this triage view turns a 10-minute scan into a 30-second priority list.

Building reports with custom columns: what I learned the hard way

The problem with the default column set

When I started managing Google Ads accounts, I worked with the default column sets the interface suggested. Clicks, impressions, CTR, CPC, conversions, cost per conversion, ROAS. The columns looked complete. The problem was that they answered what happened but rarely why, and almost never where to look next. ROAS of 4.2, is that good? Compared to what? For which conversion types? Against what cost threshold?

Standard columns give you data. Custom columns give you answers, but only if you've thought carefully about the questions first. That's the shift I had to make: from adding custom columns reactively (I need this calculation) to designing a reporting framework upfront, where each custom column answers a specific diagnostic question.

My baseline custom column stack

For most accounts, I maintain a set of six custom columns that I add as a first action when I start working on a new account. These form a diagnostic layer on top of whatever standard columns the account uses, and they adapt across the different types of reports I build — weekly triage views, client-facing summaries, and deep optimization audits:

Column name What it answers When it matters most
Spend flag (no conversions) Are there campaigns burning budget with no return? Weekly review, always
Quality-adjusted CTR Are clicks actually converting, or just clicking? Creative and audience evaluation
Weighted efficiency ratio Is ROAS inflated by low-value conversions? Accounts with mixed conversion types
CPA triage classifier Which campaigns need immediate attention? Multi-campaign accounts, daily triage
Click efficiency Is spend translating into clicks at scale? Awareness campaigns, YouTube
Micro-conversion bridge What's the signal quality on low-volume campaigns? New campaigns, B2B accounts
From experience

The hardest part of building this stack wasn't the formula syntax, it was resisting the urge to add too many columns. At one point I had 22 custom columns on a single account. The table looked impressive and was completely unusable: too much information, no clear hierarchy of priority. I've since learned that 5–7 custom columns, chosen carefully, do more analytical work than 20 columns that partially overlap or measure variations of the same thing. Column economy is a real skill.

Custom columns, scripts, and Looker Studio

One limitation that took me a while to internalize: custom columns are a reporting-layer computation tied to the interface. They live inside Google Ads itself, so when you move data into external reporting tools, the behavior changes. When you export a report through the Google Ads connector, custom columns export as values, but their underlying formula doesn't transfer. If you rebuild the report in Looker Studio, you need to recreate the logic there using calculated fields in Looker Studio's own formula language (which supports similar conditional logic).

This is a reason to document your custom column formulas externally, in a shared doc or a Notion page, rather than treating them as ephemeral interface settings. I keep a formula library for each client, noting the formula, the logic behind the threshold values, and when the column was last reviewed. The official Custom columns FAQ covers the structural limits worth knowing, such as how references between columns can chain.

When custom columns expose conversion tracking problems

The spend-without-conversion flag has uncovered conversion tracking gaps in almost every account where I've deployed it. Running the flag across a 90-day window and seeing campaigns with thousands of euros in spend and zero conversions is alarming at first, but it's often not a bidding problem. It's a tracking problem: the conversion action isn't firing, or it's attributed to the wrong campaign.

From experience

On one account, the spend flag surfaced a Performance Max campaign that had been running for three months, spending about €400/week, with conversions always attributed to brand search campaigns via last-click attribution. The PMax was generating real demand (brand searches spiked when PMax ran), but the conversion tracking setup didn't capture any of that value directly. The custom column didn't solve the attribution problem, but it made the problem impossible to ignore. That's the diagnostic value I'm talking about: not answers, but the right questions.

Threshold calibration: the formula is only as good as its numbers

Every conditional formula contains at least one threshold value, the number you compare a metric against. Getting that number wrong produces misleading results. I've built conditional columns with default thresholds I copy-pasted from a guide, then wondered why the column wasn't useful: the account's target CPA was €80, but my formula was checking against €30.

The practice I now follow: calibrate every threshold against actual account data before deploying the column. For a CPA triage column, the "on target" threshold should be the actual target CPA in the active bidding strategy, not a generic benchmark. For the spend flag, the threshold should be 2–3× the average CPA in the account, not an arbitrary number. Ten minutes of calibration prevents weeks of looking at misleading flags.

FAQ on custom columns and Google Ads formulas

What are custom columns in Google Ads?
Custom columns in Google Ads are user-defined metrics created through a formula editor in the reporting interface. You combine standard Google Ads metrics (clicks, cost, conversions, impressions, etc.) using arithmetic operators, comparison operators, and the conditional if function to produce a new column that computes dynamically for any selected date range and entity level. They are purely analytical, they have no effect on bidding, serving, or Quality Score.
What formulas and operators does the custom column editor support?
The Google Ads custom column formula editor supports: arithmetic operators (+, -, *, /) with standard order-of-operations and parentheses; comparison operators (>, <, >=, <=, =, !=); logical functions (and, or, not); and the conditional if(condition, if_true, if_false) function with nesting support. It also includes text, date, and arithmetic functions like round, concat, and days_between. Full function reference: About functions in custom columns.
Do custom columns in Google Ads affect Smart Bidding?
No. Custom columns are a reporting-only feature. They compute values for display in the interface and exports, but do not feed into any Google Ads algorithm, not Smart Bidding, not auction eligibility, not Quality Score. You can safely experiment with any formula without risk of affecting campaign performance.
How many custom columns can I create per Google Ads account?
Google Ads allows up to 1,000 custom columns owned by a single account, as detailed in the Custom columns FAQ. In practice, having more than 10–15 actively used columns makes reports harder to navigate. I maintain a "live" set of 5–7 columns per account and archive rarely-used formulas in documentation rather than keeping them active in the interface.
Can I use custom columns in Google Ads scripts or Looker Studio?
Custom columns are a UI-layer computation. They export as values when you use the Google Ads reporting connector in Looker Studio or the Google Sheets add-on, but the formula logic does not transfer. To replicate custom column logic in Looker Studio, you need to recreate the formula as a calculated field in Looker Studio's own formula language (which supports similar conditional logic).
What's the difference between custom columns and conversion goals in Google Ads?
They operate at completely different levels. Conversion goals define which actions Google's bidding algorithms optimize toward, they are operational signals that directly affect how Smart Bidding allocates budget. Custom columns are a reporting layer: they compute analytical metrics from data that already exists in the account, but have no influence on how campaigns are served or optimized.

All articles

See all →