WordPress custom meta field for custom post not storing data

Based on your code, hope you have already register your CPT(custom post type) providing valid label & arguments with function:

register_post_type( 'freebie', $args );

Here is the complete code that, your custom meta box will be only visible to our “freebie” CPT with a input field to save demo url for this CPT posts. Add the below lines of code your functions.php

// Adding meta box for freebie custom post type
function demo_url_meta_box() {

    add_meta_box(
        'demo_url_meta_box',
        __( 'Demo URL', '' ),
        'demo_url_meta_box_callback',
        'freebie',
        'side',
        'low'

    );
}

add_action( 'add_meta_boxes_freebie', 'demo_url_meta_box' );
// Callback function of metabox
function demo_url_meta_box_callback( $post ) {

    // Add a nonce field so we can check for it later.
    wp_nonce_field( 'demo_url_nonce', 'demo_url_nonce' );

    // postmeta key: _demo_url
    $demo_url = get_post_meta( $post->ID, '_demo_url', true );


    echo '<textarea style="width:100%" id="freebie-demo" name="freebie-demo">' . esc_attr( $demo_url ) . '</textarea>';
}
/**
 * When the post is saved, saves our custom data.
 *
 * @param int $post_id
 */
function save_demo_url_meta_box_data( $post_id ) {

    // Check if our nonce is set.
    if ( ! isset( $_POST['demo_url_nonce'] ) ) {
        return;
    }

    // Verify that the nonce is valid.
    if ( ! wp_verify_nonce( $_POST['demo_url_nonce'], 'demo_url_nonce' ) ) {
        return;
    }

    // If this is an autosave, our form has not been submitted, so we don't want to do anything.
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return;
    }

    // Check the user's permissions.
    if ( isset( $_POST['post_type'] ) && 'page' == $_POST['post_type'] ) {

        if ( ! current_user_can( 'edit_page', $post_id ) ) {
            return;
        }

    }
    else {

        if ( ! current_user_can( 'edit_post', $post_id ) ) {
            return;
        }
    }

    /* OK, it's safe for us to save the data now. */

    // Make sure that it is set.
    if ( ! isset( $_POST['freebie-demo'] ) ) {
        return;
    }

    // Sanitize user input.
    $de_url = sanitize_text_field( $_POST['freebie-demo'] );

    // Update the meta field in the database.
    update_post_meta( $post_id, '_demo_url', $de_url );
}
// add meta box data when save_post is hooked
add_action( 'save_post', 'save_demo_url_meta_box_data' );

Hope this will help you !!!