I understand your frustration, but what you are asking isn't possible with the present charging structure.
If giffgaff had only one user, it would be possible to start their goodybag at exactly midnight.
If giffgaff had two users, one of them would have to start a fraction before midnight because they are processed sequentially.
But giffgaff has tens of thousands of users that need recurring goodybags updated every day. That's why processing them has to start several hours before midnight. Currently that's 7.30pm.
The alternative would be to start processing them at midnight, but that would mean that some users would be without a goodybag until 4.30am the next day. If they used data between midnight and the time their replacement goodybag actually starts, then that data would be charged 5p/Mb at PAYG rates -- and that would be substantially worse than the goodybag starting a few hours early.
The problem could possibly be solved in several ways, but the present method is probably the best that can be achieved with the limitations of the present software.
The complaint above is about recurring goodybag processing.
More specifically, it is about users losing unexpired minutes/texts/data/texts during the final hours of the previous goodybag, because the recurring process has to start the new goodybag a few hours early.
This means that minutes/data/texts used in the final hours of the goodybag are charged to "tomorrow's" goodybag instead of using the unexpired balance of the current one.
In theory, it evens out after the first month, if the new goodybag starts early by about the same number of hours every month.
In practice, it doesn't because users don't necessarily use the same amount of calls/text/data in the final few hours of every month.