Tom Sailors
Brief · Anonymized case study

B2B Net 30 Checkout Gate

I'd use a customer metafield to flag credit-approved B2B accounts, then hide the payment step in Checkout Extensions for those customers. The storefront would display net 30 terms prominently, and Shopify Flow would catch each approved order and route it to the accounting backend with a tag for easy filtering.

A B2B merchant on Plus needed to surface net 30 payment terms at checkout, but only for customers who had already been credit-approved through their internal process. Approved customers should complete checkout without entering payment details. The build had to route approved orders to an accounting system for manual invoice generation.
Four pieces
B2B / Wholesale

Approval Metafield

Adds a credit-approved flag and terms date to each B2B customer so checkout knows who qualifies for net 30.

Admin API + Shopify admin UI
Admin GraphQL explorer graphql
# Admin GraphQL
mutation SetApprovalStatus($metafields: [MetafieldsSetInput!]!) {
  metafieldsSet(metafields: $metafields) {
    metafields {
      id
      namespace
      key
      value
    }
    userErrors {
      field
      message
    }
  }
}

# Variables:
# {
#   "metafields": [
#     {
#       "ownerId": "gid://shopify/Customer/1234567",
#       "namespace": "b2b_credit",
#       "key": "approved",
#       "type": "boolean",
#       "value": "true"
#     },
#     {
#       "ownerId": "gid://shopify/Customer/1234567",
#       "namespace": "b2b_credit",
#       "key": "approval_date",
#       "type": "date",
#       "value": "2025-01-15"
#     }
#   ]
# }
Replace Customer ID with the B2B account you are approving. Rerun to update status.
B2B / Wholesale

Checkout Payment Gate

Hides the payment step for approved customers, letting them proceed to order confirmation with net 30 terms.

Checkout UI extension
extensions/payment-customization/src/run.graphql function
# Function input query — Payment Customization
query Input {
  cart {
    buyerIdentity {
      customer {
        id
        metafield(namespace: "b2b_credit", key: "approved") {
          value
        }
      }
    }
  }
}
Requires Shopify Plus Checkout Extensions. The function returns the approval flag; your handler hides payment UI if true.
Storefront

Net 30 Terms Display

Shows net 30 payment terms and no-payment-required messaging on cart and checkout pages for approved B2B accounts.

Theme snippet + section
theme/snippets/b2b-net30-terms.liquid, included in cart/checkout template liquid
{% if customer and customer.metafields.b2b_credit.approved.value == true %}
  <div class="b2b-net30-banner">
    <p>
      <strong>Net 30 Terms Applied</strong><br>
      Your account is credit-approved. No payment required at checkout.
      Invoice will be sent to {{ customer.email }} after fulfillment.
    </p>
  </div>
{% endif %}
Include this snippet in your cart page and checkout page templates. Style the banner to match your site.
Operations

Approved Order Router

Watches for orders from approved customers and routes them to your accounting system, tagged for manual invoice generation.

Shopify Flow + backend webhook
Shopify Flow editor: When → Then flow
Trigger: When an order is created
Condition:
  - Customer metafield 'b2b_credit.approved' equals true
Then:
  1. Add tag 'b2b_net30_no_payment' to order
  2. Send to Zapier or Make webhook:
     - Payload: order ID, customer email, billing/shipping address, line items, total
  3. Send notification to accounting@company.com with order details link
Adjust the webhook URL to your accounting system (QuickBooks, NetSuite, etc). Tag ensures you can filter approved orders in your admin.

Got a similar problem?

Sketch your build in 30 seconds — voice, type, or attach a screenshot.

Sketch the build →