CSV format for won deals
Upload a CSV exported from any CRM under Client › Settings › Leads & revenue. It needs a header row with a date, an amount, a landing page and a status column. Common header names from HubSpot, Jobber or GoHighLevel exports are recognized without renaming. Re-uploading the same file updates deals instead of adding them twice.
What it doesn't do: It doesn't fetch the landing page for you. If the CRM never stored it, those deals import as unmatched; add the form snippet so new leads carry it.
Updated
Required columns
Upload the file in Client › Settings › Leads & revenue, under “Upload won deals (CSV from any CRM)”. The first row must be a header. Header names are matched exactly, ignoring case and extra spaces, against these lists:
| Column | Accepted header names | Example value |
|---|---|---|
| Date | date, closed, close date, closed date, won date, date won, closed at, created, created at, date created, job date, invoice date | 2026-10-14 |
| Amount | amount, value, revenue, total, deal value, deal amount, invoice total, job total, price | $4,200.00 |
| Landing page | landing page, landing_page, landing, landing url, page, page url, url, first page, entry page, source url | /services/gutter-repair |
| Status | status, stage, deal stage, outcome | won |
Optional columns
| Column | Accepted header names | What it does |
|---|---|---|
| Source | source, lead source, channel, medium, utm_medium, utm source, utm_source | Deals whose source names ads, social, a directory or the Business Profile are left out of search revenue. A blank source is counted and flagged. |
| Deal ID | id, deal id, deal_id, external id, external_id, lead id, job id, invoice, invoice number, number | Re-uploads update the deal with the same ID. |
| Phone | phone, phone number, customer phone, mobile | Matches the deal to a call or form lead. Stored only as a salted hash. |
email, email address, customer email | Same as phone. Phone is used when both are present. |
No status column?
Tick “My file has no status column; every row is a won deal” before importing. Every row then counts as won. Without the tick, a file with no status column is rejected with a message asking you to add one or confirm.
Values it understands
| Value | Read correctly | Rejected |
|---|---|---|
| Date | 2026-10-14, 10/14/2026, 10/14/26, Oct 14, 2026 | Blank or unreadable dates |
| Amount | 4200, 4200.00, $4,200.00 | Negative amounts, including (100) in brackets; anything over $10,000,000, read as a typo |
| Status: won | won, paid, complete, completed, sold, approved, invoiced, closed, closed won | |
| Status: open (pipeline) | open, new, quoted, pending, sent, estimate, scheduled, in progress, proposal, follow up | |
| Status: lost (ignored) | lost, declined, canceled, cancelled, dead, no sale, not sold, rejected, refunded, void, unqualified, disqualified, no show | Blank or unknown statuses |
Errors
Problems are reported per row, counting the header as row 1. Rows with errors are skipped and the rest import. For example:
Row 7: couldn't read the amount "TBD". Row 9: unknown or empty status "". Use won, open or lost.
A missing required column stops the import and names the column, with an example header. When the import runs, the page confirms: “Imported N new and updated M existing deals.”
Re-uploads
- Rows with a deal ID update the deal with that ID, so a status change from open to won lands on the same deal.
- Rows without an ID get a stable ID built from the date, landing page, amount and source. The same export uploaded twice doesn't double count.
- Two identical rows inside one file both count, as two real jobs on the same day for the same amount would.
Deals with a blank landing page import, but show as unmatched in the report. The form snippet puts the landing page on new leads so the CRM can export it.
Sample file
Three won deals for the fictional Copperline Gutters. Copy it into a file named won-deals-sample.csv to try an import.
deal id,close date,amount,landing page,status,source D-1042,2026-10-01,4200,https://copperlinegutters.example/,won,organic D-1051,2026-10-02,850,https://copperlinegutters.example/services/gutter-repair,won,organic D-1057,2026-10-03,340,https://copperlinegutters.example/blog/gutter-cleaning-fairview-cost,won,organic
Prefer to send deals as they close? Use the revenue webhook. How the amounts are split across searches: How revenue is allocated.
Something missing or out of date? Email hello@rankupside.com.
Questions.
Do I have to rename my CRM's columns?
What if the landing page is a path, not a full URL?
Can I include open and lost deals?
Related
- DocsWebhooksThe revenue and leads webhooks: URLs, the bearer site key, JSON fields for deals, CallRail, WhatConverts and generic leads, batch limits and responses.
- DocsForm snippetOne script tag adds landing_page and lead_source hidden fields to every form on a client's site, so won deals can be tied back to the pages and searches.
- DocsHow revenue is allocatedThe exact rule: won deal to landing page, split across that page's searches by click share, hidden searches on their own line, and what's left out.
- IntegrationCSV importUpload a CSV of won deals from any CRM. RankUpside reads date, amount, landing page and status, matches each deal to its page and adds a revenue line.