There’s times when it’s useful to send GA4 events to two (or more) GA4 properties. Maybe you’ve got a GA4 “Rollup property” for multiple domains or a property to gather all errors in one place.
Update November 2023:
The new Google Variable “Google Tag: Configuration Settings” allows you to setup parameters in one place. You can then apply these parameters to the two GA4 setup tags using the one configuration tag. If you’ve got lots of parameters then this will be useful.
I was hoping for some ID flexibility, but not there yet.
GA4 Setup Tag With Configuration Variable

Update January 2024: I now use a JavaScript variable for the “Tag ID”. This allows me to dynamically change the ID depending on if it’s an internal or test user. I’ve got a special GA4 property to receive internal or test hits. This keeps my normal GA4 property cleaner, with less internal traffic contamination.
Here’s how the variable is configured:

You may read that using JavaScript variables is resource intensive. But in fact this one will only be run when it’s needed. However when you use Tag Assistant you’ll find it gets run VERY often. (you can add a console.log(“being run”); to check). Once you’ve published the GTM container the JS variable is only run when it’s needed – not so often.
Back to GA4 setup using a configuration variable…
Here’s how to do that using GTM. It’s easier than you might think.
The GA4 Setup Tag in GTM (Google Tag Manager – without configuration tag)

The “Measurement ID” is what determines which GA4 property any events are sent to.
Putting two Measurement IDs in the setup (with a comma separating them) doesn’t work (it’s not that simple). GTM picks the first ID and uses that.
We could use two GA4 Setup Tags. One for each property. The second one is exactly the same as the first except for the Measurement ID.
The Second GA4 Property Setup Tag (without configuration tag)

However an undocumented trick that works (for me) is to put multiple GA4 Measurement IDs in a JavaScript Array:
['G-AAAAAAAAA','G-BBBBBBBBB']
You can’t put this in the tag directly, but I do it as a Custom JavaScript Variable.
Now when you load a page there’s 2 page_view events sent. One to each property.
Here is where it gets simple. Lets add another event – in this case “test_event”. The trick is to “Manually Set ID” for the event. Using a GTM Custom JavaScript variable with the two Measurement IDs in a JavaScript Array.
The Array contains the Measurement IDs you want to send events to.
I have a special ID GTM variable with both Measurement IDs setup inside.

This is how we use the combined ID variable

Now when we load a page the “test_event” is sent to both GA4 properties.

The images are from Chrome Dev Tools showing the two almost identical events sent to the two different GA4 properties.
This works for me in simple Google Analytics 4 setups in Tag Manager.
My previous version used comma separated GA4 Measurement IDs, however the GA cookies were compromised. Using the JavaScript Array method is much more reliable.
If you get any issues please contact me, and I’ll check.