Using the vault system to authorize payments later

This guide will show you how to set up the following scenario:

Customer checks out, but card is not charged immediately At a later date, the site admin will complete the order

Note: this feature isn’t part of our free/included support policy; our support team will provide an estimate before providing any technical support on customer use of force_vault and force_processing.

In your settings, make sure your admins have been given access to check out on a customer’s behalf in General Settings > Admin Checkout Groups. Also make sure that the Vault ID field in Orders > Order Field Settings is mapped to a field in your orders channel. Under Subscriptions you will find the list of vault eligible gateways. Make sure that you are configured to use one of these gateways. Under Orders > Order Statuses, make sure you have a “Processing” status mapped.

In the customer’s checkout form, use force_vault to create a vault using the customer’s payment information. Use force_processing to set the order to processing status instead of complete.

{exp:cartthrob:checkout_form
    force_vault="yes"
    force_processing="yes"
}

{gateway_fields}
    
<input type="submit" value="Checkout">

{/exp:cartthrob:checkout_form}

An admin interface might then look like this. You’ll want to make sure that this template is only accessible to admins, either via template member group checks or template access permissions.

If you’re using Stripe, make sure you’re using the latest version of CartThrob and include the skip_stripe_js="yes" parameter in your checkout_form.

<table>
    <thead>
        <tr>
            <th>Order</th>
            <th>Date</th>
            <th></th>
        </tr>
    </thead>
    <tbody>
{exp:channel:entries channel="orders" status="Processing"}
        <tr>
            <td>{title}</td>
            <td>{entry_date format="%F %j, %Y"}</td>
            <td>
                {exp:cartthrob:checkout_form
                    vault_id="{order_vault_id}"
                    order_id="{entry_id}"
                    skip_stripe_js="yes"
                }
                <input type="submit" value="Process Order">
                {/exp:cartthrob:checkout_form}
            </td>
        </tr>
{/exp:channel:entries}
    </tbody>
</table>