Skip to main content

Importing Components from CSV

When you have a take-off or vendor quote already in spreadsheet form, you can bulk-import components into an estimate area instead of typing each row individually.

This feature is available when your company is using Detailed Estimating. It is not available on assembly-only estimates, and the menu option is disabled once an estimate is sold.

To import components

  1. Open the estimate you want to add to.
  2. Click the More menu (the three-dot button in the estimate header).
  3. Select Import from CSV.
  4. In the Import Estimate from CSV dialog:
    • Click Download Template to get a starter CSV with the correct column headers and an example row.
    • Choose the Target Area the imported rows should be added to. (Areas must already exist on the estimate — create them first if needed.)
    • Click Select CSV and pick your file (.csv only, up to 100 MB).
  5. The dialog parses your file and shows a preview table (first 200 rows).
  6. Review any errors highlighted in the preview, fix them in your file, and re-select it.
  7. When the file is error-free, click Upload.

The import runs in the background. You'll receive an email summarizing how many rows were imported, how many matched the component database, how many became custom entries, and any rows that failed.

How Matching Works

For each row, Readybuild looks for an existing component in your component database with the same name, size, color, and options (case-insensitive). If a match is found, the row is added as a component entry linked to that database record — this is a matched row. If no match is found, the row is added as a custom entry and shows the Custom badge in the estimate.

Matched and custom rows have different column requirements: a matched row inherits most defaults from the linked database component, so only name is required; a custom row has to supply everything needed to build a usable entry.

CSV Columns

name is the only column required for every row. The other "Required for custom" columns only need to be populated on rows that don't match a database component. Columns can appear in any order; the importer accepts a few aliases per column (e.g. qty for quantity, unit cost for unit_cost, mark up / markup for mark_up).

ColumnRequiredDescription
nameAlwaysComponent name. Used (with size, color, options) to find a database match.
sizeNoPart of the match key.
colorNoPart of the match key.
optionsNoPart of the match key. Alias: option_name.
quantityRequired for customNumeric quantity. Alias: qty.
unit_costRequired for customPer-unit cost. If supplied on a matched row, overrides the database component's price. Alias: unit cost.
mark_upNoMarkup percentage. Aliases: markup, mark up.
unitNoUnit of measure (e.g. EA, SF, LF). Resolved against your unit list.
categoryRequired for custom (unless cost_code supplied)Estimate category name. Must match an existing category on this estimate's type. If omitted, the importer falls back to the category associated with the cost_code.
cost_codeRequired for customEither the cost code number (e.g. 1000, EST-001) or its name (e.g. General Labor). The importer resolves against the number first and falls back to the name, so using the number is recommended when two codes share similar names. Aliases: costcode, cost code.
typeRequired for customOne of Material, Labor, Subcontractor, Equipment.
subcontractor_typeNoSubcontractorMaterial, SubcontractorLabor, or SubcontractorLaborAndMaterial. Alias: subcontractor type.
actionRequired for custom+ or Install for installs, - / Demo / Demolition for removals.
taxNoTax percentage.
allowanceNoyes/no/true/false/1/0/y/n.
po_requiredNoSame boolean values as allowance. Alias: po required.
notesNoFree-text notes (custom rows only).

Price behavior

  • unit_cost supplied → that price is used, regardless of whether the row matched.
  • unit_cost blank on a matched row → the database component's price is used.
  • unit_cost blank on a custom row → the price defaults to $0.

Fixing Import Errors

The preview screen flags problems before you upload, including:

  • Missing name column in the CSV header row.
  • Empty name on any row.
  • Non-numeric quantity, unit_cost, mark_up, or tax.
  • category that does not match an existing estimate category.
  • unit, cost_code, type, action, subcontractor_type, allowance, or po_required values that cannot be resolved.
  • Missing required fields on custom (unmatched) rows: quantity, unit_cost, cost_code, type, action, and category (unless cost_code provides one).

Upload is blocked until every row is error-free. Fix the issues in your spreadsheet, save it as CSV, and select the file again.