Hi,
Glad it works in the admin email. The reason the same edit does nothing in the customer email is that the customer emails (order creation notification and order status notification) are built a bit differently from the admin one.
In the admin email the product name is a single plain line, which is exactly the line you edited. But in the customer emails the name is wrapped in a link to the product page when the product still exists, so there are two versions of that line:
if(!empty($item->product_id)) {
...
$t = '<p><a href="'.$product_url.'">' . $item->order_product_name . '</a>';
} else {
$t = '<p>' . $item->order_product_name;
}
Your products have a page, so the first line (the link one) is the one that actually runs. The line you edited is the fallback that only runs when the product has no link, which is why nothing showed.
Rather than editing inside that if/else, add the helper call on its own line right after the block closes, so it applies whichever branch runs:
} else {
$t = '<p>' . $item->order_product_name;
}
$t .= hikashopOrderVariantLines($item);
if($group){
And, as with the admin email, remember to also paste the helper function itself at the top of each customer email's preload (the if(!function_exists(...)) guard makes that safe).
Do this in the order creation notification and/or the order status notification, whichever ones your customers actually receive, and the characteristics block will show there too.