Import Discoveries, Feedback and Customers — and the associations between them — from a single Excel file. This is how you bring an existing backlog into Harvestr without losing who said what.
Which import do you need?
Harvestr has four imports. Use this one only if at least one of these applies:
you're importing two or more object types with associations — feedback linked to Discoveries, feedback linked to customers
you're importing Discoveries with tags and/or custom fields
you're importing customers with segments and/or attributes
Otherwise, the simple CSV imports are faster:
If you're importing | Use |
Feedback with title, content and user emails/names — no companies, no labels | |
Discoveries with components, titles, descriptions and states — no tags, no custom fields | |
Customers with company names or user emails/names — no segments, no attributes |
Get the template
You must use this Excel template. The import reads it by position, so an edited structure fails.
Keep it as Excel — no CSV, no other format
Don't touch rows 1–2 or column A, and don't rename sheets or headers. Fill from row 2, column B, on each sheet — overwrite the sample data
Never leave an attribute value empty (
ARR:). The whole import fails
Limits per import
Discoveries | 1,000 |
Customers | 30,000 |
Feedback | 10,000 |
Attributes (labels, segments…) | 1,500 attributes, unlimited values |
Need more? Get in touch and we'll sort it out.
How the file is structured
Three sheets
One sheet each for Feedback, Discoveries and Customers. One row = one record, one column = one property.
Fill one sheet, two, or all three — whatever your import needs.
IDs
Every sheet has an ID column that must be filled for each row. Use an incrementing number or a random unique string.
These IDs exist only for the import — they're how rows reference each other, and they're never stored in Harvestr.
They must be unique within a sheet, but not across sheets.
Associations
Associations are declared on the Feedback sheet only:
Column D — the Discovery ID(s) this feedback belongs to
Column E — the Customer ID who gave it
Importing customers
Users, companies, or users with their companies.
Users
Required: id · user name or email (or both) · type = user
The unique identifier for a user is the email — it must be unique in the file. The id column is import-only and is never used to identify the user in Harvestr.
Optional:
company name— links the user to that companyphonedescriptionsegments— comma-separated (enterprise, Europe). Segments that don't exist yet are createdattributes— format[name]: [value], comma-separated (MRR: 499, Plan: Enterprise). Types: boolean (true/false,yes/no,0/1), text, number. Attributes that don't exist yet are created
Importing a user whose email already exists updates that user's fields.
Companies
Required: id · company name · type = company
The unique identifier for a company is its name — it must be unique in the file. As with users, the id column is import-only.
Optional:
domains— comma-separated. Used to auto-assign users to this company by email domaindescriptionsegmentsandattributes— same format and behaviour as for users
Importing a company whose name already exists updates that company's fields.
Users with their company's attributes
Attributes belong to whichever record carries them, so you need two rows on the same sheet:
the user row —
id,user name,company name,email,type: userthe company row —
id,company name,attributes,type: company
The shared company name is what ties them together.
Importing Discoveries
Required:
idtitlecomponent— slash-separated for hierarchy (Master component / Sub-component 1 / Sub-component 2). Components that don't exist are created
Optional:
tags— comma-separateddescription— accepts HTMLstatus— the Discovery state. Falls back to your default state if emptyassignee email— the Harvestr teammate to set as owner. Ignored if it matches no teammatecreate date— ISO-8601fields— comma-separatedkey: valuefor custom field values and scores (ease: 3, impact: 4)The fields must already exist in your project. The import never creates a new Discovery field
Values must match the field's type in Harvestr — numeric, string, or boolean (
true/false,yes/no,0/1)Empty values fail the import
Dates must be ISO-8601:
2022-05-08 (day) · 2022-05-08T15:10 (minute) · 2022-05-08T15:10:10 (second) · 2015-06-10T10:40:38.974 (millisecond)
With the Z modifier: 2022-05-08T15:10Z · 2022-05-08T15:10:10Z · 2015-06-10T10:40:38.974Z
Any other format silently falls back to the default value.
Worked example
A Discovery "PayPal login" under Payment systems / PayPal, state In progress, tags payment, PayPal, impact 5.
Which lands in Harvestr as:
And creates the component tree if it didn't exist:
Imports create, they don't update. Importing a Discovery whose title already exists creates a duplicate rather than updating the original. Run a test import on a handful of rows before committing the full file.
Importing feedback
Required:
idcontent— the body. HTML and markdown both accepted
Optional:
titlecount as— a whole number (0 or more) setting how much this item weighs in the Discovery's feedback count. Use it when one imported row stands for several real requestsdiscovery id— comma-separated IDs from the Discoveries sheetcustomer id— the ID from the Customers sheet; this is the requesterlabels— comma-separated (high priority, financial)assignee email— ignored if it matches no teammatecreate date— ISO-8601 (see the format box above)source url— where the feedback originally came from
Linking feedback as you import it
Below, one feedback item is attached to customer 2 (John Doe) and categorized into two Discoveries, 1 ("PayPal login") and 2 ("Generate bitcoin wallets").
As with Discoveries, feedback is never updated by an import — a matching title or content produces a duplicate.







