API is not really that documented 
Symfonium does not scrobble on it’s side, but properly reports the playing status during playback then manually update the playcount at the end since the app is offline first and handle playcounts when offline.
The question is why does Plex auto scrobble at 50% then again when updating playcount? Can this be avoided when reporting playback via some parameters?
See logs, after 50% when sending the playback state plex answers
“playbackState”:“complete”
“viewOffset”:-1
Those values are wrong since we are only at half of the media.
2022-07-25 11:16:26.306 Verbose/PlexLogger: <-- [616] 200 OK https://xxxx.plex.direct:20123/:/timeline?ratingKey=166504&key=%2Flibrary%2Fmetadata%2F166504&state=playing&time=62000&duration=130000 (12ms, unknown-length body)
2022-07-25 11:16:26.311 Verbose/PlexLogger: <-- [616] {"MediaContainer":{"size":0,"playbackState":"progress","skipCount":0,"viewCount":20,"viewOffset":62000}}
2022-07-25 11:16:27.814 Verbose/PlexLogger: --> [391] GET https://xxxx.plex.direct:20123/:/timeline?ratingKey=166504&key=%2Flibrary%2Fmetadata%2F166504&state=playing&time=63000&duration=130000
2022-07-25 11:16:27.829 Verbose/PlexLogger: <-- [391] 200 OK https://xxxx.plex.direct:20123/:/timeline?ratingKey=166504&key=%2Flibrary%2Fmetadata%2F166504&state=playing&time=63000&duration=130000 (15ms, unknown-length body)
2022-07-25 11:16:27.833 Verbose/PlexLogger: <-- [391] {"MediaContainer":{"size":0,"playbackState":"progress","skipCount":0,"viewCount":20,"viewOffset":63000}}
2022-07-25 11:16:28.573 Verbose/PlexLogger: --> [814] GET https://xxxx.plex.direct:20123/:/timeline?ratingKey=166504&key=%2Flibrary%2Fmetadata%2F166504&state=playing&time=64000&duration=130000
2022-07-25 11:16:28.610 Verbose/PlexLogger: <-- [814] 200 OK https://xxxx.plex.direct:20123/:/timeline?ratingKey=166504&key=%2Flibrary%2Fmetadata%2F166504&state=playing&time=64000&duration=130000 (38ms, unknown-length body)
2022-07-25 11:16:28.611 Verbose/PlexLogger: <-- [814] {"MediaContainer":{"size":0,"playbackState":"progress","skipCount":0,"viewCount":20,"viewOffset":64000}}
2022-07-25 11:16:29.324 Verbose/PlexLogger: --> [584] GET https://xxxx.plex.direct:20123/:/timeline?ratingKey=166504&key=%2Flibrary%2Fmetadata%2F166504&state=playing&time=65000&duration=130000
2022-07-25 11:16:29.796 Verbose/PlexLogger: <-- [584] 200 OK https://xxxx.plex.direct:20123/:/timeline?ratingKey=166504&key=%2Flibrary%2Fmetadata%2F166504&state=playing&time=65000&duration=130000 (473ms, unknown-length body)
2022-07-25 11:16:29.797 Verbose/PlexLogger: <-- [584] {"MediaContainer":{"size":0,"playbackState":"complete","skipCount":0,"viewCount":21,"viewOffset":-1}}
2022-07-25 11:16:30.821 Verbose/PlexLogger: --> [131] GET https://xxxx.plex.direct:20123/:/timeline?ratingKey=166504&key=%2Flibrary%2Fmetadata%2F166504&state=playing&time=66000&duration=130000
2022-07-25 11:16:30.842 Verbose/PlexLogger: <-- [131] 200 OK https://xxxx.plex.direct:20123/:/timeline?ratingKey=166504&key=%2Flibrary%2Fmetadata%2F166504&state=playing&time=66000&duration=130000 (22ms, unknown-length body)
2022-07-25 11:16:30.844 Verbose/PlexLogger: <-- [131] {"MediaContainer":{"size":0,"playbackState":"complete","skipCount":0,"viewCount":21,"viewOffset":-1}}
Users like to see the playback sessions on plex console, but I can easily add an option to remove the reporting and only deal with the playcount / lastplayed.