Revenue Types
Cash vs pipeline vs gross -- why only confirmed payments count for ROAS
Revenue Types
Atribu tracks three distinct types of monetary value. Each serves a different purpose, and mixing them produces meaningless metrics.
The three types
Cash
Confirmed payments from Stripe and MercadoPago. The only value used for ROAS.
Pipeline
Deal values from GoHighLevel opportunities. Projections, not confirmed revenue.
Gross
Order values from e-commerce platforms. May include refunds or cancellations.
Cash (for ROAS)
revenue_type = 'cash'
Real payments confirmed by Stripe or MercadoPago. This is the only value used for ROAS calculations.
| Property | Detail |
|---|---|
| Source | payment_received events from Stripe/MercadoPago webhooks |
| Reliability | 100% -- these are actual bank transactions |
| API field | revenue in /api/v1/overview and /api/v1/campaigns |
| Used in ROAS | Yes |
Pipeline
revenue_type = 'pipeline'
Deal values from GoHighLevel opportunities (lead_created, appointment_booked, closed_won). These are projections, not confirmed cash.
| Property | Detail |
|---|---|
| Source | GHL opportunity sync |
| Reliability | Variable -- deals can be lost, renegotiated, or never close |
| API field | Visible in conversion counts, excluded from revenue and roas |
| Used in ROAS | No |
Gross
revenue_type = 'gross'
Order values from e-commerce platforms (e.g., order_placed events). May include orders that are later refunded, cancelled, or never fulfilled.
| Property | Detail |
|---|---|
| Source | E-commerce platforms (Shopify, etc.) |
| Reliability | Medium -- represents intent to pay, not confirmed collection |
| API field | Tracked separately from cash revenue |
| Used in ROAS | No |
Why this matters
Never mix pipeline values into ROAS
If pipeline values were included in ROAS, a single $50,000 deal projection could make a $500 ad campaign show 100x ROAS -- completely misleading. That deal might never close, get renegotiated to $5,000, or be lost entirely. Only confirmed cash payments produce trustworthy ROAS numbers.
Consider this example:
| Metric | With cash only | With pipeline included |
|---|---|---|
| Ad spend | $2,000 | $2,000 |
| Revenue | $6,000 (3 payments) | $56,000 (3 payments + 1 deal) |
| ROAS | 3.0x | 28.0x |
| Accurate? | Yes | No -- $50K deal hasn't closed |
How it appears in the API
Overview endpoint
The revenue and roas fields in /api/v1/overview always use cash only:
{
"data": {
"current": {
"spend": 4250.00,
"revenue": 12800.00,
"roas": 3.01,
"cash_revenue": 12800.00,
"cash_payments": 48
}
}
}Campaigns endpoint
Campaign-level outcome_value and roas also reflect cash revenue only:
{
"data": [
{
"campaign_name": "Spring Sale - Conversions",
"spend": 1800.00,
"outcome_count": 45,
"outcome_value": 6200.00,
"roas": 3.44
}
]
}Conversion counts include all types
The outcome_count field includes conversions of all revenue types (cash, pipeline, and gross). This gives you visibility into total conversion volume. Only the monetary fields (revenue, outcome_value, roas) are restricted to cash.
Conversions endpoint
The /api/v1/conversions endpoint returns individual conversion events with their revenue_type, so you can filter and analyze each type independently:
{
"conversion_type": "payment_received",
"revenue_type": "cash",
"value": 450.00,
"customer_name": "John Doe"
}{
"conversion_type": "closed_won",
"revenue_type": "pipeline",
"value": 15000.00,
"customer_name": "Acme Corp"
}