Introduction
ZS B2B Gateway turns your Shopify store into a complete wholesale operation. This guide walks through every feature with step-by-step instructions, examples, and best practices.
What is ZS B2B Gateway?
ZS B2B Gateway is a Shopify app that helps you accept, process, and manage wholesale customer applications. It works on every Shopify plan and adapts its workflow based on whether your store is on Shopify Plus or a standard plan.
The app covers the full wholesale lifecycle:
- Acquire â Customizable application forms embedded on your storefront
- Process â Admin inbox with filtering, tags, and bulk actions
- Approve â One-click approval creates Shopify customers or B2B companies
- Tag & segment â Auto-tag based on form data, sync to Shopify segments
- Price â Tag-based discount rules that sync to Shopify Discounts
- Control visibility â Hide prices from non-wholesale visitors
If you prefer learning by watching, our video tutorials cover every feature in under 5 minutes each.
Installation
Installing ZS B2B Gateway takes under one minute. You'll need an active Shopify store on any plan.
Step 1 â Add the app
- Visit the Shopify App Store and search for ZS B2B Gateway
- Click Add app
- You'll be redirected to your Shopify admin to authorize the install
Step 2 â Approve permissions
The app will request a set of OAuth scopes. Review them and click Install app. See the permissions section below for a detailed breakdown of why each scope is needed.
Step 3 â Land on the dashboard
After install, you'll land on the Dashboard with a setup checklist. Follow the steps to publish your first form and start accepting applications.
If you're on Shopify Plus, the app will also request protected customer data access. This is required to create B2B Companies and assign catalogs. Approval typically takes seconds on a dev store and 1â3 days on a production store via Shopify's review.
Permissions & scopes
ZS B2B Gateway requests the minimum scopes needed for each feature. Here's why each one is required:
| Scope | Why we need it |
|---|---|
read_customers / write_customers |
Create customer records on approval, apply tags, and sync wholesale status |
read_companies / write_companies |
Plus stores only â create B2B Companies and assign approved customers |
read_discounts / write_price_rules / write_discounts |
Auto-create and sync tag-based discount rules to Shopify Discounts |
read_publications / write_publications |
Read sales channels for non-Plus stores; assign wholesale customers to private channels |
read_metaobjects / write_metaobjects |
Store visibility rule metadata accessible to the theme app block |
read_products / write_products |
Scope discount and visibility rules to specific products or collections |
Protected customer data access is required for processing applications. The app requests this during install. Without it, customer creation on approval will fail. Learn about protected data.
Your first form
The fastest way to start accepting wholesale applications:
- Open Form Builder from the left navigation
- Review the four default fields: First Name, Last Name, Email, Company Name
- Add any custom fields you need (Business Type, Tax ID, Volume estimate)
- Switch to the Branding tab and set your primary color and button text
- Switch to the Display tab to choose between Popup, Embedded, or Both
- Click Save draft to save without publishing, or Publish form to make it live on your storefront
Once published, a floating "Apply for Wholesale" button appears on every page of your storefront. Customers click it to open the form modal.
Plus vs Standard behavior
The app automatically detects your store's plan and adjusts the approval workflow accordingly.
Shopify Plus stores
On approval, the app:
- Creates a B2B Company via the
companyCreatemutation - Creates a company contact and associates them with the company
- Assigns the company to your default catalog (configurable per approval)
- Applies all tags to the customer record
- Sends the approval email with a B2B login link
Standard plans (Basic, Shopify, Advanced)
On approval, the app:
- Creates a Customer via the
customerCreatemutation - Applies the
wholesaleandb2b-approvedtags (plus any custom tags) - Optionally associates with a private sales channel if configured
- Sends the approval email with the activation link
Both flows give your wholesale customers the same experience â special pricing, gated access, and a smooth checkout. The technical implementation differs because Shopify Plus has native B2B primitives while standard plans rely on tag-based discount rules.
Form Builder â Field types
The form builder supports 10 field types. Drag any field from the field list to add it. Click a field to edit its label, name, placeholder, validation, and required state.
| Type | Use for |
|---|---|
| Short text | Single-line text input (names, IDs, short answers) |
| Long text | Multi-line textarea (descriptions, business details) |
| Email field with built-in format validation | |
| Phone | Phone number with international format support |
| Number | Numeric input with optional min/max constraints |
| Dropdown | Single-select with custom options |
| Radio buttons | Visible single-select with custom options |
| Checkbox | Yes/no toggle or agreement checkbox |
| Date picker | Native date input |
| File upload | Single or multiple file uploads (PDF, image, doc) up to 25 MB on Pro plan |
Four core fields (First Name, Last Name, Email, Company Name) are locked and always required â they're needed for the approval workflow.
Display modes
Choose how the form appears on your storefront. Switch in Form Builder â Display.
- Popup â A floating "Apply for Wholesale" button on every page. Clicking it opens the form in a modal.
- Embedded â The form is inserted directly on a page where you place it. Use the theme app block to position it.
- Both â Both popup button and embedded support are available. Choose per-page in the theme editor.
Popup is the default and works on every theme without configuration. Embedded requires adding the theme app block on the page where you want the form.
Form branding
Match the form to your brand:
- Primary color â Used for button, accents, and form title. Use the color picker or paste a hex value.
- Button text â Customize the floating button label (default: "Apply for Wholesale")
- Form title & subtitle â Shown at the top of the form
- Success message â Shown after a customer submits an application
- Button animation â Optional pulse, bounce, shake, or glow effect on the floating button
Field validation
Each field supports several validation options depending on its type:
- Required â Customer must fill the field to submit
- Min/max length â For text and textarea fields
- Min/max value â For number fields
- File size limit â Per-field for file upload fields (2 MB, 5 MB, 10 MB, 25 MB)
- Allowed file types â PDF, Images, Documents, Spreadsheets
Validation runs both client-side (instant feedback) and server-side (security). Validation errors appear inline beneath each field.
Application lifecycle
An application moves through these states:
- PENDING â Just submitted, awaiting review
- APPROVED â Reviewed and accepted, customer record created in Shopify
- REJECTED â Reviewed and declined, customer received rejection email
- APPROVAL_PARTIAL â Approval started but one or more downstream actions failed (e.g., Shopify customer created but discount sync failed). Use "Retry approval" to re-run failed steps.
The approval flow runs multiple steps in sequence: create customer â apply tags â assign catalog â send email. If any non-critical step fails, the application enters APPROVAL_PARTIAL state with a detailed error log. You can retry the failed steps individually.
Approving applications
From the application detail page:
- Review the applicant's form data, uploaded files, and applied tags
- Click Approve in the top right
- For Plus stores: select a catalog to assign the customer to
- Confirm the approval
Approval triggers the following sequence (most steps run in the background):
- Create/update customer in Shopify
- Apply all configured tags
- Assign to catalog (Plus) or sales channel (Standard)
- Run any matching auto-tagging rules
- Sync customer segments (if rules with sync enabled match)
- Send approval email with login link
- Update application status to APPROVED
Bulk operations
To approve multiple applications at once:
- Filter the Applications list to show what you want to process
- Select applications using the checkboxes on each row
- Click Bulk approve in the action bar
- Confirm in the modal
Bulk approvals are queued and processed in the background. You'll see a progress notification as they complete. If any fail, they enter APPROVAL_PARTIAL state for individual review.
Bulk export is also available â select applications and click Export to CSV to download a spreadsheet of the selected records.
Auto-tagging rules
Create if-then rules that automatically apply tags based on form data:
- Open Auto-tagging from the left navigation
- Click Create rule
- Set a name and priority (higher priority runs first)
- Add conditions: choose a field, an operator, and a value
- If you have multiple conditions, choose AND or OR logic
- Add the tags to apply when conditions match
- Optionally enable Sync to Shopify segment
- Save
Rules evaluate instantly on form submission. Tags carry over to the Shopify customer record on approval.
Supported operators
- equals / does not equal
- contains / does not contain
- is empty / is not empty
- greater than / less than (number fields only)
Customer segments
When you enable Sync to Shopify segment on any tagging rule, the app:
- Creates a matching customer segment in your Shopify admin
- Builds a query like
customer_tags CONTAINS 'wholesale'based on the tags - Keeps the segment in sync as customers get tagged or untagged
- Logs every sync attempt with status and error details
Use these segments for marketing campaigns, discount targeting, or analytics in Shopify.
Shopify's customer segment API doesn't support all the same logic as the app's tagging rules. If your rule uses complex conditions, the segment will be approximated using the resulting tags rather than the original form-data conditions.
Pricing rules
Tag-based discount rules sync automatically to Shopify Discounts. Customers with matching tags see the discount applied at checkout.
Discount types
- Percentage off â e.g., 25% off all products
- Fixed amount off â e.g., $10 off per order
- Fixed price â Set products to a specific price (less commonly used)
Scope
- All products
- Specific collections â Add collection IDs from your Shopify admin URL
- Specific products â Add product IDs from your Shopify admin URL
Tag matching
Customer must have any or all of the listed tags. Use ANY for OR logic, ALL for AND.
Minimum requirements
- Minimum order amount â Discount only applies if order subtotal exceeds this value
- Minimum quantity â Discount only applies if cart has at least this many items
Priority
When multiple rules match the same customer and products, higher priority rules apply first. Shopify's discount engine evaluates them in order.
Price visibility
Control who sees your prices on the storefront using four modes:
| Mode | Behavior |
|---|---|
| Hide price | Price element is removed silently |
| Login required | Shows "Log in to see price" link in place of the price |
| Wholesale only | Shows your custom message for non-wholesale visitors |
| Hide product entirely | Removes the entire product card from collection pages and product pages |
Setup
- Open your theme editor (Online Store â Themes â Customize)
- Navigate to any product page
- Click Add block in the product info section
- Select Price Visibility under app blocks
- Save the theme
- Return to the app and create visibility rules
Visibility rules won't take effect until the theme app block is installed on your product pages. Without it, prices remain visible to all visitors.
Bypass tags
Use bypass tags to let specific customers always see prices. For example, set wholesale as a bypass tag on a Login-required rule, and approved wholesale customers will see prices while everyone else sees the login prompt.
Email templates
Customize all four transactional emails in Settings â Email templates:
- Application received â Sent to the customer after they submit
- Approval â Sent on approval with login/activation link
- Rejection â Sent on rejection, optionally with your reason
- Admin notification â Sent to your team on every new application
Template variables
Use these tokens in subject lines and email bodies â they're replaced with real values at send time:
{{firstName}}â Applicant's first name{{lastName}}â Applicant's last name{{companyName}}â Company name{{email}}â Applicant's email{{shopName}}â Your store name{{loginUrl}}â Login link (approval emails only){{rejectionReason}}â Your rejection reason (rejection emails only)
Default catalog
On Shopify Plus, approved customers are assigned to a catalog. Set your default in Settings â Default catalog. You can override this per-application when approving.
On standard plans, this setting maps to a sales channel â useful for stores running private wholesale sales channels alongside their public storefront.
Sender identity
Configure how emails appear in customers' inboxes:
- From name â The name shown in the inbox (e.g., "Acme Wholesale Team")
- From email â The sender email address (requires Resend domain verification â see below)
- Reply-to email â Where customer replies go (optional)
Sending from your own domain
To send emails from your own domain (e.g., wholesale@yourstore.com):
- Add your domain in our Resend account (we'll guide you)
- Add DNS records to your domain provider (SPF, DKIM, DMARC)
- Wait for verification (usually under 1 hour)
- Set the From email in Settings â Email templates â Sender settings
Without custom domain setup, emails are sent from wholesale@send.zilancer.com with your store name as the From name.
Webhooks
The app subscribes to several Shopify webhooks to keep data in sync:
| Topic | Purpose |
|---|---|
app/uninstalled | Trigger data deletion within 48 hours |
customers/data_request | GDPR â respond to customer data access requests |
customers/redact | GDPR â delete customer data on request |
shop/redact | GDPR â delete all shop data 48 hours after uninstall |
customers/update | Sync customer tag changes back to the app |
customers/delete | Mark application as deleted-customer when source customer is removed |
All webhooks are HMAC-verified before processing. Webhook failures are retried with exponential backoff up to 5 times.
Data model
The app stores the following primary entities:
Full schema is available on request for security audits and compliance reviews.
Troubleshooting
Form doesn't appear on storefront
- Verify the form is published (not just saved as draft)
- Check the theme app embed is enabled (Online Store â Themes â Customize â App embeds)
- Clear your browser cache and reload
Discount didn't sync to Shopify
- Check the rule's sync status badge â if "Failed", click Sync now to retry
- Verify the rule is enabled
- If using collection or product scope, verify the IDs exist in your store
Customer not getting wholesale price at checkout
- Confirm the customer has the matching tag on their Shopify customer record
- Verify the discount is "Active" in Shopify Discounts
- Check minimum order/quantity requirements aren't blocking it
- Make sure the customer is logged in at checkout (discounts only apply to logged-in customers with matching tags)
Approval emails not arriving
- Check the customer's spam folder
- Verify the approval email is enabled in Settings â Email templates
- If using a custom sender domain, confirm DNS records are still valid
Can't find a solution? Email contact@zilancer.com with your store URL and a description of the issue.
Uninstall & data deletion
When you uninstall ZS B2B Gateway:
- Shopify immediately revokes the app's access tokens
- Within 48 hours, we delete all your data from our systems
- Customer records, tags, and discounts already created in your Shopify store remain in your store â they belong to you
To request earlier or full data erasure at any time (including during installation), email contact@zilancer.com.
See our Privacy Policy for full details on data retention and your rights.