I think this may be a bug, but it's not a biggy.
I have a product channel with a price by member group field. My orders get saved to Orders and Purchased items channels, both based on standard setup iirc. My purchased items channel includes a Price field {purchased_price} type: CartThrob Price - Simple.
If someone places an order where the price is ZERO (registered members can book event places for free), then the purchased item stores the price as e.g. YToyOntpOjA7YToyOntzOjEyOiJtZW1iZXJfZ3JvdXAiO3M6MToiNSI7czo1OiJwcmljZSI7czoxOiIwIjt9aToxO2E6Mjp7czoxMjoibWVtYmVyX2dyb3VwIjtzOjA6IiI7czo1OiJwcmljZSI7czoxOiI1Ijt9fQ==
not £0 as expected.
I realised that is a base64 encoding of something, that turns out to be e.g a:2:{i:0;a:2:{s:12:"member_group";s:1:"5";s:5:"price";s:1:"0";}i:1;a:2:{s:12:"member_group";s:0:"";s:5:"price";s:1:"5";}}
- which appears to be the array of member prices available.
The orders channel correctly stores the total order price as £0.00, and the {order_items} price is also 0, this only affects the purchased items channel. If an order is placed for any price > 0, then it stores the selected member price as expected. So i suspect 0 is being taken for null somewhere?
{exp:cartthrob:debug_info}
shows price as 0 (uses customer price) all the way thru the process.
Like I say, it's not critical for me, as the one place I am using a report of individual items, I can use the hilarious grep workaround {if purchased_price ~ "/..................../"}£0{if:else}{purchased_price}{/if}
(assume long strings are not for billion pound orders!)
but it would be good to know whether it's a real thing or not.