[{"data":1,"prerenderedAt":548},["ShallowReactive",2],{"article-automate-data-entry-packing-lists-bills-of-lading":3},{"id":4,"title":5,"author":6,"body":7,"category":531,"description":532,"extension":533,"featured":534,"image":535,"meta":536,"navigation":537,"path":538,"publishedAt":539,"readingTime":111,"seo":540,"stem":541,"tags":542,"updatedAt":546,"videoUrl":546,"__hash__":547},"articles\u002Farticles\u002Fautomate-data-entry-packing-lists-bills-of-lading.md","Automating Packing List and Bill of Lading Data Entry","Don Dappa",{"type":8,"value":9,"toc":522},"minimark",[10,14,19,22,244,392,395,399,402,424,427,431,434,441,455,459,462,466,469,477,480,486,489,493,496,500,518],[11,12,13],"p",{},"Every importer and wholesaler I've spoken to has the same stack on their desk: a packing list PDF from the supplier, a bill of lading from the forwarder, and someone whose job is to retype both into a spreadsheet or a booking screen. It's not hard work. It's just slow, repetitive, and exactly the kind of task where a tired set of eyes drops a container number or transposes a weight. This is about what \"automate data entry packing list\" and \"bill of lading data extraction\" actually mean in practice, not what the marketing copy says they mean.",[15,16,18],"h2",{"id":17},"whats-actually-being-extracted","What's actually being extracted",[11,20,21],{},"A packing list and a bill of lading carry overlapping but distinct fields. Here's the shape of what a structured extraction produces from both documents together:",[23,24,29],"pre",{"className":25,"code":26,"language":27,"meta":28,"style":28},"language-json shiki shiki-themes github-light","{\n  \"document_type\": \"bill_of_lading\",\n  \"bol_number\": \"MAEU123456789\",\n  \"shipper\": \"ACME TRADING CO LTD\",\n  \"consignee\": \"NORTHSHORE IMPORTS BV\",\n  \"notify_party\": \"NORTHSHORE IMPORTS BV\",\n  \"vessel\": \"MAERSK ESSEX\",\n  \"voyage\": \"412W\",\n  \"port_of_loading\": \"SHANGHAI\",\n  \"port_of_discharge\": \"ROTTERDAM\",\n  \"containers\": [\n    {\n      \"container_number\": \"MSKU1234567\",\n      \"seal_number\": \"SL998877\",\n      \"gross_weight_kg\": 18420,\n      \"package_count\": 840\n    }\n  ]\n}\n","json","",[30,31,32,41,58,71,84,97,109,122,135,148,161,170,176,189,202,215,226,232,238],"code",{"__ignoreMap":28},[33,34,37],"span",{"class":35,"line":36},"line",1,[33,38,40],{"class":39},"sgsFI","{\n",[33,42,44,48,51,55],{"class":35,"line":43},2,[33,45,47],{"class":46},"sYu0t","  \"document_type\"",[33,49,50],{"class":39},": ",[33,52,54],{"class":53},"sYBdl","\"bill_of_lading\"",[33,56,57],{"class":39},",\n",[33,59,61,64,66,69],{"class":35,"line":60},3,[33,62,63],{"class":46},"  \"bol_number\"",[33,65,50],{"class":39},[33,67,68],{"class":53},"\"MAEU123456789\"",[33,70,57],{"class":39},[33,72,74,77,79,82],{"class":35,"line":73},4,[33,75,76],{"class":46},"  \"shipper\"",[33,78,50],{"class":39},[33,80,81],{"class":53},"\"ACME TRADING CO LTD\"",[33,83,57],{"class":39},[33,85,87,90,92,95],{"class":35,"line":86},5,[33,88,89],{"class":46},"  \"consignee\"",[33,91,50],{"class":39},[33,93,94],{"class":53},"\"NORTHSHORE IMPORTS BV\"",[33,96,57],{"class":39},[33,98,100,103,105,107],{"class":35,"line":99},6,[33,101,102],{"class":46},"  \"notify_party\"",[33,104,50],{"class":39},[33,106,94],{"class":53},[33,108,57],{"class":39},[33,110,112,115,117,120],{"class":35,"line":111},7,[33,113,114],{"class":46},"  \"vessel\"",[33,116,50],{"class":39},[33,118,119],{"class":53},"\"MAERSK ESSEX\"",[33,121,57],{"class":39},[33,123,125,128,130,133],{"class":35,"line":124},8,[33,126,127],{"class":46},"  \"voyage\"",[33,129,50],{"class":39},[33,131,132],{"class":53},"\"412W\"",[33,134,57],{"class":39},[33,136,138,141,143,146],{"class":35,"line":137},9,[33,139,140],{"class":46},"  \"port_of_loading\"",[33,142,50],{"class":39},[33,144,145],{"class":53},"\"SHANGHAI\"",[33,147,57],{"class":39},[33,149,151,154,156,159],{"class":35,"line":150},10,[33,152,153],{"class":46},"  \"port_of_discharge\"",[33,155,50],{"class":39},[33,157,158],{"class":53},"\"ROTTERDAM\"",[33,160,57],{"class":39},[33,162,164,167],{"class":35,"line":163},11,[33,165,166],{"class":46},"  \"containers\"",[33,168,169],{"class":39},": [\n",[33,171,173],{"class":35,"line":172},12,[33,174,175],{"class":39},"    {\n",[33,177,179,182,184,187],{"class":35,"line":178},13,[33,180,181],{"class":46},"      \"container_number\"",[33,183,50],{"class":39},[33,185,186],{"class":53},"\"MSKU1234567\"",[33,188,57],{"class":39},[33,190,192,195,197,200],{"class":35,"line":191},14,[33,193,194],{"class":46},"      \"seal_number\"",[33,196,50],{"class":39},[33,198,199],{"class":53},"\"SL998877\"",[33,201,57],{"class":39},[33,203,205,208,210,213],{"class":35,"line":204},15,[33,206,207],{"class":46},"      \"gross_weight_kg\"",[33,209,50],{"class":39},[33,211,212],{"class":46},"18420",[33,214,57],{"class":39},[33,216,218,221,223],{"class":35,"line":217},16,[33,219,220],{"class":46},"      \"package_count\"",[33,222,50],{"class":39},[33,224,225],{"class":46},"840\n",[33,227,229],{"class":35,"line":228},17,[33,230,231],{"class":39},"    }\n",[33,233,235],{"class":35,"line":234},18,[33,236,237],{"class":39},"  ]\n",[33,239,241],{"class":35,"line":240},19,[33,242,243],{"class":39},"}\n",[23,245,247],{"className":25,"code":246,"language":27,"meta":28,"style":28},"{\n  \"document_type\": \"packing_list\",\n  \"invoice_reference\": \"INV-2026-0442\",\n  \"total_cartons\": 840,\n  \"total_net_weight_kg\": 16900,\n  \"total_gross_weight_kg\": 18420,\n  \"line_items\": [\n    {\n      \"description\": \"Cotton T-Shirts, Mixed Colours\",\n      \"hs_code\": \"610910\",\n      \"carton_count\": 420,\n      \"units_per_carton\": 48,\n      \"net_weight_kg\": 8450\n    }\n  ]\n}\n",[30,248,249,253,264,276,288,300,311,318,322,334,346,358,370,380,384,388],{"__ignoreMap":28},[33,250,251],{"class":35,"line":36},[33,252,40],{"class":39},[33,254,255,257,259,262],{"class":35,"line":43},[33,256,47],{"class":46},[33,258,50],{"class":39},[33,260,261],{"class":53},"\"packing_list\"",[33,263,57],{"class":39},[33,265,266,269,271,274],{"class":35,"line":60},[33,267,268],{"class":46},"  \"invoice_reference\"",[33,270,50],{"class":39},[33,272,273],{"class":53},"\"INV-2026-0442\"",[33,275,57],{"class":39},[33,277,278,281,283,286],{"class":35,"line":73},[33,279,280],{"class":46},"  \"total_cartons\"",[33,282,50],{"class":39},[33,284,285],{"class":46},"840",[33,287,57],{"class":39},[33,289,290,293,295,298],{"class":35,"line":86},[33,291,292],{"class":46},"  \"total_net_weight_kg\"",[33,294,50],{"class":39},[33,296,297],{"class":46},"16900",[33,299,57],{"class":39},[33,301,302,305,307,309],{"class":35,"line":99},[33,303,304],{"class":46},"  \"total_gross_weight_kg\"",[33,306,50],{"class":39},[33,308,212],{"class":46},[33,310,57],{"class":39},[33,312,313,316],{"class":35,"line":111},[33,314,315],{"class":46},"  \"line_items\"",[33,317,169],{"class":39},[33,319,320],{"class":35,"line":124},[33,321,175],{"class":39},[33,323,324,327,329,332],{"class":35,"line":137},[33,325,326],{"class":46},"      \"description\"",[33,328,50],{"class":39},[33,330,331],{"class":53},"\"Cotton T-Shirts, Mixed Colours\"",[33,333,57],{"class":39},[33,335,336,339,341,344],{"class":35,"line":150},[33,337,338],{"class":46},"      \"hs_code\"",[33,340,50],{"class":39},[33,342,343],{"class":53},"\"610910\"",[33,345,57],{"class":39},[33,347,348,351,353,356],{"class":35,"line":163},[33,349,350],{"class":46},"      \"carton_count\"",[33,352,50],{"class":39},[33,354,355],{"class":46},"420",[33,357,57],{"class":39},[33,359,360,363,365,368],{"class":35,"line":172},[33,361,362],{"class":46},"      \"units_per_carton\"",[33,364,50],{"class":39},[33,366,367],{"class":46},"48",[33,369,57],{"class":39},[33,371,372,375,377],{"class":35,"line":178},[33,373,374],{"class":46},"      \"net_weight_kg\"",[33,376,50],{"class":39},[33,378,379],{"class":46},"8450\n",[33,381,382],{"class":35,"line":191},[33,383,231],{"class":39},[33,385,386],{"class":35,"line":204},[33,387,237],{"class":39},[33,389,390],{"class":35,"line":217},[33,391,243],{"class":39},[11,393,394],{},"Notice the overlap: gross weight and package count appear on both documents and should match. That cross-check is the first thing worth doing before any data goes anywhere.",[15,396,398],{"id":397},"the-permitted-example-end-to-end","The permitted example, end to end",[11,400,401],{},"Take one incoming shipment. Supplier emails a packing list PDF, forwarder sends a bill of lading PDF. The workflow I'd expect to see:",[403,404,405,409,412,415,418,421],"ol",{},[406,407,408],"li",{},"Both documents land in one place (inbox, upload, or API).",[406,410,411],{},"Fields are extracted per the schema above, from each document separately.",[406,413,414],{},"The two documents are reconciled on the fields they share: container number, package count, gross weight.",[406,416,417],{},"Party names are checked against what you already have on file for that supplier or consignee, flagging anything new or mismatched rather than silently accepting it.",[406,419,420],{},"A human reviews the flagged items and anything the extraction marked as low confidence, not the whole document from scratch.",[406,422,423],{},"The reviewed, confirmed data is exported to wherever it needs to go next.",[11,425,426],{},"Step 6 is where most tools quietly go vague, and it's worth being precise about it.",[15,428,430],{"id":429},"two-different-destinations-two-different-levels-of-trust","Two different destinations, two different levels of trust",[11,432,433],{},"There's a real difference between \"we can export a spreadsheet\" and \"we have a working connection into your operating system.\" Treat them as separate questions.",[11,435,436,440],{},[437,438,439],"strong",{},"Generic spreadsheet or CSV handoff."," If a tool extracts fields and drops them into a spreadsheet, that's a starting point to assess, not a finished workflow. You still have to get that data into whatever you actually run your import operation on. For most importers and wholesalers today, that's a manual step, and it's worth timing it the same way you'd time the typing it replaces.",[11,442,443,446,447,454],{},[437,444,445],{},"CargoMode's connected workflow."," CargoMode accepts packing lists, bills of lading and commercial invoices, extracts the fields, and runs them through operator review before they're confirmed. The part that's genuinely wired through end to end today is the CargoWise-connected booking path. If you run CargoWise, that connection is real and current. If you don't, treat the fit as a hypothesis to test on your own documents, not a shipped integration, until you've confirmed it against what you actually need. The honest move is to check the current scope at ",[448,449,453],"a",{"href":450,"rel":451},"https:\u002F\u002Fwww.cargomo.de\u002F",[452],"nofollow","cargomo.de"," before assuming a feature exists.",[15,456,458],{"id":457},"why-operator-review-stays-in-the-loop","Why operator review stays in the loop",[11,460,461],{},"Freight documents are inconsistent by design. Suppliers use their own templates, forwarders use their own layouts, and a single shipment can have revised packing lists that never get flagged as revisions. An extraction engine that silently guesses on a smudged container number or an ambiguous HS code digit is worse than one that flags it. That's why review sits in the workflow rather than being presented as optional. It's also why I won't give you an accuracy percentage here: any number without your own document set behind it is a guess dressed up as a fact.",[15,463,465],{"id":464},"measure-your-own-numbers-before-you-measure-a-tools","Measure your own numbers before you measure a tool's",[11,467,468],{},"Here's the arithmetic worth running before you evaluate anything:",[23,470,475],{"className":471,"code":473,"language":474},[472],"language-text","Documents per month    = D\nMinutes per document   = M  (current manual keying, both PL and BOL)\nCurrent monthly hours  = (D × M) \u002F 60\n","text",[30,476,473],{"__ignoreMap":28},[11,478,479],{},"Now estimate the review-only version:",[23,481,484],{"className":482,"code":483,"language":474},[472],"Minutes per document under review  = R  (checking flagged fields only)\nProjected monthly hours            = (D × R) \u002F 60\n",[30,485,483],{"__ignoreMap":28},[11,487,488],{},"Plug in your own D, M and R from your own records. If you haven't timed any of these yet, that's the first thing to do, not the extraction tool. A stopwatch on ten real documents this week will tell you more than any vendor claim.",[15,490,492],{"id":491},"what-this-isnt","What this isn't",[11,494,495],{},"To be clear about scope: this isn't purchase order automation, it isn't invoice reconciliation against a PO, and it isn't a ready-made connector into every ERP. It's packing list and bill of lading extraction with a human review step, and for CargoWise users, a connected booking path. If your workflow needs more than that today, say so when you test it, so you're assessing the actual boundary rather than an assumed one.",[15,497,499],{"id":498},"next-step","Next step",[11,501,502,503,507,508,512,513,517],{},"If you want to see how this holds up against documents you actually handle, bring a few representative redacted packing lists and bills of lading, along with the systems you run today, to ",[448,504,506],{"href":505},"\u002F?demo=1","a live assessment",". For background on how extraction approaches differ before you get there, the ",[448,509,511],{"href":510},"\u002Farticles\u002Focr-vs-ai-extraction-freight-documents","OCR versus structured extraction comparison"," is worth a read, and if you want to sanity-check a container number by hand first, the ",[448,514,516],{"href":515},"\u002Ftools\u002Fcontainer-validator","container number validator"," is free to use right now.",[519,520,521],"style",{},"html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":28,"searchDepth":43,"depth":43,"links":523},[524,525,526,527,528,529,530],{"id":17,"depth":43,"text":18},{"id":397,"depth":43,"text":398},{"id":429,"depth":43,"text":430},{"id":457,"depth":43,"text":458},{"id":464,"depth":43,"text":465},{"id":491,"depth":43,"text":492},{"id":498,"depth":43,"text":499},"how-to","A worked example of extracting packing list and bill of lading fields, the operator review step, and where the output actually has to go.","md",false,"\u002Fimages\u002Farticles\u002Fautomate-data-entry-packing-lists-bills-of-lading.jpg",{},true,"\u002Farticles\u002Fautomate-data-entry-packing-lists-bills-of-lading","2026-10-08",{"title":5,"description":532},"articles\u002Fautomate-data-entry-packing-lists-bills-of-lading",[543,544,545],"Bill of Lading","Packing List","Data Entry",null,"EBNbzGyz_UTI_HIKeiUa5NkhC9sRmgqmHsN8UeEP-sI",1791454567803]