How to send an email notification when a subcription renewal is due?
Part 1 - Sending eMail notifications
Use the Rules module together with Rules Scheduler (a sub-module of it), as explained in the steps below. These steps are based on a date field which is added to the user profile, so that for each user you can indicate an appropriate renewal date of a specific package. To support multiple packages, just create similar date fields (1 for each package type).
Step 1: Create a field to store the renewal date
Add a field to the &quot;user&quot; entity with machine name (say) field_next_renewal. Allow only 1 date (to store the &quot;next&quot; renewal).
Step 2: Create a Rules &quot;Component&quot;
Here is the Rules Component to be created (in Rules export format, just import it in your own environment via copy-paste):
{ &quot;rules_send_email_notification&quot; : {
    &quot;LABEL&quot; : &quot;Send eMail notification&quot;,
    &quot;PLUGIN&quot; : &quot;action set&quot;,
    &quot;OWNER&quot; : &quot;rules&quot;,
    &quot;REQUIRES&quot; : [ &quot;rules&quot; ],
    &quot;USES VARIABLES&quot; : { &quot;user_to_notify&quot; : { &quot;label&quot; : &quot;User to be notified&quot;, &quot;type&quot; : &quot;user&quot; } },
    &quot;ACTION SET&quot; : [
      { &quot;mail&quot; : {
          &quot;to&quot; : [ &quot;user-to-notify:mail&quot; ],
          &quot;subject&quot; : &quot;Friendly reminder about your upcoming renewal&quot;,
          &quot;message&quot; : &quot;This is a reminder about the upcoming renewal  on [user-to-notify:field_next_renewal] ...&quot;,
          &quot;from&quot; : &quot;[site:mail]&quot;,
          &quot;language&quot; : [ &quot;&quot; ]
        }
      }
    ]
  }
}

Obviously, the Subject and Message of the eMail may need review / tuning, while you might also want to use some other From eMail ID. The Message-part of it is also where you can add the &quot;link to upgrade to a different package&quot; (as in your question).
Step 3: Create a &quot;Rule&quot; using the Rules Component
Here is the Rule to be created, in Rules export format (just import it in your own environment via copy-paste):
{ &quot;rules_on_user_renewal&quot; : {
    &quot;LABEL&quot; : &quot;On user renewal&quot;,
    &quot;PLUGIN&quot; : &quot;reaction rule&quot;,
    &quot;OWNER&quot; : &quot;rules&quot;,
    &quot;REQUIRES&quot; : [ &quot;rules&quot;, &quot;rules_scheduler&quot; ],
    &quot;ON&quot; : { &quot;user_update&quot; : [] },
    &quot;IF&quot; : [
      { &quot;entity_has_field&quot; : { &quot;entity&quot; : [ &quot;account&quot; ], &quot;field&quot; : &quot;field_next_renewal&quot; } }
    ],
    &quot;DO&quot; : [
      { &quot;schedule_delete&quot; : {
          &quot;component&quot; : &quot;rules_send_email_notification&quot;,
          &quot;task&quot; : &quot;[account:name]&quot;
        }
      },
      { &quot;schedule&quot; : {
          &quot;component&quot; : &quot;rules_send_email_notification&quot;,
          &quot;date&quot; : {
            &quot;select&quot; : &quot;account:field-next-renewal&quot;,
            &quot;date_offset&quot; : { &quot;value&quot; : 259200 }
          },
          &quot;identifier&quot; : &quot;[account:name]&quot;,
          &quot;param_user_to_notify&quot; : [ &quot;account&quot; ]
        }
      }
    ]
  }
}

Note that the above rule refers to the Rules Component from the previous step. It gets triggered any time a user profile is updated (feel free to replace that Rules Event with any other event that might fit).
The schedule_delete that is part of this rule is to ensure that previously &quot;scheduled&quot; reminders will get removed when updating the data field (so that it only triggers 1 reminder, and with the most recent date).
Step 4: additional refinements

The date_offset (=259200) in the above rule corresponds to &quot;3 days in advance&quot;, which may need review / tuning.

If needed, you could also use the Field Permissions module to set field-level permissions to edit, view and create this renewal field.

Instead of just sending an eMail (as in the Rules Component), you could replace that by a more advanced option using the Message module (which has great integrations with the Rules module also). Here is an quote about that module (from its project page):

... enables logging and displaying system events in a number of different use cases. Events that are recorded over time are sometimes call activity streams. Exportable messages subtypes can be created for different use cases with custom fields and display (view) modes.



Part 2 - Tracking possible responses
If you'd also use the Flag module, you could enhance the above Rules logic to also &quot;flag&quot; the user (to indicate that you're waiting for some kind of response to the renewal eMail. By creating a view (using the Views module), you could then simply list the flagged users for which you do not have some desired response (those are the users who didn't perform a renewal).
Happy Rules-ing!