How to Add Multiple Print Buttons to Item Fulfillments
Learn how to add multiple print buttons to Item Fulfillments in NetSuite, saving your team hours of manual form toggling.

On this page
Item Fulfillments often need more than one document printed from the same record. Your warehouse needs a packing slip, your vendor needs a return authorization, and your customer service team wants a pick ticket. The standard Print icon only pulls the default Advanced PDF template assigned to the transaction form, so you end up swapping custom forms back and forth. That manual toggle is where teams lose hours.
You can fix this with a custom Transaction Body Field that renders two separate hyperlinks, each pointing to a different Advanced PDF template. The approach works on Sales Orders and Vendor Returns, but it fails on Item Fulfillments when the URL parameters don't match what NetSuite expects for that record type. Here's what's missing.
Why the Item Fulfillment URL Fails
The hotprint.nl URL works differently depending on the source transaction type. Your Vendor Return formula succeeds because it uses trantype=vendauth and omits the orgtrantype parameter. The Item Fulfillment attempt fails because of two problems in the URL structure.
First, you're passing trantype=itemship combined with orgtrantype=CustInvc. NetSuite's print engine expects the fulfillment to reference the originating sales order, not the customer invoice. The orgtrantype parameter tells the system which transaction type created the fulfillment. For a standard Item Fulfillment created from a Sales Order, that value should be salesorder, not CustInvc.
Second, you're passing auxtrans={id} with the fulfillment's own internal ID. That parameter expects the internal ID of the source transaction, not the fulfillment record. When NetSuite can't resolve the auxiliary transaction, it returns a generic error page instead of the PDF.
The Correct URL Structure for Item Fulfillments
For a custom print button on an Item Fulfillment, use this URL pattern in your Transaction Body Field formula:
https://[account].app.netsuite.com/app/accounting/print/hotprint.nl?regular=T&sethotprinter=T&formnumber=111&printtype=PACKINGSLIP&trantype=itemship&id={id}The critical difference is removing orgtrantype and auxtrans entirely. The id parameter alone tells NetSuite which fulfillment record to print. The formnumber parameter selects which Advanced PDF template to use.
Step-by-Step: Two Print Buttons on One Item Fulfillment
Step 1: Create the Transaction Body Field
Go to Customization > Lists, Records, & Fields > Transaction Body Fields > New.
- Label: Print Packing Slip
- ID:
custbody_print_packslip - Type: Inline HTML
- Store Value: Unchecked
- Applies To: Item Fulfillment
- Display Type: Inline HTML
Leave the default value empty. You'll populate it with a formula instead.
Step 2: Add the Formula for the First Button
On the field definition, check Show as Formula and enter:
'<div style="display:block; padding-top:12px; margin-top:8px;">
<a href="https://[account].app.netsuite.com/app/accounting/print/hotprint.nl?regular=T&sethotprinter=T&formnumber=111&printtype=PACKINGSLIP&trantype=itemship&id=' || {id} || '" target="_blank"
style="display:inline-block; background:#0070C0; color:white; padding:8px 14px; font-weight:bold; border-radius:4px; text-decoration:none;">
Print Packing Slip
</a>
</div>'Replace [account] with your NetSuite account domain. Replace formnumber=111 with the internal ID of your packing slip template.
Step 3: Create the Second Body Field for the Vendor Return
Repeat the process with a second Transaction Body Field:
- Label: Print Vendor Return
- ID:
custbody_print_vendorreturn - Type: Inline HTML
- Applies To: Item Fulfillment
Use this formula:
'<div style="display:block; padding-top:12px; margin-top:8px;">
<a href="https://[account].app.netsuite.com/app/accounting/print/hotprint.nl?regular=T&sethotprinter=T&formnumber=114&printtype=PACKINGSLIP&trantype=itemship&id=' || {id} || '" target="_blank"
style="display:inline-block; background:#C00000; color:white; padding:8px 14px; font-weight:bold; border-radius:4px; text-decoration:none;">
Print Vendor Return
</a>
</div>'Change formnumber=114 to the internal ID of your vendor return template.
Step 4: Assign the Fields to Your Item Fulfillment Form
Go to Customization > Forms > Transaction Forms, open the Item Fulfillment form you use, and add both fields to the Main or Print section. The buttons appear in View mode automatically because Inline HTML fields render on read-only pages.
Step 5: Find Your Template Internal IDs
To confirm which formnumber value to use, go to Customization > Forms > Advanced PDF/HTML Templates. The internal ID appears in the URL when you click a template name. The URL looks like app/common/custom/customscript.nl?customscript=...&recordtype=...&id=114. That id value is your form number.
What If the Button Still Shows an Error?
Three things cause most failures after the URL is corrected.
The template is not assigned to the fulfillment form. Even though you're calling the template by ID, NetSuite still checks whether that template is available on the current transaction form. Open your Item Fulfillment form under Customization > Forms > Transaction Forms, select the template in the Print field, and save.
The template type doesn't match. An Advanced PDF template created for Vendor Returns won't render on an Item Fulfillment. You need a separate template built from the Packing Slip or Item Fulfillment type. Go to Customization > Forms > Advanced PDF/HTML Templates > Create, choose the correct record type, and build from there.
The fulfillment wasn't saved. The {id} field is empty on an unsaved record. The button only works after you save the fulfillment. If you need the button during data entry, use a Client Script instead, but that adds complexity most teams don't need.
A Cleaner Alternative: User Event Script
If you find Transaction Body Fields too limiting, a User Event Script with beforeLoad can add buttons to the button area directly. This gives you more control over placement and visibility per role. The script approach requires SuiteScript 2.1 and a deployment record, so it's the right choice when you need role-based visibility or buttons that appear only in Edit mode.
For most packing slip and vendor return scenarios, the Transaction Body Field formula is simpler to maintain. You can change the template ID without touching any script, and your admin team can see exactly what the formula does.
Test both buttons on a saved fulfillment before rolling this out to your warehouse team. The control here is confirming each template renders with the correct data, because a packing slip that prints vendor return pricing has a material impact on your operations. Get that right, and your fulfillment team can print the right document every time without touching the form settings.


