Skip to content
Docs

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:

Required columns and the header names accepted for each
ColumnAccepted header namesExample value
Datedate, closed, close date, closed date, won date, date won, closed at, created, created at, date created, job date, invoice date2026-10-14
Amountamount, value, revenue, total, deal value, deal amount, invoice total, job total, price$4,200.00
Landing pagelanding page, landing_page, landing, landing url, page, page url, url, first page, entry page, source url/services/gutter-repair
Statusstatus, stage, deal stage, outcomewon

Optional columns

Optional columns and their accepted header names
ColumnAccepted header namesWhat it does
Sourcesource, lead source, channel, medium, utm_medium, utm source, utm_sourceDeals 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 IDid, deal id, deal_id, external id, external_id, lead id, job id, invoice, invoice number, numberRe-uploads update the deal with the same ID.
Phonephone, phone number, customer phone, mobileMatches the deal to a call or form lead. Stored only as a salted hash.
Emailemail, email address, customer emailSame 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

How dates, amounts and statuses are read
ValueRead correctlyRejected
Date2026-10-14, 10/14/2026, 10/14/26, Oct 14, 2026Blank or unreadable dates
Amount4200, 4200.00, $4,200.00Negative amounts, including (100) in brackets; anything over $10,000,000, read as a typo
Status: wonwon, 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 showBlank 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
Sample data: a fictional business on a reserved .example domain.

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?
Usually not. RankUpside matches common header names from HubSpot, Jobber and GoHighLevel exports. If a required column isn't recognized, the upload names the missing one and gives an example header.
What if the landing page is a path, not a full URL?
That works. A path like /services/gutter-repair is read against the client's site address.
Can I include open and lost deals?
Yes. Open deals show as pipeline, lost deals are ignored, and only won deals count toward revenue.