Background:
In my ASP.NET (Episerver) site, I have one product page whose content varies based on the product code parameter: www.mysite.com/product/[productcode]
There aren't multiple physical product pages - just the one that varies based on the productcode parameter. This is what I mean by "dynamic".
If the entered product code is not found in the database, the above url returns a 404 page (with a 404 status code in the header).
We never link internally to expired products, but it's possible that various affiliate sites link to outdated campaign products.
Question(s):
The 404 page is customizable, and we have taken steps towards making it user-friendly, but the focus of this question is on the status code:
Is it necessary (or encouraged) to return a 404 status code for expired/non-existent products?
Would I be just as well off by redirecting (301) to a "product not found" page, or simply showing the "product not found" content directly on the product page?
Is it errorneous to make a distinction between not found content (e.g. products, campaigns, jobs) vs not found pages?
My own research
My own research suggests that it is preferable to return the 404 status code for expired content:
Google explains that a "soft 404" (i.e. returning 200 OK but with "page not found" content) is bad practice. However, I'm not sure if this applies in my case, since I'm dealing with "content" and not "pages". Is this distinction erroneous?
Google seems to recommend returning 404 page, so the 404 page itself will not show up in search results.
This blog post suggests that soft 404 may be interpreted as a 404 anyway.
However, I've also read a bunch of (less official) blog posts that seem to suggest that the 404 response code is not important, and that the most important thing is to ensure that users do not bounce off the 404 page (and this can be helped by having custom 404 pages).
I've not been able to find a clear answer to my specific situation, so I'm hoping to be pointed in the right direction. I'm tempted to just go with Google's general advice of returning 404 for not found content. I struggle with finding a clear answer