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 →