Skip to content

How it works

Four steps from the month’s sales to a file you upload.

The product does the first three. The fourth is yours, and stays yours: you sign in to the Sales Reporting Portal, upload the file, and certify the data.

Step one

Import the month

Two lanes, and neither is the fallback.

QuickBooks Online

Connect the company once and pull invoices and sales receipts for a date range. The connection refreshes itself; you are not re-authorising every month. Lines arrive with their description, quantity, unit price and total already on them.

QuickBooks records payments against whole invoices rather than lines, so the QBO pull reports on invoice date. A holder reporting on payment date uses the CSV lane.

CSV

Drop an export from any accounting package, ERP, or spreadsheet. You map its columns to the fields once and the mapping is remembered against that source, so next month’s export from the same system needs no mapping at all.

Same column mapping, same dry-run preview, same validator, same file at the end. Nothing about the CSV lane is smaller than the QuickBooks lane.

Either way, the import shows you what it read before it keeps anything: the rows it found, the ones it could not parse, and what each column was taken to mean. No imported value reaches a generated file until you confirm it in review.

Step two

Map each item once

This is the work, and it is the work that does not come back.

An accounting export carries a description, a quantity and a price. It does not carry the SIN the item was awarded under, SRP’s unit-of-measure abbreviation, or a manufacturer part number — and those are what a MAS line needs. So each item in your catalog gets mapped once: SIN, unit of measure, manufacturer name, part number, and where they apply a UPC, a UCID, and a cloud service type.

Where a suggestion can be made you get one, with its reasoning and its confidence, and you accept, edit or reject it. Where no key is configured you get manual assignment with search over the same reference tables. Either way the decision is yours, it is stored against the item, and it is versioned — a correction is a new version, never a rewrite of what a past month was built from.

What a mapping holds

  • SIN — the special item number the sale is reported under
  • Unit of measure — SRP’s abbreviation, matched exactly
  • Manufacturer name and part number, on product lines
  • UPC, where the item carries one
  • UCID and cloud service type, on cloud lines

That is the whole list. Anything a mapping does not hold, the file does not carry, and the wizard never asks you for it.

Step three

Validate before anything leaves

56 rules run over every line. Each one names the field it is about and carries the section of the file specification or the User Guide it was read from — a rule with no citation does not ship.

A failing line is not marked “invalid” and it is not marked with a verdict about you. It names the column, states what SRP does with that value, and shows the message SRP would have shown — so the fix is obvious now rather than a week after an upload came back.

Findings come in two weights. 41 rules stop the file: leave one unfixed and SRP will not take the month. 15 are advisory — the file uploads as it stands, and the field is still worth a look.

Validation is never metered. A holder on the smallest plan gets every rule the largest plan gets, because the rules are the product and safety is not a tier.

SampleHarlan Office Interiors (Demo) · 47QSHA22D0031 · July 2026

Validation

3 will be rejected1 warning40 rows
Produced by this product’s emitter and validator over its committed fixture month. Every figure is fixture data.

Step four

Download it, then upload it yourself

One file per contract per month, pipe-delimited, under a name that says which contract and which period it is.

The emitter is string work: values joined by pipes, UTF-8, no spreadsheet library and no browser anywhere near it. Two things it changes it tells you about — a pipe character typed inside a description would shift every column after it, and a line break inside a value would split one line item across two broken rows, so both are made safe and both are reported on the review screen before you download.

Then you sign in to SRP, upload the file, and certify the data is true and accurate. That certification is a statement about your own sales and it is yours to make; nothing here writes it, drafts it, or makes it on your behalf.

Before you subscribe the file still generates, carrying a DRAFT — NOT FOR UPLOAD line that SRP itself would refuse — so a draft cannot be uploaded by accident.

The file

Sample

47QSHA22D0031_2026-07_TDR.csv

40 lines of sales data6,897 bytesJuly 2026

The emitter reported 2 substitutions on this month, both on the same description — a pipe character and a line break that a bookkeeper typed into their accounting package.

Download the sample file — fixture data, produced by this emitter.

The file

What the file needs

9 columns SRP rejects a line for leaving empty, and 9 that may be blank. Both lists render from the same rule data the validator runs on, so this page cannot disagree with the product.

Required — 9 columns

  • 1Contract/BPA Number
  • 2Order Number/PIID
  • 3Description of Deliverable
  • 6Unit Measure
  • 7Quantity of Item Sold
  • 9SIN Number
  • 10Price Paid per Unit (US$)
  • 11Total Price (US$)
  • 12Non-Federal Entity

Optional — 9 columns

  • 4Manufacturer Name
  • 5Manufacturer Part Number
  • 8Universal Product Code
  • 13Federal Customer
  • 14Order Date
  • 15Ship Date
  • 16Zip Code Shipped To
  • 17UCID
  • 18Cloud Service Type

“Optional” is the file specification’s word, not advice. Some of these columns are starred on GSA’s own spreadsheet template, and the validator says so where they are — as an advisory finding, because the file uploads without them.

The rules

What is checked, by column

One line per rule, in our words, with the section it came from. The rejection messages themselves live in the product, beside the line that triggered them.

Contract/BPA Number

  • Contract/BPA Number must have a value on every line.

    ICD §2.6 Scenario 6; ICD §2.3 field table (MAS), col 1

    Stops the file
  • Contract/BPA Number is at most 16 characters.

    ICD §2.3 field table (MAS), col 1

    Stops the file
  • The contract number must be one on the holder’s SRP account.

    ICD §2.6 Scenario 4

    Stops the file
  • Contract numbers go in without dashes: 47Q-SHA-22D0031 is 47QSHA22D0031.

    ICD §2.3 field table (MAS), col 1 — "No Dashes required"

    Advisory
  • MAS contract numbers begin with GS or 47.

    UG Table 4.1 (Contract or BPA Number)

    Advisory

Order Number/PIID

  • Order Number/PIID must have a value on every line.

    ICD §2.6 Scenario 6; ICD §2.3 field table (MAS), col 2

    Stops the file
  • Order Number/PIID is at most 130 characters.

    ICD §2.3 field table (MAS), col 2

    Stops the file
  • The order number is the agency’s PIID, not the contract number again.

    UG Table 4.1 (Order Number/PIID) — "Do not enter your MAS Contract or BPA number"

    Advisory

Description of Deliverable

  • Description of Deliverable must have a value on every line.

    ICD §2.6 Scenario 6; ICD §2.3 field table (MAS), col 3

    Stops the file
  • Description of Deliverable is at most 1000 characters.

    ICD §2.3 field table (MAS), col 3

    Stops the file
  • A pipe character inside a description breaks the row into the wrong columns.

    ICD §2.2 (pipe delimiter); §2.4 sample file

    Stops the file

Manufacturer Name

  • Manufacturer Name is at most 125 characters.

    ICD §2.3 field table (MAS), col 4

    Stops the file

Manufacturer Part Number

  • Manufacturer Part Number is at most 125 characters.

    ICD §2.3 field table (MAS), col 5

    Stops the file
  • A product line carries both a manufacturer name and a part number, or neither.

    UG Table 4.1 (Data Fields specific to Products)

    Advisory

Unit Measure

  • Unit Measure must have a value on every line.

    ICD §2.6 Scenario 6; ICD §2.3 field table (MAS) + §2.12

    Stops the file
  • Unit Measure must be one of SRP’s published abbreviations, matched exactly.

    ICD §2.12; FAS SRP User Guide MAS Tables, Table 1 (public)

    Stops the file
  • A discount line needs a sales line on the same order number in the same file.

    ICD §2.6 Scenario 7; §2.3.2

    Stops the file

Quantity of Item Sold

  • Quantity of Item Sold must have a value on every line.

    ICD §2.6 Scenario 6; ICD §2.3 field table (MAS), Quantity of Item Sold

    Stops the file
  • Quantity is a plain number — no currency symbol, no thousands separator.

    ICD §2.3 field table (MAS), Quantity of Item Sold

    Stops the file
  • Quantity carries at most 4 decimal places.

    ICD §2.3 field table (MAS) — four decimal places

    Stops the file
  • Sales quantities are positive; return and discount quantities are negative.

    ICD §2.3.1 step 3 (returns); §2.3.2 step 3 (discounts)

    Stops the file

Universal Product Code

  • Universal Product Code is at most 14 characters.

    ICD §2.3 field table (MAS), UPC

    Stops the file
  • A UPC is digits only; it is optional, and blank is better than wrong.

    UG Table 4.1 (Universal Product Code) — a 12-digit barcode

    Advisory

SIN Number

  • SIN Number must have a value on every line.

    ICD §2.6 Scenario 6; ICD §2.3 field table (MAS), SIN Number

    Stops the file
  • SIN Number is at most 15 characters.

    ICD §2.3 field table (MAS), SIN Number

    Stops the file
  • The SIN should be one awarded on the contract the sale is reported under.

    UG Table 4.1 (SIN)

    Advisory

Price Paid per Unit (US$)

  • Price Paid per Unit (US$) must have a value on every line.

    ICD §2.6 Scenario 6; ICD §2.3 field table (MAS), Price Paid per Unit

    Stops the file
  • Price Paid per Unit (US$) is a plain dollar value — no "$", no thousands comma.

    ICD §2.3 field table (MAS), Price Paid per Unit

    Stops the file
  • Price Paid per Unit (US$) holds up to 8 digits before the decimal point and 4 after it.

    ICD §2.3 field table (MAS), Price Paid per Unit — 0.00 to 99999999.9999

    Stops the file
  • Price Paid per Unit is positive on every line, including returns and discounts.

    ICD §2.3.1 step 4 (returns); §2.3.2 step 4 (discounts)

    Stops the file

Total Price (US$)

  • Total Price (US$) must have a value on every line.

    ICD §2.6 Scenario 6; ICD §2.3 field table (MAS), Total Price Paid

    Stops the file
  • Total Price (US$) is a plain dollar value — no "$", no thousands comma.

    ICD §2.3 field table (MAS), Total Price Paid

    Stops the file
  • Total Price (US$) holds up to 8 digits before the decimal point and 4 after it.

    ICD §2.3 field table (MAS), Total Price Paid — 0.00 to 99999999.9999

    Stops the file
  • Total Price is negative on a return or discount line and positive on a sale.

    ICD §2.3.1 step 5 (returns); §2.3.2 step 5 (discounts)

    Stops the file
  • Total Price must equal Quantity of Item Sold × Price Paid per Unit.

    ICD §2.6 Scenario 3; §2.3 field table (MAS), Total Price Paid

    Stops the file

Non-Federal Entity

  • Non-Federal Entity must have a value on every line.

    ICD §2.6 Scenario 6; ICD §2.7

    Stops the file
  • Non-Federal Entity is one of SCP, SDP, OTH, N/A.

    ICD §2.7

    Stops the file

Federal Customer

  • Federal Customer is the two-digit Treasury Agency Code that funded the order.

    UG Table 4.1 (Federal Customer); SRP MAS Tables, Table 3 (public)

    Advisory
  • Federal Customer stays blank when Non-Federal Entity names the customer.

    UG Table 4.1 (Federal Customer) — blank when the customer is non-federal

    Advisory

Order Date

  • Order Date is written MM/DD/YYYY when it is present.

    ICD §2.3 field table (MAS), Order Date — "Enter Date MM/DD/YYYY"

    Stops the file
  • GSA’s spreadsheet template stars Order Date even though the file spec does not.

    Excel Upload Template v4.2 header (starred); UG §2.3.2 trial period

    Advisory

Ship Date

  • Ship Date is written MM/DD/YYYY when it is present.

    ICD §2.3 field table (MAS), Ship Date — "Enter Date MM/DD/YYYY"

    Stops the file
  • A ship date before the order date is usually a transposed pair.

    UG Table 4.1 (Order Date, Ship Date)

    Advisory

Zip Code Shipped To

  • The ship-to ZIP is five digits.

    UG Table 4.1 (Zip Code Shipped To) — five digits

    Advisory

UCID

  • UCID is at most 100 characters.

    ICD §2.3 field table (MAS), UCID

    Stops the file

Cloud Service Type

  • Cloud Service Type is one of LCAT, IaaS, PaaS, SaaS, case-sensitive.

    ICD §2.8

    Stops the file
  • A sale under SIN 518210C must name its cloud service type.

    ICD §2.3 field table (MAS), col 18 — required if SIN starts with 518210C

    Stops the file
  • Cloud Service Type stays blank on sales outside SIN 518210C.

    UG Table 4.1 (Cloud Service Type)

    Advisory

The file and the period

  • The first line is the 18 MAS column names, in order, spelled exactly.

    ICD §2.3 step 3a (MAS header); §2.4 sample file

    Stops the file
  • Every line of sales data has exactly 18 pipe-separated values.

    ICD §2.3 step 3; §2.4 sample file

    Stops the file
  • A line break inside a value splits one line item into two broken rows.

    ICD §2.2, §2.4 (one line per line item)

    Stops the file
  • The org picks invoice date or payment date once and reports on it every month.

    UG §2.2 — "do not switch between payment date and invoice date"

    Advisory
  • Every earlier period on the contract has to be reported before this one.

    ICD §2.6 Scenario 1; UG §2.2

    Stops the file
  • A period that already carries submitted data will not take a second file.

    ICD §2.6 Scenario 5

    Stops the file
  • SRP locks the period while it processes an upload; a second file is rejected.

    ICD §2.6 Scenario 2

    Advisory
  • A month with no sales is reported in SRP’s form, not as an empty file.

    UG §2.2 (Form Entry recommended for zero sales); UG §2.3

    Advisory

GSA — Multiple Award Schedule TDR User Guide (PDF)SRP user manual — data reporting options