Chris:
I do this by rotating the entire CID Group - I have a Stored Procedure (SP) I wrote in MySQL - that is called via a crontab job every "x" minutes - or whatever - this will automatically switch the campaign to the NEXT CID group (as sorted by the cid group ID) for the campaign - and use ALL of the numbers - by State or by AreaCode since it switches the entire CID Group - instead of using ONE DID for ALL calls for a period of 1 minute or whatever - so you can still use Local Presence - or whatever you have configured (you don't have to have the state match the area code if you don't want to with either method - as long as you don't do the "state match" import - and use the "CSV" method instea).
So that you can control which CID Groups get rotated through - it will only use CID Groups assigned to the same user_group as the campaign - so - iof you have 3 campaigns you need to do this for - with three separate Inbound CID Callback groups - just assign the campaigns to 3 different user groups, and then create the cid groups for each and also assigned them to their associated user group...does that make sense?
Anyway - this SP also checks the "Dialable Leads" and automatically runs the "Bulk Campaign Reset" if it drops below the value you pass the SP.
If you (or anyone) is interested in the code - let me know - just keep in mind that I wrote it for one specific system - there is no "user front end" for parameters and the only documentation is whatever comments I put in the code itself...so it's pretty "brute force" - probably not all that "elegantly written" - so don't give me shit about how I wrote it
Thanks!