WooCommerce

How to print WooCommerce orders and receipts

· 6 min read

A store owner once asked me for a print button on the WooCommerce order screen. I wrote a snippet that adds a View or Print Receipt order action. It opens the customer’s order received page, and you print that from the browser.

That page is part of the storefront, so the printout carries your theme’s header, menu, and footer too. I tested for this post on WooCommerce 11.2.1 and found a better source sitting in core. WooCommerce can build a plain receipt for any order, and the mobile apps already use it. Nothing in wp-admin links to it.

TLDR

WooCommerce has no print button for orders. Core can build a printable receipt through the wc/v3/orders/{id}/receipt REST endpoint, and the snippet below turns that into a Print receipt order action. For invoices, packing slips, or printing many orders at once, use a plugin such as PDF Invoices & Packing Slips for WooCommerce.

What WooCommerce gives you without a plugin

Open any order in WooCommerce > Orders and check the Order actions box. On my test store it lists three actions: send order details to the customer, resend the new order notification, and regenerate download permissions. None of them prints anything.

Your customers can print their side from the browser, using the order received page after checkout or the order view in My account. That’s also what my old snippet relies on.

The receipt builder lives in src/Internal/ReceiptRendering/ in the WooCommerce plugin. Its REST controller adds two routes:

Both need the read_shop_order capability, so only people who can see the order can make a receipt for it. The WooCommerce iOS app reads the same receipt_url field from that endpoint in its receipt model.

Add a Print receipt button to the order screen

The snippet adds a Print receipt action to the Order actions box. When you apply it, it asks core for a fresh receipt and opens it in the same tab. Add it to your child theme’s functions.php or to a code snippets plugin like WPCode.

// Adds a "Print receipt" order action that opens the receipt WooCommerce core builds.
add_filter( 'woocommerce_order_actions', function ( $actions ) {
	$actions['wcwiz_print_receipt'] = 'Print receipt';
	return $actions;
} );

add_action( 'woocommerce_order_action_wcwiz_print_receipt', function ( $order ) {
	// Same endpoint the WooCommerce mobile apps use. force_new rebuilds it after order edits.
	$request = new WP_REST_Request( 'POST', '/wc/v3/orders/' . $order->get_id() . '/receipt' );
	$request->set_param( 'force_new', true );
	$response = rest_do_request( $request );

	if ( $response->is_error() ) {
		return;
	}

	wp_redirect( $response->get_data()['receipt_url'] );
	exit;
} );

To use it, open an order, pick Print receipt in the Order actions box, and click the arrow next to it. On my test store this is what came back for a two-item order paid by card:

A WooCommerce order receipt showing the amount paid, date paid, payment status, payment method, the order items, taxes, and the total

The receipt core built for test order #1188, with no theme around it.

From there, Ctrl + P or Cmd + P prints it or saves it as a PDF.

The snippet calls the endpoint with rest_do_request(), so it runs inside WordPress as the logged-in user. No API keys, and the same capability check applies. Without force_new, core hands back the receipt it made last time, even if you edited the order since.

What the core receipt leaves out

This is a payment receipt, not an invoice or a packing slip. It shows the amount paid, date, payment status, payment method, each line item, and totals for discounts, fees, shipping, and taxes. It has no billing or shipping address and no logo. If you’re printing orders to pack boxes, it’s the wrong document.

You can change it with three filters from core:

Two more details. The receipt is saved as a file at a URL like /wc/file/transient/7eaa1e..., and anyone with that link can open it until it expires. The default expiry is the next day. Also, ReceiptRendering sits in the Internal namespace, and the WooCommerce src README says code there isn’t public. The REST route is the safer piece to build on, so the snippet only talks to that.

When you need invoices, packing slips, or bulk printing

This is where a plugin earns its place. These are the ones I’d look at, with numbers from WordPress.org and WooCommerce.com on October 29, 2026:

I’d start with Emboss. It’s free with nothing locked behind a paid version, and one plugin covers invoices, receipts, packing slips, and credit notes for refunds. You can set your own invoice number format, and the documents attach to WooCommerce emails and show up in the customer’s My account. Move to the SkyVerge one when you need pick lists for a warehouse.

Printing orders automatically

Some stores want a printer next to the kitchen or the packing table that prints each order as it comes in. Automatic Order Printing for WooCommerce by Procomltd does that for $119 a year. It sends invoices and packing slips to a printer when an order is placed, paid, or changes status, through PrintNode or PrintTrigger. Those are cloud print services with desktop software that runs on a computer connected to your printer.

If all you need is a clean copy of one order now and then, the snippet above is enough. Once you’re printing every order to ship it, a packing slip plugin will save you more time than anything core can give you.

Shameem Reza
Written by Shameem Reza

I am a Happiness Engineer at Automattic, helping merchants turn WooCommerce chaos into calm with clear solutions and simple technical breakdowns.

Enjoyed reading this?

This site stays ad-free and independent. If something here saved you time or taught you something new, a coffee goes a long way.

Buy me a coffee ☕
Keep reading