Yeah, using velo, also here a bit of “workarounds”, as it is essentially a “3-step” approach, with some “manual work” in-between…
Step0: outside Wix, I have created a python sktipt that converts my Excel file (that contains the (new) contact data) into a .json file format
Step1: I import the .json dataset into a CMS collection. In fact, doing this, I have 2 options (either … or / both options are independent from each other):
Option A: I have an input textbox in which I copy & paste the json format dataset from the clipboard. I use the JSON.parse(#texbox).value and pull the data into the CMS using wixData.insert(…)
OptionB: I (manually) upload the json file when I am in the media manager … So, the file then does exist in my site files area. In the media pool, I copy the file URL (I retrieve this information from the file info → URL → “copy URL”; this is the “public” URL with “https://…”).
I then paste the URL link into a text input field on my page. Then, in Velo I fetch the data (from the fileURL) using fetch(fileURL) using 'wix-fetch" API and pull the data into the CMS relevant CMS fields (using wix.Data.insert(…) function using wix-data module.
OptionB is somehow my preferred way - however, I haven’t found a way to retrieve the “public” file URL through Velo. I’d like to work with an upload file button and straight retrieve the “public” URL once the file is uploaded. However, I didn’t manage to get the public file URL link (https://…). I was just able to retrieve other information of the file such as the “download URL” using “getFileInfo()” (or getDownloadUrl()) using the MediaManager option of the ‘wix-media-backend’ API.
→ any hints how to get the public URL via Velo is welcome!
Step2:
Then, the 2nd step is to “copy” / transfer CMS records into the contact database using the contacts.create.Contact(…) function from ‘wix-crm-backend’ API. (In this process, I check if the contatcs mentioned in the CMS already exists to ensure that only new contacts are imported / created. This all works very well, even the custom extended fields and labels are correctly set for the new contacts in the contact database - except of setting the subscriptionstatus 
Ok, I hope this does not sound too confusing. Overall, I am quite happy. Two things I’d like to improve:
- more automatic import process of the .json file (without going the the media pool to get the file URL) and
- to set the subscription status during the createContact process.
I hope this answers your questions. Otherwise, please let me know.
If you are interested, I am happy to send you more details or the codes from my steps I have mentioned herein.
Regards
Adrian