For state data, I generally prefer records over maps, both in gen_server and gen_statem implementations, mainly for the reason of compile time key checking.
It’s records for me, too State constructs as used in gen_server/gen_statem implementations as I use them do not need the flexibility of maps, instead the rigidity of records is IMO rather a benefit than a limitation there. The only time this gets in the way is when you are doing hot code upgrades that change the record structure, but personally I rarely need to do that.