The following function needs to send request asynchronously:
No. of rows in devices.csv = 1 million
Required: send a POST request for all 1 million rows per day for 3 days
def check_in():
    logging.info('Starting')
    day = 0
    while day < 3:
        logging.info('Check-in Day = ' + str(day))
        with open('devices.csv', newline='') as csvfile: 
            reader = csv.DictReader(csvfile)
            for row in reader:
                device_sn = row['serial_number']
                payload = {
                    "product": "##",
                    "board": "###",
                    "hardware_id": "0000",
                    "usage_id": "000",
                    "mac_address": row['mac_address'],
                    "serial_number": row['serial_number']
                }
                logging.info(
                    'Check-in device: ' + device_sn)
                checkin_post(payload, device_sn)
            day += 1
def checkin_post(payload, device_sn):
    payload = payload
    serial_number = device_sn
    print('\n' + 72 * '=' + '\nPOST /device/' +
          serial_number + '/check-in')
    resp = requests.post(base_url + '/device/' +
                         serial_number + '/check-in', auth=auth, json=payload)
    print(resp.status_code)
The code might change to probably something like:
async def checkin_post(payload, device_sn):
    payload = payload
    serial_number = device_sn
    print('\n' + 72 * '=' + '\nPOST /device/' +
          serial_number + '/check-in')
    resp = requests.post(base_url + '/device/' +
                         serial_number + '/check-in', auth=auth, json=payload)
    return resp.status_code
async def main(payload, device_sn):
    checkin_post(payload, device_sn)
Also, since there is no await, it isn't truly asynchronous.