there are several approaches to this, some people say to go with a snapshot-replicate method, other people go with a snapshot – zfs send recieve method.
the wrong way to do it is anything that leaves the server: over the network from a fileshare, or using Rsync.
the first thing to understand is what a snapshot is. This is a record of the exact state of a piece of data at a particular moment in time. when first created, snapshots take up 0 additional space (other than a few Kb for their metadata), and then as the data in the dataset is changed, it will grow to the size of the data that has been changed. Doing this can be seen as a shadowcopy in windows, and it will appear as a shadowcopy that was taken at the time the snapshot was made.
the second thing to understand is what a replicate task is within freenas.
the third thing we need to discus is what the zfs tools are, including send/recieve. as far as i have seen, these are always used together to manipulate data from within computer.
references/additional resources
https://danthesalmon.com/moving-zfs-datasets-between-volumes/
https://blog.fosketts.net/2016/08/18/migrating-data-zfs-send-receive/
https://www.reddit.com/r/freenas/comments/8gmd2x/copying_data_over_from_old_pool_to_new_pool/