{"title":"A METRC transfer template becomes a manifest only when a person dispatches it in METRC Connect: Rhode Island exposes no dispatch endpoint","url":"https://www.seedlink.net/guides/metrc/transfer-template-to-manifest","json":"https://www.seedlink.net/guides/metrc/transfer-template-to-manifest/data.json","question":"How does a METRC transfer template become a manifest?","answer":"The API creates a transfer template with a T-prefixed manifest number, a person dispatches it in the METRC Connect web interface, and METRC then creates a separate outgoing transfer with its own Id, a plain-numeric manifest number, and an OriginatingTemplateId that points back at the template.","environment":"Rhode Island production and sandbox","observed":"2026-09-03","revised":"2026-09-20","published":"2026-09-20","facts":[{"id":"template_create_response","value":"POST /transfers/v2/templates/outgoing returned 200 with {Ids: [N]}; the id in that response was unreliable and a follow-up GET /transfers/v2/templates/outgoing was needed to find the template","observed":"2026-04-24","source":"Rhode Island sandbox, cultivator license, template creation probe in the SeedLink transfers module"},{"id":"template_manifest_number_shape","value":"GET /transfers/v2/templates/outgoing lists templates, each with its own Id and a T-prefixed ManifestNumber such as T-0000000001","observed":"2026-04-24","source":"Rhode Island sandbox, read-only list of outgoing templates"},{"id":"outgoing_transfer_shape","value":"GET /transfers/v2/outgoing lists dispatched transfers, each with its own Id, a plain-numeric ManifestNumber such as 0000000817, and OriginatingTemplateId set to the Id of the template it was dispatched from","observed":"2026-04-24","source":"Rhode Island sandbox, read-only list of outgoing transfers after a dispatch in METRC Connect"},{"id":"dispatch_verbs_refused_april","value":"POST /transfers/v2/outgoing returned 405; POST /transfers/v2/templates/outgoing/{id}/start, /submit and /dispatch, and POST /transfers/v2/{id}/start, returned 404","observed":"2026-04-24","source":"Rhode Island sandbox, dispatch-verb probe"},{"id":"dispatch_verbs_refused_july","value":"POST /transfers/v2/outgoing returned 405 with the message does not support http method 'POST'; /transfers/v2/, /transfers/v2/external/outgoing and /transfers/v2/deliveries returned 404; /transfers/v2/templates/{id}/dispatch, /transfers/v2/templates/{id}/transfer and /transfers/v2/templates/outgoing/{id}/create returned 404","observed":"2026-07-26","source":"Rhode Island sandbox, second dispatch-verb probe"},{"id":"lab_license_external_incoming","value":"POST /transfers/v2/external/incoming from a lab license returned 401","observed":"2026-07-26","source":"Rhode Island sandbox, lab license credential"},{"id":"staged_template_clicks","value":"About 3 clicks in METRC Connect to dispatch a transfer when the template is staged through the API first","observed":"2026-07-26","source":"Rhode Island sandbox, METRC Connect web interface, counted by hand"},{"id":"independent_id_counters_pdf_collision","value":"GET /transfers/v2/manifest/1/pdf returned a pre-seeded demo manifest for an unrelated facility in another state, with no error; template Ids and outgoing-transfer Ids are independent counters","observed":"2026-04-24","source":"Rhode Island sandbox, manifest PDF probe with a template Id passed as the transfer Id"},{"id":"pdf_requires_license_number","value":"GET /transfers/v2/manifest/{id}/pdf without ?licenseNumber= returned 404 with the body No HTTP resource was found that matches the request URI /transfers/v2/manifest/N/pdf.","observed":"2026-04-24","source":"Rhode Island sandbox, manifest PDF probe"},{"id":"pdf_response_shape","value":"The manifest PDF response is JSON: FileContents holding the PDF as base64, ContentType application/octet-stream, FileDownloadName TransferManifestReport-N.pdf","observed":"2026-04-24","source":"Rhode Island sandbox, manifest PDF probe"},{"id":"template_package_fields","value":"A transfer template carries no quantity: per package it holds PackageLabel, WholesalePrice, GrossWeight and GrossUnitOfWeightName only, and the manifest ships whatever the package holds","observed":"2026-09-03","source":"Rhode Island sandbox and production, template payload and outgoing-template reads"},{"id":"dispatched_transfer_read_only","value":"Against a dispatched outgoing transfer, POST /transfers/v2/outgoing returned 405, PUT /transfers/v2/outgoing returned 405 and PUT /transfers/v2/outgoing/packages returned 404","observed":"2026-09-03","source":"Rhode Island sandbox and production, write probes against a dispatched transfer"},{"id":"adjust_on_transfer_refused","value":"Adjusting a package that is on a transfer through the API returned 400 with Package <label> cannot be Adjusted because it is part of an existing Transfer.; the identical call on a package with no transfer returned 200","observed":"2026-09-03","source":"Rhode Island sandbox and production, package adjustment probes"},{"id":"connect_adjust_moves_shipped_quantity","value":"A package on a dispatched, in-transit manifest was adjusted in METRC Connect (dispatched 2026-09-02, adjusted 2026-09-03) and the transfer’s ShippedQuantity followed on its own, 100 to 79","observed":"2026-09-03","source":"Rhode Island production, one cultivator’s own adjustment in METRC Connect, read back through the API the same day"},{"id":"outgoing_recipient_null","value":"Rows of GET /transfers/v2/outgoing carried a null RecipientFacilityName; the recipient is on GET /transfers/v2/{id}/deliveries and the shipped packages on GET /transfers/v2/deliveries/{deliveryId}/packages","observed":"2026-06-04","source":"Rhode Island production, read-only probe of one cultivator’s outgoing transfers"},{"id":"transferred_price_after_acceptance","value":"Wholesale price per shipped package appears on /packages/v2/transferred once the recipient accepts the manifest","observed":"2026-06-04","source":"Rhode Island production, read-only probe of transferred packages"},{"id":"package_set_edited_at_dispatch","value":"On one order in June 2026 the package set on the dispatched manifest differed from the template SeedLink had built; the cultivator edited the packages in METRC Connect at dispatch","observed":"2026-06-30","source":"Rhode Island production, one cultivator’s order to a dispensary; the field guide records the month only (June 2026), so the last day of that month stands in for the unrecorded day"},{"id":"returned_state","value":"ShipmentPackageState took the value Returned, which METRC’s documentation does not show; a package refused at the door read Shipped, then Rejected at receipt, then Returned once the shipper recorded the return leg, and the delivery’s RejectedPackagesReturned flipped true","observed":"2026-07-29","source":"Rhode Island production, read-only probe of one delivery with a refused package"},{"id":"returned_delivery_counts","value":"On that delivery ReceivedQuantity was null on the returned package, DeliveryPackageCount was 5 and DeliveryReceivedPackageCount was 4","observed":"2026-07-29","source":"Rhode Island production, the same delivery"},{"id":"returned_package_active_at_shipper","value":"A returned package landed back on the shipper’s side as its own active package","observed":"2026-07-29","source":"Rhode Island production, the shipper’s active package list after the return leg"}],"constants":[{"value":64,"why":"base64, the name of the encoding the manifest PDF response wraps the file in"}],"faq":[{"question":"Is there an API call that dispatches a METRC transfer template?","answer":"Not in Rhode Island. POST /transfers/v2/outgoing returns 405, and the /start, /submit, /dispatch, /transfer and /create verbs on the template return 404 (sandbox, 2026-04-24 and 2026-07-26). A person clicks \"Start\" in METRC Connect; with the template staged, that was about 3 clicks."},{"question":"Why does the dispatched transfer have a different Id from the template?","answer":"Because it is a different record. METRC creates a new outgoing transfer at dispatch with its own Id from its own counter, a plain-numeric manifest number in place of the template’s T-prefixed one, and OriginatingTemplateId pointing back at the template. Match on that field, never on the Id."},{"question":"Which Id does the manifest PDF endpoint take?","answer":"The outgoing-transfer Id, with ?licenseNumber=. Not the template Id and not the manifest number. Passing a template Id can return a real PDF for an unrelated shipment with no error: on the sandbox, Id 1 returned a pre-seeded demo manifest from another state (2026-04-24)."},{"question":"Can I change a quantity on a dispatched manifest through the API?","answer":"No. POST and PUT /transfers/v2/outgoing return 405, PUT /transfers/v2/outgoing/packages returns 404, and adjusting a package that is on a transfer returns 400 with Package <label> cannot be Adjusted because it is part of an existing Transfer. (2026-09-03). A person can adjust the package in METRC Connect, and the manifest’s ShippedQuantity follows: one in-transit package went from 100 to 79 that way."},{"question":"Why is a package I just dispatched missing from /packages/v2/transferred?","answer":"That endpoint lags until the recipient accepts the manifest. Read departures from GET /transfers/v2/outgoing, where the transfer appears at dispatch. Once accepted, the package appears on /packages/v2/transferred with its wholesale price fields (production, 2026-06-04)."},{"question":"What does ShipmentPackageState Returned mean?","answer":"A package the recipient refused and the shipper took back. It reads Shipped, then Rejected at receipt, then Returned once the return leg is recorded, and the delivery’s RejectedPackagesReturned flips true. The value is not in METRC’s documentation; it was read on production on 2026-07-29, and the package came back as an active package on the shipper’s side."},{"question":"Why is RecipientFacilityName null on GET /transfers/v2/outgoing?","answer":"On production on 2026-06-04 the rows read carried null there. The recipient is on GET /transfers/v2/{id}/deliveries, and the shipped packages on GET /transfers/v2/deliveries/{deliveryId}/packages. Treat the outgoing row as an index, not a description."},{"question":"Which transfer type name does a wholesale sale use?","answer":"Unaffiliated Transfer from a cultivator to a dispensary with no common ownership, or Affiliated Transfer under common ownership. The bare name Transfer is refused with 400 and Transfer Type Name not specified. A lab license has no type that qualifies for an outgoing licensed shipment, so it cannot create a wholesale manifest."}],"sources":["Rhode Island sandbox transfer-lifecycle probes, 2026-04-24 and 2026-07-26: creating a template, reading it back, every dispatch verb, the manifest PDF endpoint (the SeedLink transfers module and its probe scripts).","Rhode Island production reads of GET /transfers/v2/outgoing, its deliveries and delivery packages, 2026-06-04 and 2026-07-29, read-only.","Rhode Island sandbox and production writes against a dispatched transfer and a transferred package, 2026-09-03, plus one cultivator’s adjustment in METRC Connect read back through the API the same day.","SeedLink METRC field guide (docs/METRC.md), section Transfers & Manifests: transfer types, transfer lifecycle, manifest and order reconciliation, manifest PDF endpoint, transferred-package pricing, remediation transfers. The transfer-types probe and the June 2026 dispatch divergence are recorded there without a day."],"citation":"SeedLink, \"A METRC transfer template becomes a manifest only when a person dispatches it in METRC Connect: Rhode Island exposes no dispatch endpoint\", observed 2026-09-03, revised 2026-09-20, https://www.seedlink.net/guides/metrc/transfer-template-to-manifest","methodology":"https://www.seedlink.net/methodology","publisher":"SeedLink"}