T3 Reports
- T3 Reports
- Opening T3 Reports
- T3 Free and T3+
- Authentication
- Secret key or temporary key
- Generating a secret key
- Choosing What to Build
- Report categories
- Starting from an existing report URL
- Starting from a saved report
- Configuring the Report
- Report type and licenses
- Format
- Includes
- Row layout
- Delivery
- Report columns
- Column headers
- Sort
- Filter
- Options
- The Output Pane
- The report URL
- Actions
- Data preview
- Extra Columns Found in Your Data
- Saving a Report
- Scan Sheets
- What Carries Over Between Sessions
- Limits
- Next Steps
T3 Reports¶
T3 Reports is the report builder in the T3 Chrome Extension. It exports Metrc data as CSV, JSON, Excel, or Google Sheets — either as a one-time snapshot or as a live view that a spreadsheet re-fetches on its own.
The builder assembles a T3 API report URL, shows you a preview of the data it returns, and then hands you that URL. The URL is the product. You can open it, download it, email it, turn it into a Google Sheet, or paste it into a spreadsheet's =IMPORTDATA() formula so the sheet keeps itself up to date. See Spreadsheet Sync.
Every setting in the builder corresponds to one query parameter on that URL. Nothing the builder does is unavailable to a script, and nothing a script can do to a report URL will confuse the builder — you can paste a URL you wrote by hand straight back into it.
Opening T3 Reports¶
Open the T3 floating button menu in the bottom right of Metrc and choose T3 Reports.
The header links to a video walkthrough, to the T3 API Reports reference, and to Exports (Legacy) — the older export tool documented under Exports (Legacy).
T3 Free and T3+¶
T3 Reports is a T3+ feature. T3 Free users can open the builder and see how it works, but access to the reports themselves is limited. Full access comes with a T3+ subscription.
Authentication¶
A report URL carries its own credential. This is not a shortcut — a browser following a link, and a spreadsheet calling IMPORTDATA, have no way to send an Authorization header, so the credential has to live in the URL.
Secret key or temporary key¶
The Authentication card offers two modes:
| Mode | What it is | When to use it |
|---|---|---|
| Secret key | A long-lived key generated once from your Metrc credentials and saved to your account | Anything you intend to keep — a saved report, a spreadsheet formula, a scheduled pull |
| Temporary key | The extension's current short-lived session token | Trying something out. No setup, but the URL stops working when the token expires |
The builder shows which key is active by its last four characters and validates it in the background, so you find out that a key is wrong while you are building rather than when the report fails.
Choosing the temporary key adds a standing warning under the generated URL. A temporary link is fine for a one-off download and useless in a spreadsheet.
A report URL contains your credential
Anyone holding the URL can read the Metrc data it returns. The builder masks the key in the URL breakdown by default and lets you reveal it deliberately. Do not paste a report URL into a shared document, a ticket, or a screenshot.
Generating a secret key¶
If you have no key yet, the builder offers to generate one. Your hostname and username are filled in from your current Metrc session and cannot be edited — a key belongs to the account you are signed in as.
Two states need one extra field:
| State | Extra field | Notes |
|---|---|---|
| Colorado | Metrc login email | The email tied to your Metrc login |
| Michigan | Multi-factor authentication key | The key, not a 6-digit code |
Michigan: the key is not the code
Metrc's MFA setup shows both a QR code and a manual-entry key. T3 needs the key — the long string you would type into an authenticator app — because it generates the 6-digit codes itself. If you paste something that starts with six digits, the form tells you so.
Getting the key means resetting MFA in Metrc, and a reset key has to be activated by logging into Metrc with it once before T3 can use it. The generate form walks through those steps.
Keys can also be generated and managed outside the builder — see Authentication and the secret key page.
Choosing What to Build¶
Report categories¶
Reports are grouped into four categories:
| Category | What it produces | Trade-off |
|---|---|---|
| Manifest Reports | Transfer manifests with their packages and transporters | The widest rows. See transfer manifest reports |
| Collection Reports | Plain lists of Metrc records — packages, items, plants, harvests | The largest maximum size |
| Supercollection Reports | Records with related data attached — packages with lab results, harvests with source plants, items with ingredients | More detail, smaller maximum size. See Super Reports |
| Scan Sheets | Manifest packages laid out for barcode scanning | Google Sheets and Excel only. See Scan Sheets |
A category with no endpoints available to you is shown as Coming soon rather than hidden, so the set of categories does not change shape between accounts.
The builder remembers the last category you used and the last report you chose within each category, so returning to a category puts you back where you left it.
Starting from an existing report URL¶
Paste a T3 report URL into the Edit an existing report URL box and the builder reopens with every setting filled in from it — report path, licenses, format, includes, row layout, columns, header overrides, filters, sort, row limit, delivery, and email.
An entire spreadsheet formula works too. This is valid input:
=IMPORTDATA("https://api.trackandtrace.tools/v2/packages/active/report?licenseNumber=LIC-00001&contentType=csv&prependCsvMetadata=false")
If anything in the URL could not be applied exactly — a column that no longer exists, a format that does not support an option you asked for — the builder loads what it can and tells you what it changed.
This is the fastest way to modify a report that is already running in a spreadsheet: paste the formula, change what you need, and copy the new formula back.
Starting from a saved report¶
Your saved reports are listed with their names and descriptions and can be searched. Clicking one loads it into the builder, exactly as if you had pasted its URL.
Rows can be renamed or deleted in place. See Saving a Report.
Configuring the Report¶
The builder is two columns: configuration on the left, output on the right. The output column updates as you type, so the URL and the preview always describe the form as it currently stands.
Cards appear in the left column in the order below. Several are conditional — a control a format cannot express is hidden rather than shown and ignored. JSON returns the whole record, so it has no columns to pick and no rows to collapse, and neither card appears.
Report type and licenses¶
Pick the endpoint from the Report Type dropdown. Super variants are named as such, and a View schema link opens the record's field list.
Licenses is a searchable multi-select with None, Current and All shortcuts. A report may span at most 20 licenses, and the counter turns red when you go over.
Rows come back grouped in the order the licenses were selected, and the caps are totals rather than per-license allowances. See Reporting Across Multiple Licenses.
Format¶
Four formats, each mapping to contentType:
| Format | Best for | Includes | Column picker | Row layout | Metadata preamble |
|---|---|---|---|---|---|
| CSV | Spreadsheets and =IMPORTDATA | One | Yes | Yes | Yes |
| JSON | Scripts and integrations | Unlimited | No | No | No |
| XLSX | Opening in Excel directly | One | Yes | Yes | Yes |
| Google Sheets | A sheet you intend to share or edit | One | Yes | Yes | Yes |
Includes¶
Super reports only. Each include attaches related Metrc data — lab results, history, source harvests — to every record.
- JSON accepts as many includes as the request budget allows, so the card is a set of checkboxes.
- CSV, XLSX and Google Sheets accept exactly one, so the card becomes a radio group. This is a property of a flat grid, not a restriction T3 chose; see One include in tabular formats, many in JSON.
Selecting an include also adds the report's default metadata columns, which are the summarized form of the included data.
Includes cost one Metrc request per record, which is why super reports have a much lower row cap. See Limits.
Row layout¶
Super reports in a tabular format only. This card answers the question "what is one row of this report?", and it is the setting people most often get wrong.
| Option | One row is | Use it when |
|---|---|---|
| Expanded (the default) | One included record — one lab result, one history entry | You want the included records themselves |
| Collapsed | One top-level record — one package | You wanted the packages, with their results summarized |
The difference matters more than it sounds. Ask for lab results on 500 packages in expanded mode and you get one row per analyte per test, with the package columns repeated down each block — easily tens of thousands of rows. Collapsed mode gives you 500 rows.
Collapsed mode also keeps records whose include came back empty. In expanded mode a package with no lab results is simply absent from the output, with nothing to indicate it was skipped.
The card appears whenever the endpoint offers includes and stays disabled until you select one, so it does not appear and vanish as you experiment.
Switching to collapsed drops any column that came from the include, and the builder names the ones it removed. There is no single lab result on a collapsed row, so labResults.testTypeName has nothing to point at — use the metadata. columns instead, which are already summarized one per record. See One row per record, or one row per included record.
Delivery¶
Two options, and the right choice is mostly about size:
| Delivery | What happens |
|---|---|
| Inline | The report is generated while you wait. Subject to the 240-second request limit |
| A background worker generates the report and emails it to you. No time limit |
For Google Sheets the same two options read as Open now (creates the sheet and opens it in a new tab) and Email link (a worker builds the sheet and emails you the link).
The Email field appears when it applies, and what it means depends on the delivery:
- With email delivery it is required — it is where the report goes, and where any error is reported.
- With Google Sheets opened inline it is optional. Filling it in shares the new sheet with that Google account; leaving it blank creates an unshared sheet.
Email delivery is the only way to retrieve a report that takes longer than 240 seconds. See Emailing a Report.
Report columns¶
Tabular formats only. Leave it on Default fields to get the report's standard columns, or switch to Custom fields to choose your own.
The custom picker has three parts, all bound to the same selection:
- Available fields — a filterable checkbox list of every column on the record, plus any extra columns found in your data.
- Selected — your chosen columns as a draggable list. The order here is the column order in the output.
- Fieldnames — a comma-separated text box mirroring the other two. Type into it and the checkboxes follow; click a checkbox and the text updates. Paste a column list from a colleague here.
Bulk buttons reset the selection to the report's defaults, to everything, or to nothing.
Two things the picker will tell you about:
- Past roughly 16 columns you get a soft warning. Nothing breaks, but wide reports get unwieldy fast.
- Columns blocked by collapsed row layout are shown but not selectable, so you can see why a column you expected is unavailable.
Column names map directly to columns.
Column headers¶
Tabular formats only. By default each column gets a title-cased header derived from its name. Switch to Custom names to override any of them; a blank override keeps the default.
This renames the header row only — the columns and their data are unchanged. It is for matching an existing spreadsheet's headers so a downstream formula keeps working.
Headers cannot contain a comma
The override list is comma-delimited with no escape syntax, so a comma inside a header would split it into two. The builder rejects it rather than producing a misaligned file.
See Renaming the Column Headers.
Sort¶
Off by default. Turn it on to choose a field and a direction. The field list is limited to the columns the endpoint can actually sort on.
Sorting applies within each license, not across them — see Reporting Across Multiple Licenses.
Filter¶
Off by default. Each filter row is a field, an operator, and a value. Add as many as you need; once there are two or more, an AND / OR toggle decides how they combine.
The operators, and the values they produce in the URL:
| Operator | URL value |
|---|---|
| equals | eq |
| not equals | neq |
| contains | contains |
| does not contain | doesnotcontain |
| starts with | startswith |
| ends with | endswith |
| less than | lt |
| less than or equal | lte |
| greater than | gt |
| greater than or equal | gte |
A filter row becomes one filter parameter, spelled field__operator:value:
https://api.trackandtrace.tools/v2/packages/active/report?licenseNumber=LIC-00001&filter=locationName__eq:Bulk Storage&filterLogic=and&contentType=csv
Filtering is usually the best way to bring an oversized report back under its limits, and it gives you a more useful report besides. See Report Request Too Large.
Options¶
| Option | What it does |
|---|---|
| Row limit | Caps how many records the report returns. Excellent for testing a wide report before running it for real |
| Prepend report metadata | On by default. Adds a header block describing the report to CSV, XLSX and Google Sheets output. Turn it off when the output feeds a formula that expects column headers on row 1 — see The Metadata Preamble |
| Open in browser instead of downloading | Renders the report in the tab instead of saving a file. For troubleshooting only — a large report can hang the tab it renders into. See Downloading vs. Rendering |
The Output Pane¶
The report URL¶
The URL is always visible, and it is shown broken apart rather than as one long string: the origin, the path, and then one row per query parameter with a short description of what that parameter does.
Parameters that are invalid or missing are highlighted, so an incomplete report tells you which piece it is waiting for rather than silently producing a URL that does not work. The secretKey parameter is masked until you choose to reveal it.
A finished report URL looks like this:
https://api.trackandtrace.tools/v2/packages/active/super/report?secretKey=YOUR_SECRET_KEY&licenseNumber=LIC-00001&include=labResults&rowMode=collapsed&columns=label,item.name,metadata.indexedLabResults.Total_THC.value&contentType=csv&prependCsvMetadata=false
Every part of it came from a control in the left column.
Actions¶
| Action | What it does |
|---|---|
| Generate Report | Runs the report now and downloads it. Reads Create & open sheet for Google Sheets, and is replaced by a send panel when delivery is set to email |
| Save report | Saves the current settings under a name. See Saving a Report |
| Copy report URL | Copies the full URL, secret key included |
| Copy report URL w/ IMPORTDATA | Copies the URL already wrapped in =IMPORTDATA("…"), ready to paste into a Google Sheets cell |
Data preview¶
The preview fetches up to 5 rows and is available for every format, so you can check the shape of a report before running it in full.
Two details worth knowing:
- XLSX and Google Sheets are previewed as CSV. All three contain the same rows, and a preview should never create a real Google Sheet.
- The preview tells you when it is stale. Change any setting after fetching and it marks itself out of date rather than showing you results from a configuration you have since edited.
Extra Columns Found in Your Data¶
Some real columns cannot be known ahead of time. metadata.indexedLabResults is keyed by the names of the analytes on your packages' lab results, so its columns depend on your data, your lab, and your state.
To find them, the column picker samples 20 rows of your own data and flattens the result. Columns discovered this way are marked, and the picker tells you how many it found.
Three things follow:
- Discovery only ever adds. The standard column list is available immediately and nothing is removed while sampling runs. If sampling fails, you get the standard list and a retry link.
- Results are cached for the session only, per report and license and include combination. Analyte names are specific to a license and a point in time, so they are never persisted.
- Discovered columns are real columns. They work in a saved report and in a spreadsheet formula exactly like any other.
This is what makes a report like "every active package with its Total THC" buildable from the picker instead of by hand.
Saving a Report¶
A saved report stores settings, not a credential. The secret key is stripped before the URL is stored, and the stored URL has no origin on it.
That has a useful consequence: a saved report keeps working when you rotate or revoke a secret key, because the key was never part of it. Saved reports belong to your Metrc account, so anyone signing in as the same username sees the same list.
To save one, use Save report and give it a name and an optional description. The panel opens inline beneath the URL so you can still see what you are saving.
Once a saved report is loaded, the button becomes Update, with Save as new and Rename alongside it. Rename changes only the name and description.
Update cannot overwrite the wrong report
The link between the builder and a loaded saved report is deliberately forgotten when you close Metrc. Reopening the builder gives you a fresh form and a Save report button, so Update can never write a default form over a real saved report.
| Limit | Value |
|---|---|
| Saved reports per account | 100 |
| Name | 200 characters |
| Description | 2,000 characters |
The same saved reports are available from the API. See Saving a report.
Scan Sheets¶
Scan Sheets is its own builder rather than a report type, so choosing that category replaces the form. A scan sheet is a formatted spreadsheet you scan package tags into, so the text formats do not apply — the only outputs are Google Sheets (recommended) and Excel.
Configure it on the left: transfer type (incoming, outgoing, rejected, or hub), license, authentication, format, and delivery.
The right column lists the active transfers for that license, each showing its manifest number, shipper and recipient, package count, and date. Check the ones you want; Check all and Uncheck all are there for a full day's manifests.
Above the Generate button is a running row budget. A scan sheet is capped at 10,000 packages, counted across every selected manifest — the cap counts packages, not transfers, and the builder blocks the request rather than letting it fail after the wait.
For what to do with the finished sheet — the color codes, the scanner, and how to read a completed sheet — see Scan Sheets.
What Carries Over Between Sessions¶
The builder remembers the settings that describe how you work and forgets the ones that describe a particular report, so reopening it never leaves you with a half-configured form you did not build.
| Remembered | Forgotten |
|---|---|
| Your active secret key, or that you chose the temporary key | Selected licenses |
| The last category you used | Column selection, filters, sort |
| The last report you chose in each category | Row layout |
| Format, delivery, row limit, metadata preamble | Which saved report was loaded |
| Preview data and discovered columns |
The temporary key is remembered as a preference. The token itself is never stored.
Limits¶
| Limit | Value |
|---|---|
| Licenses per report | 20 |
| Rows in a report | 50,000 |
| Rows in a super report | 5,000 |
| Includes in a tabular format | 1 |
| Preview rows | 5 |
| Recommended column count | 16 (a warning, not a limit) |
| Column discovery sample | 20 rows |
| Packages in a scan sheet | 10,000 |
| Saved reports per account | 100 |
| Inline report time limit | 240 seconds |
Row caps, the Metrc request budget, and what to do when you exceed one are covered in Limits and Troubleshooting.
Next Steps¶
- Read T3 API Reports for the parameters behind every control, with worked Python examples
- Keep a report up to date in a spreadsheet with Spreadsheet Sync
- Attach lab results, history or source harvests with Super Reports
- Verify a transfer as it is unloaded with Scan Sheets
- Looking for the older tool? See Exports (Legacy)
- Install the T3 Chrome Extension
- Start your free 30-day T3+ trial