Acquisition

Overview

Your organization's investment, new customers, CAC, LTV, payback, funnel, campaigns and paid media, ready for BI and dashboards.

What this analysis answers

The Acquisition API shows how much the organization invests to win new customers and what that investment returns. It combines media spend (Meta Ads and Google Ads), the customers attributed to each channel and campaign, and the revenue they generate, and returns ready-made metrics such as CAC, LTV, ROI and payback. Every response uses the same period, and the summary cards include a comparison with the previous period.

Questions you can answer:

  • How much did we invest in the period, and how many new customers did it bring?
  • What is our CAC, and how many months does it take to pay back the investment?
  • Which channel and which campaign have the best cost and the best return?
  • How do customers move through the funnel stages?
  • How is paid media performing (impressions, clicks, leads, cost per lead), and which audience and regions does it reach?

Which endpoint to use

QuestionEndpoint
What are the organization's headline numbers (investment, new customers, CAC, payback) and how did they change?GET /v1/acquisition/summary
How do the paid channels compare (CAC, LTV, LTV/CAC, ROI, payback)?GET /v1/acquisition/channels
How much volume goes through each funnel stage?GET /v1/acquisition/funnel
How do new customers evolve day by day, per channel?GET /v1/acquisition/new-customers-over-time
How do CAC, LTV and cost per sale evolve day by day, per channel?GET /v1/acquisition/unit-economics-over-time
Which campaign, ad set or ad performs best?GET /v1/acquisition/campaigns
How is paid media doing: investment, impressions, reach, clicks, leads and CPL?GET /v1/acquisition/paid-media
Which gender, age range and region does Meta Ads reach, and at what cost?GET /v1/acquisition/paid-media/audience

Notes per endpoint

  • /summary and /channels: each metric comes as { value, changePct }, with the percentage change against the previous period. The Orgânico (organic) channel is not part of /channels, because it has no spend. The channel list is not sorted.
  • /funnel: returns only the funnel stages the organization configured on the V4MOS.AI platform. Each stage count is event volume (impressions, clicks, leads, orders) summed across the connected tools. It is not a number of distinct people. EXPOSURE and ATTENTION measure media (scale: "media") and the remaining stages measure customer-side events (scale: "customer"). The step from one group to the other is a change of unit, not a conversion rate. With no configured stages, the response is stages: [].
  • /new-customers-over-time includes the Orgânico channel. /unit-economics-over-time has paid channels only. In both series, days with no data are omitted: fill them with zero in your chart (new customers) or leave them blank (ratios).
  • /campaigns: a channel → campaign → ad set → ad tree, always with two groups: acquisition (campaigns marked as acquisition) and other (everything else). Media metrics exist at every level. Business metrics (customers, CAC, LTV, ROI, payback, leads) exist only at channel and campaign level, because customer attribution stops at the campaign.
  • /paid-media: Meta Ads and Google Ads only. Leads add up the CRM leads attributed to a paid channel by UTM and the platform leads (Meta and Google) that the organization's funnel counts on its Interest stage. The daily series has one point per day, with no gaps, and the cards are its sum.
  • /paid-media/audience: Meta Ads only. Leads here are Meta's lead event and do not match /paid-media, which also adds CRM and Google leads.

Available endpoints

Metrics

Ratios are rounded to 2 decimal places. Investment is not rounded.

FieldMeaningHow it is calculatedUnit
investmentTotal media investmentSpend of every paid campaign, brand and monetization includedCurrency
acquisitionInvestmentAcquisition investmentSpend of the campaigns marked as acquisition onlyCurrency
newCustomersNew customersEvery new customer in the period, from every channel (organic included, on /summary)Customers
acquisitionNewCustomersAcquisition new customersNew customers attributed to the campaigns marked as acquisitionCustomers
cacCustomer acquisition costacquisitionInvestment ÷ acquisitionNewCustomersCurrency per customer
ltv / avgLtvGross average LTVLifetime revenue (LTV) of the customers won in the period ÷ number of those customers, with no margin appliedCurrency per customer
acquisitionAvgLtvAverage LTV of acquisition customersSame as LTV, only for customers from acquisition campaigns, with the contribution margin appliedCurrency per customer
ltvCacRatioLTV/CACltv ÷ cac (on /campaigns, avgLtv ÷ cac)Times (3 = LTV is three times CAC)
acquisitionLtvCacRatioLTV/CAC of acquisition campaignsacquisitionAvgLtv ÷ cacTimes
roiReturn on investment(revenue × contribution margin − investment) ÷ investmentDecimal ratio (0.42 = 42%)
acquisitionRoiROI of acquisition campaignsSame formula, using only the revenue and investment of acquisition campaignsDecimal ratio
paybackMonthsPaybackHow many months it takes for the cumulative contribution (revenue × margin) of the customers won to cover their acquisition cost, as a customer-weighted averageMonths
cpvCost per saleTotal investment ÷ ordersCurrency per order
impressions, clicksImpressions and clicksSum reported by the ad platformsCount
cpmCost per thousand impressionsinvestment × 1000 ÷ impressionsCurrency
ctrClick-through rateclicks × 100 ÷ impressions%
cpcCost per clickinvestment ÷ clicksCurrency per click
leadsLeadsCRM leads attributed by UTM + platform leads the funnel counts on its Interest stage. May have decimals, because Google Ads reports fractional conversionsLeads
leadsBySourceLeads by sourceThe same leads split into crm, meta and googleLeads
cplCost per leadTotal investment ÷ total leads (never an average of daily CPLs)Currency per lead
reachReach (Meta Ads only)People reached, summed per day and campaign. It is an approximation: someone reached on several days or by several campaigns is counted more than oncePeople
costPerThousandReachCost per thousand people reachedinvestment × 1000 ÷ reachCurrency
count (funnel)Stage volumeSum of the stage's events in the periodEvents
pctOfFirst, pctOfPrevious (funnel)Stage proportioncount ÷ first returned stage × 100, and count ÷ previous returned stage × 100%
changePctChange(current − previous) ÷ previous × 100%

Important rules

null means "not defined", never zero

When a ratio cannot be calculated (for example, CAC with no new customer, or CPC with no click), the field is null. A 0 is always a real, measured value.

Do not turn null into 0

Show a dash ("—") or "no data" instead of a number, and leave a gap in charts. Turning null into 0 makes a CAC look free and an LTV/CAC look like the worst possible ratio.

Fields that can be null: cac, ltv, avgLtv, acquisitionAvgLtv, ltvCacRatio, acquisitionLtvCacRatio, roi, acquisitionRoi, paybackMonths, cpv, cpm, ctr, cpc, cpl, leads, reach and costPerThousandReach. changePct is null when the comparison is not possible (previous value zero or missing), and on paybackMonths it is always null. For paybackMonths, 0 and null are opposite results: 0 means the investment paid back within the acquisition month itself; null means no group of customers reached payback, or their cost is unknown.

Funnel exception: on /funnel, pctOfFirst and pctOfPrevious are 0 (not null) when the reference stage has a zero count.

CAC only counts campaigns marked as acquisition

On the V4MOS.AI platform, each organization marks which campaigns are acquisition campaigns (winning new customers). The other campaigns are brand, monetization or unclassified. The CAC in this API uses only the campaigns marked as acquisition, on both sides of the division: cac = acquisitionInvestment ÷ acquisitionNewCustomers.

That is why responses carry two sets of numbers:

SetFieldsWhat it describes
Broad totalsinvestment, newCustomers, ltv, roi and the time seriesThe whole channel or organization, all campaigns
Acquisition onlyacquisitionInvestment, acquisitionNewCustomers, cac, acquisitionAvgLtv, acquisitionLtvCacRatio, acquisitionRoiOnly the campaigns marked as acquisition

Do not mix the two sets

investment ÷ newCustomers is not the CAC, and neither is acquisitionInvestment ÷ newCustomers. Only acquisitionInvestment ÷ acquisitionNewCustomers reproduces cac.

The hasAcquisitionClassification field (on /summary and /channels) tells whether the organization has marked any campaign as acquisition, at any date. When it is false, cac, ltvCacRatio, paybackMonths and the acquisition* metrics are null, and the acquisition group of /campaigns is empty. This is not missing data for the period: the acquisition campaigns still need to be marked on the platform. The broad totals keep their real values.

Contribution margin

The contribution margin the organization configured on the platform (100% when not configured) is applied to roi, acquisitionRoi, paybackMonths and acquisitionAvgLtv (and therefore to acquisitionLtvCacRatio). ltv and avgLtv are gross, with no margin. Responses from /summary, /channels, /unit-economics-over-time and /campaigns report the margin status in marginConfigured (whether it was configured), marginCompleteness (complete, partial or none) and marginItemStatus (status of each cost: payment gateway, tax, freight and cost of goods).

Period and comparison

  • The comparison window is always the period of the same length right before the selected one. Example: a 12-day selection is compared with the 12 days immediately before it.
  • Time series are always daily, whatever the length of the period. A 365-day period returns about 365 points per channel; group them into weeks or months on your side if needed.
  • "Today" is the UTC calendar day. When the period includes today, that last day is still partial, because the day's data keeps arriving.

Data availability flags

FlagEndpointWhen it is false
hasAcquisitionClassification/summary, /channelsThe organization never marked a campaign as acquisition.
hasLeadSource/paid-mediaThe organization has no lead source: no CRM lead with a paid-channel UTM and no platform lead counted on the funnel's Interest stage. leads, leadsBySource and cpl are null (not measured). With a lead source, a day with no lead is a real 0.
hasMeta/paid-media/audienceThe organization has no Meta Ads data. Every list is empty.
hasLeads/paid-media/audienceThe period's audience data carries no lead information. leads, cpl and leadsByGender are null.

Campaigns table: row limit

/campaigns returns at most 5,000 rows across both groups and every level, with no pagination. When the limit is reached, the deepest levels are removed first (ads, then ad sets). Channels and campaigns are never removed. The truncation object reports what happened: truncated, returnedRows, totalRows and droppedLevels. Use it to show "showing N of M rows".

Use campaignId to identify a campaign. Each row's id is unique in the response and works as a key, but for channels and for rows without a platform id it is generated by the API and must not be parsed.

Common parameters

ParameterRequiredDescription
organizationIdYesOrganization identifier.
startDateNoStart of the period, YYYY-MM-DD, inclusive.
endDateNoEnd of the period, YYYY-MM-DD, inclusive.
periodNoDeprecated. Relative period: 7d, 30d, 90d or 1y, ending today (UTC). Ignored when startDate and endDate are sent.
searchNo/campaigns only: filters by campaign, ad set or ad name, case-insensitive.

Date rules:

  • Send startDate and endDate together. Sending only one returns 400.
  • Send the date only (2026-03-11). A date with a time (2026-03-11T00:00:00Z) or a date that does not exist (2026-02-30) returns 400.
  • startDate must be on or before endDate, neither date can be in the future (UTC), and the range can cover at most 366 days (365 days between the two dates).
  • With no dates and no period, the API uses the last 30 days (30d).

Unknown parameters return 400

The API accepts only organizationId, startDate, endDate, period and search. Any other query parameter (for example channel or page) returns 400. A missing organizationId or an invalid period value also returns 400.

Example

curl -X GET "https://data.v4mos.ai/v1/acquisition/summary?organizationId=organization_123&startDate=2026-03-01&endDate=2026-03-31" \
  -H "x-client-id: your_client_id" \
  -H "x-client-secret: your_client_secret"

Authentication

Every endpoint uses the base URL https://data.v4mos.ai and requires the x-client-id and x-client-secret headers. See Authentication.

On this page