Add is_new as a field on membership api or possibly via membership_status
I've been thinking about https://github.com/civicrm/civicrm-core/pull/28185 & have concluded that the way to determine if it is a new membership or renewal is to check for the new membership status.
However, that is not actually straight forward since we can't use {membership.membership_status_id.name} in case they have modified the statuses.
I'm thinking maybe an api calculated field (exposed as a token)
Then in the template it would be something like
{if {membership.membership_status_id.is_new|boolean}}
Signup
{else}
Renewal
{/if}
One concern with the above is that if you re-sent it after the status had changed from new (3 months by default) if would show 'renewal'. Obviously people can customise the templates, as they do the membership types, so we don't have to catch every possibility. We might consider doing instead
{if {membership.membership_status_id.is_new|boolean}}
Signup
{elseif !{contribution.receive_date|boolean}}
-- hasn't been sent already so we can be somewhat confident
Renewal
{else}
-- some mealy mouthed generic alternative
{/if}