{"title":"Combining two METRC packages of one item in Rhode Island is one POST with two ingredients, and the drained sources stay active until you finish them","url":"https://www.seedlink.net/guides/metrc/combining-packages","json":"https://www.seedlink.net/guides/metrc/combining-packages/data.json","question":"How do I combine two METRC packages of the same item into one?","answer":"Send one POST /packages/v2/ whose Ingredients array names every source package with its full live quantity, on one adult-use tag and with a Location, then finish the emptied sources with PUT /packages/v2/finish, because METRC leaves them active at zero.","environment":"Rhode Island production and sandbox","observed":"2026-07-28","revised":"2026-09-20","published":"2026-09-20","facts":[{"id":"endpoint_takes_ingredients_array","value":"POST /packages/v2/ is documented as creating packages from other packages and takes an Ingredients array; every package SeedLink had created through it before 2026-07-27 passed exactly 1 ingredient","observed":"2026-07-27","source":"METRC API reference for POST /packages/v2/, and the SeedLink packaging code path as it stood before the combine shipped"},{"id":"sandbox_combine_two_ingredients","value":"One POST /packages/v2/ carrying 2 ingredients, 3 Each and 3 Each of one pre-roll item, created a single new package holding 6 Each","observed":"2026-07-27","source":"Rhode Island sandbox, one sandbox cultivator facility; SeedLink’s combine run on a test order, and GET /packages/v2/{label} on the new package afterwards"},{"id":"sandbox_combine_lab_state","value":"The combined package read LabTestingState TestPassed, the state both sources carried","observed":"2026-07-27","source":"Rhode Island sandbox, the same combine run; the single-package GET on the new package"},{"id":"sandbox_combine_tag","value":"1 adult-use package tag consumed per combine group; the new sandbox package landed on an adult-use tag","observed":"2026-07-27","source":"Rhode Island sandbox, the same combine run; the tag was chosen from GET /tags/v2/package/available through the deny-list the package-tags guide describes"},{"id":"sandbox_sources_read_zero","value":"The next sync read both source packages back at 0","observed":"2026-07-27","source":"Rhode Island sandbox, the package sync that ran after the combine"},{"id":"zeroed_package_stays_active","value":"A package drawn to 0 by the combine stayed listed in GET /packages/v2/active until it was finished; METRC did not close it on its own","observed":"2026-07-27","source":"Rhode Island sandbox, GET /packages/v2/active after the combine and before any finish call"},{"id":"production_hand_combine","value":"Two packages of one pre-roll item, holding 664 and 265 units, went inactive at 20:33 UTC, and a new package of the same item appeared in the same minute holding 929","observed":"2026-07-27","source":"Rhode Island production, one cultivator facility; the cultivator combined by hand in METRC Connect and SeedLink’s package sync read the result; read-only"},{"id":"finish_verb_and_precondition","value":"PUT /packages/v2/finish takes a body of [{Label, ActualDate}]; a POST to the same path returns HTTP 405; a package can be finished only when it is empty","observed":"2026-07-26","source":"Rhode Island sandbox, the lab-testing recipe notes in docs/METRC.md; the note itself carries no date, and the dated probes beside it in the same recipe are 2026-07-25 and 2026-07-26, so the later of those is used here"},{"id":"unfinish_is_a_full_undo","value":"PUT /packages/v2/unfinish returned a finished package to GET /packages/v2/active; the finish had left the child package’s SourcePackageLabels untouched","observed":"2026-07-28","source":"Rhode Island sandbox, finish and unfinish exercised by hand on a drained source with a child package, with /packages/v2/active read before and after"},{"id":"active_read_needs_forward_padding","value":"A just-modified package fell outside a GET /packages/v2/active read whose lastModifiedEnd carried no forward padding, and looked as if it had never come back; with 1 day of forward padding it was listed again","observed":"2026-07-28","source":"Rhode Island sandbox, the same finish and unfinish check, read by hand"},{"id":"first_cultivator_finish_rate","value":"One cultivator finished 93% of its single-draw full drains the same day (p90 0 days) and 255 of 256 eventually","observed":"2026-07-28","source":"Rhode Island production, read-only probe of one cultivator facility’s package history"},{"id":"second_cultivator_finish_rate","value":"A second cultivator finished 81% of its single-draw full drains the same day and 109 of 109 eventually","observed":"2026-07-28","source":"Rhode Island production, read-only probe of a second cultivator facility’s package history"},{"id":"never_unfinished","value":"Across 533 inactive packages at the two facilities, no package had ever been un-finished","observed":"2026-07-28","source":"Rhode Island production, the same read-only probe, both facilities"},{"id":"sources_finished_by_cultivator","value":"Of the 4 source packages SeedLink’s own packaging had drawn from, 3 had been finished by the cultivator by hand, not by the integration","observed":"2026-07-28","source":"Rhode Island production, the same read-only probe, one facility"},{"id":"location_required","value":"POST /packages/v2/ and POST /harvests/v2/packages return HTTP 400 with the message \"Location was not specified.\" when the body carries no Location; when GET /locations/v2/active is empty, an existing package’s LocationName is accepted","observed":"2026-07-26","source":"Rhode Island sandbox, the lab-testing recipe notes in docs/METRC.md; the note itself carries no date, and the dated probes beside it in the same recipe are 2026-07-25 and 2026-07-26, so the later of those is used here"},{"id":"lineage_field_shape","value":"SourcePackageLabels on a package is a comma-separated list of the tags it was built from","observed":"2026-07-28","source":"Rhode Island sandbox, the child package read during the finish and unfinish check"}],"constants":[{"value":64,"why":"base64, the name of the encoding in the Authorization header example"}],"faq":[{"question":"Can one POST /packages/v2/ merge more than one package?","answer":"Yes. The endpoint creates packages from other packages and takes an Ingredients array. On the Rhode Island sandbox on 2026-07-27 one call with 2 ingredients, 3 Each and 3 Each of one item, created one package of 6 Each on an adult-use tag."},{"question":"Why are my source packages still active after the combine?","answer":"Because METRC never closes a package just because a draw emptied it. Both sandbox sources read 0 and stayed in /packages/v2/active until they were finished with PUT /packages/v2/finish, which takes [{Label, ActualDate}] and only works on an empty package."},{"question":"Is finishing a package reversible?","answer":"Yes. PUT /packages/v2/unfinish returned a finished package to /packages/v2/active on the Rhode Island sandbox on 2026-07-28, and the finish had left the child’s SourcePackageLabels untouched. The tag consumed by the combine is not reversible."},{"question":"Why does the finish use PUT?","answer":"Because a POST to /packages/v2/finish returns HTTP 405. The create call has a required field in the same spirit: POST /packages/v2/ without a Location returns HTTP 400 with Location was not specified."},{"question":"Can I combine packages of two different items, or two pack sizes of one item?","answer":"Not as a combine. Sameness is Item.Id; a package built from sources of another item is a production blend, and a single and a 3-pack do not share a unit count. Both are refused before any write."},{"question":"Does the lab-testing state carry to the combined package?","answer":"On the sandbox on 2026-07-27, two TestPassed sources produced a TestPassed result. Mixed states are refused before the call, because merging passed product into an untested package yields something that cannot be manifested."},{"question":"How do I find the package a cultivator combined by hand in METRC Connect?","answer":"Read SourcePackageLabels on the active packages: it is a comma-separated list of parent tags. Exactly one active package on the same item naming the dead tag is the successor. None means no successor, more than one is ambiguous, and one on a different item is a blend; refuse rather than guess in every case but the first."},{"question":"Do cultivators actually finish drained packages?","answer":"Essentially always. On 2026-07-28 one Rhode Island cultivator had finished 93% of its single-draw full drains the same day and 255 of 256 eventually; a second had finished 81% the same day and 109 of 109 eventually; across 533 inactive packages, neither had ever un-finished one."}],"sources":["SeedLink combine run against the Rhode Island sandbox, 2026-07-27: one POST /packages/v2/ with two ingredients, the single-package GET on the result, and the package sync that followed.","Rhode Island production package sync at one cultivator facility, 2026-07-27, read-only: two packages of one item inactive at 20:33 UTC and their successor appearing in the same minute after a combine by hand in METRC Connect.","PUT /packages/v2/finish and PUT /packages/v2/unfinish exercised by hand on the Rhode Island sandbox, 2026-07-28, with GET /packages/v2/active read before and after.","Read-only probe of package finish history at two Rhode Island production cultivator facilities, 2026-07-28.","SeedLink METRC field guide (docs/METRC.md), sections Combining split packages into one shipment, Closing out a drained source, Adopting a package the cultivator combined by hand, and the sandbox lab-testing notes on Location and the finish verb; the request body field names were checked against SeedLink’s own METRC client."],"citation":"SeedLink, \"Combining two METRC packages of one item in Rhode Island is one POST with two ingredients, and the drained sources stay active until you finish them\", observed 2026-07-28, revised 2026-09-20, https://www.seedlink.net/guides/metrc/combining-packages","methodology":"https://www.seedlink.net/methodology","publisher":"SeedLink"}