TR Start free
HomeBlog › Guide

How to track marketing campaign ROI: budget, members and revenue

O Ohana360 Team • September 22, 2026 • 11 min read
Cover image showing a trade fair campaign over budget with its cost, expected revenue and two ROI figures in Ohana360

Marketing campaign tracking in Ohana360 runs on the Campaign record in Marketing360: type, status, dates, budget, actual cost and expected revenue sit on one record, and members are added as leads or contacts. The record calculates ROI by itself, but from expected revenue; for the real return you record won revenue in a field of its own.

Ohana360 is a business cloud that keeps sales, marketing, service and finance records in one database. Marketing360 is its app for campaigns, segments and email templates, and the members of a campaign are the very same lead records you work in Sales360.

This guide starts with numbers: a trade fair campaign that went over budget, an ROI of 196% on the screen, and the actual return of that same campaign, 56%. A team that understands where the gap comes from will not misread its campaign report.

Why does the same campaign show two different ROIs?

Because the built-in ROI tile in Ohana360 uses the expected revenue you typed in when you opened the campaign, not the sales you won. The formula lives in the code and fits on one line: subtract actual cost from expected revenue, divide by actual cost, multiply by a hundred, round to a whole number.

One campaign, two ROIs: expected 196%, actual 56% A sample trade fair campaign. The built-in tile uses expected revenue; actual ROI needs won revenue in its own field. 120,000 Budget 135,000 Actual cost 400,000 Expected revenue 210,000 Won revenue Expected ROI: built-in tile (400,000 - 135,000) / 135,000 x 100 196% Actual ROI: custom formula field (210,000 - 135,000) / 135,000 x 100 56% With an actual cost of zero the built-in tile shows a dash instead of an ROI; the result is rounded to a whole number.

The sample fair campaign has a budget of 120,000, an actual cost of 135,000 and an expected revenue of 400,000. The tile works out (400,000 - 135,000) / 135,000 and shows 196%. The opportunities won from leads met at the fair add up to 210,000, and the same formula with that figure gives 56%.

Both numbers are right; they answer different questions. Expected ROI is the plan before the campaign, actual ROI is the account after it. That is why the tile is labelled as expected ROI on screen, and with an actual cost of zero it does no maths at all and shows a dash.

Which fields does the campaign record hold?

The New Campaign window has nine fields and only Campaign Name is required. A new campaign opens as an email campaign in Planned status, starting today and ending thirty days later, and you can change all of that before saving.

FieldWhat it holdsValues
Campaign NameThe name of the campaign, requiredFree text
TypeThe channel of the campaignSix fixed types, see the table below
StatusThe life cyclePlanned, Working, Done, Aborted
Start / EndThe campaign calendarDate
BudgetWhat you plan to spendNumber
Actual CostWhat has been spent so farNumber, one total
Expected RevenueThe revenue you hope forNumber
DescriptionGoal, message, notesFree text

The type values are stored in Turkish and are shown that way in the type picker, so the list below pairs each stored value with its meaning.

Stored valueMeaning
E-postaEmail campaign, the default for a new record
WebinarWebinar
EtkinlikEvent or trade fair
Sosyal MedyaSocial media
ReklamAdvertising; switches the record to the ad panel
DiğerOther

The owner field is filled with the user who created the campaign. The Campaigns tab opens in two views: a Kanban with one column per status and a List with selectable columns. A Kanban card shows type, member count, budget and end date, and the status changes from the picker at the bottom of the card.

How do campaign statuses and the attention list work?

A campaign has four statuses and they change with one click on the path bar at the top of the record page. The Marketing360 home page scans open campaigns against five rules and ranks the problem ones in the Campaigns Needing Attention list.

The campaign record: four statuses, five attention reasons Status changes with one click on the path bar; the attention list only looks at campaigns that are not Done or Aborted. Planned Working Done Aborted Campaigns Needing Attention on the Marketing360 home page shows the first reason that applies: 1 budget exceeded Actual cost is above budget (when a budget is set). 2 end date passed The end date is behind you but the campaign is still open. 3 ending within days Seven days or fewer until the end date. 4 start date passed, still planned The start date has passed and the status is still Planned. 5 high budget Budget of 100,000 or more; shown only if none of the others apply. The Budget Usage bar stops at 100%. The overrun is reported by reason one in this list, not by the bar.

This list is a ready agenda for the weekly marketing meeting. Update the actual cost of your campaigns before the meeting and the list pushes the right campaign to the top by itself.

How do you compare budget with actual cost?

The Budget Usage card on the record divides actual cost by budget and shows the result as a percentage bar. The bar stops at 100%: a 120,000 budget with 135,000 spent reads 100%, not 113%.

There are two ways to see how large the overrun is. The first is the Campaigns Needing Attention list, which names the overrun as its reason. The second is a report: put the Budget and Actual fields next to each other in the Report Builder and the gap is on one line.

Actual cost is one total typed in by hand; it is not summed from invoice or expense lines. The campaign owner updates the field as spend comes in, and the one exception is the advertising type described further down.

How do you add campaign members and what do their statuses mean?

A campaign member is a lead or a contact the campaign reached, and it is added with the Add Member button on the record page. The window switches between Leads and Contacts, searches by name, company or email and selects with checkboxes.

Stored member statusMeaning and when it is set
EklendiAdded: every member starts with this value
GönderildiSent: set automatically for Added members when a send linked to the campaign is saved
AçıldıOpened: picked by hand
TıkladıClicked: picked by hand
YanıtladıResponded: picked by hand; feeds the responded count on the statistics card

The Campaign Statistics card holds five tiles: Member (with the responded count under it), Send, Opens, Clicks and expected ROI. Open and click rates come from Marketing360 Sends records, and our customer segmentation guide explains how those records are created. For real newsletter delivery and measurement, see the email newsletter guide.

How do leads and opportunities connect to a campaign?

A lead connects to a campaign through membership; an opportunity has no built-in connection. The opportunity record carries no campaign field, and the lookup field in Object Manager does not offer Campaign as a target: the targets are Account, Contact, Lead, Opportunity, Case, Legal Case and custom objects.

Summing won opportunities by campaign follows the Report Builder steps in our sales reports guide: object Opportunities, filter stage Closed Won, group by the Campaign field, metric sum of Amount.

Which fields do you need for actual ROI?

Two custom fields on the campaign object are enough for actual ROI: a number field holding won revenue and a formula field that turns it into ROI. Both are added to the Campaign object in Object Manager under Setup, with no code.

Ohana360 campaign record comparing the built-in expected ROI tile with actual ROI from a custom formula field
  1. Add a Number field named Kazanılan Gelir (won revenue). Ohana360 generates the API name cf_kazanilan_gelir from the label; an English label would give a different API name, so adjust the formula to match.
  2. Add a Formula field named Actual ROI and enter this formula:
IF(actualCost > 0, ROUND((cf_kazanilan_gelir - actualCost) * 100 / MAX(actualCost, 1), 0), 0)

The formula returns zero while cost is zero and never divides by zero. If the won revenue field has never been filled, the formula field shows #HATA (error); typing 0 when you open the campaign prevents it. When the campaign closes, you enter the total of won opportunities whose campaign field points to it.

A third field helps too: a Rollup Summary field counting the Campaign Members relationship. Because a formula can refer to a rollup, ROUND(actualCost / MAX(cf_uye_sayisi, 1), 0) gives cost per member, where cf_uye_sayisi is the API name produced by the label Üye Sayısı; for the 48 member sample campaign that comes to 2,813.

How do you report on campaigns?

In the Report Builder the Campaigns object comes with seven fields: Campaign, Type, Status, Budget, Actual, Expected Revenue and Start. The ready templates include a campaign budget by type report that shows the budget total per type as a bar chart.

Are advertising campaigns tracked differently?

Yes. A campaign whose type is advertising (stored as Reklam) shows an ad panel instead of email statistics and the member list: Spend, Sales, ROAS, Impressions and Clicks cards plus a conversion funnel from click to sale.

In an org with a Meta or Google Ads account connected, the sync creates an advertising campaign record for each campaign on the ad platform or updates the existing one. Spend goes into actual cost and the conversion value measured by the platform goes into expected revenue, so for this type the expected ROI tile runs on measured revenue. The default break-even ROAS is 3.0.

What it does not do: the limits of campaign tracking

The items below are known limits of the product today and none of them can be switched on in settings. Some can be worked around with the custom fields above.

Most of these limits share a root: the campaign record was designed as a marketing plan, while revenue accounting lives on the sales side, on the opportunity. The bridge between the two today is the pair of custom fields you add.

How should you set up your first campaign?

The right candidate for a first campaign is a single campaign that is running now and has a known budget. Trying to enter past campaigns after the fact usually stalls, because the cost figures are incomplete.

Do this: open the campaign in Marketing360 with its type, dates, budget and expected revenue, add the won revenue and Actual ROI fields in Object Manager, put a Campaign picklist on the Opportunity object and select the leads the campaign reached with Add Member. Update actual cost as spend comes in.

When the campaign ends, ask one question: how far apart are expected ROI and actual ROI? A wide gap may point at the revenue estimate rather than the campaign. To follow how leads move after the campaign, use our guide to sales pipeline stages.

Read next