Right. For your CardSide property, which is a good idea, you won’t want that Side value global. Vassal has its own PlayerSide property, but I’m not sure if it’s retained after all the primary cards are sent to the main board by one player. So I’d suggest keeping your CardSide idea and making it either a Marker trait or Dynamic Property trait (in all primary and secondary cards).
Use the Marker trait, CardSide=Blue, if all players have only their own cards to choose from (I don’t remember if this is true or not). You’d make a prototype for the blue player and put that marker in all the cards (primary and secondary) belonging to that player. But if any cards are mixed up among the players (so a particular primary type card, for example, may go to any player), then make CardSide a dynamic property instead and tie it to the same key command that handles the cardselect dynamic property. So you’d have dynamic property CardSide, no menu command, key command being the same one that cardselect uses, assign value directly: $PlayerSide$… so when Blue player chooses primary and secondary cards, they also make CardSide=Blue for both of those cards.
For sending the secondary cards… say Blue Primary card hits region 1 and gets sent your “ends movement” gkc from the board (I’ll call it: mainmapGKC). You want that to also trigger a GKC trait in the cards’ prototype – unless the card moves around the board later and you don’t want it firing every time, then you’d use a trigger action with an appropriate matching property to limit it to firing only once (LocationName=~1|2|3|4&&CurrentBoard!=$OldBoard$) – otherwise just have it fire the GKC trait directly.
So the GKC trait has no command name, keyboard command: mainmapGKC, gkc: sendSecondary, matching properties: CurrentBoard=~P1|P2|P3|P4&&CardSide=$CardSide$&&cardselect=Secondary [substituting P1 etc for your actual player board names of course].
Then the Send to Location in the secondary cards’ prototype will have no command name, keyboard command: sendSecondary, destination: Another counter selected by properties, property match: CurrentBoard=[TheNameOfYourMainMapBoard]&&LocationName=~1|2|3|4&&CardSide=$CardSide$, then check Adv Options too and additional Y offset: [difference between region 1 and region 21] times 1.
Hope that works.