I am dealing with this exact conundrum. I am offering 3 paid plans (and a totally free plan), with very easy to use upgrade downgrade functionality. My app is not storage intensive so I don't care about keeping data that is currently not active.
In the dashboard I show the user their current plan levels and the limit of items they currently have on their plan. So for example:
Campaigns: using 8 out of 10
If they downgrade to a plan with say 5 campaigns, it would say
Campaigns: using 10 out of 5
This is obviously lame so my solution is to display the remaining as
Campaigns: using 5 out of 5 (3 campaigns inactive - UPGRADE)
Now from a business perspective I think it makes the most sense to deactivate the last campaigns they created until they upgrade to a plan. This means we lock all campaigns except for the X first campaigns created. This will be a good incentive for them to either upgrade or start deleting older items (as per Matti Virkkunen's answer)
I have logic in the app that runs a method for isItemActive which checks if basedon their current plan, and the levels of that plan, should this item be active in whatever way it is supposed to (IE: display it on the front end to visitors or whatever). Naturally this depends on the app itself but I think the LIFO approach (last in first deactivated) approach makes the most sense and forces users to either upgrade,m or at least delete their older items.
In your case you could potentially do the same thing except that you may want to add a warning or time limit after which they user's data above their limit will be deleted permanently.