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
iffunction - 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.
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:
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.
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.
( All_conversion_value * 100) / Cost
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 / 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.
and(Cost > 50, Conversions = 0),
1,
0
)
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.
( Clicks / Impr) * (Conversions / Clicks)
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.
( Conversions * 5) + All_conversions
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.
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 |
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.
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?
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?
+, -, *, /) 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.