> For the complete documentation index, see [llms.txt](https://crushsuite.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://crushsuite.gitbook.io/docs/compliance/storefront-and-checkout/how-pre-checkout-compliance-works.md).

# How Pre-Checkout Compliance Works

***

### The Compliance Flow

When a customer visits your store, CrushSuite runs a series of compliance checks throughout their shopping experience — not just at checkout. The goal is to give customers clear information early so they're never surprised by a restriction at the last step.

#### 1. Store Entry — State & Age

When a customer first visits your store, the **Entry Pop-Up Modal** appears (if enabled). It asks two questions:

* **Are you 21 or older?** — Required for legal alcohol purchases in all U.S. states
* **What state are you shipping to?** — Determines which products are available and what fees apply

Once confirmed, CrushSuite stores these preferences for the session. The customer doesn't see the modal again unless they clear their browser data.

<figure><img src="/files/FudPTVVt63syRyMaT3St" alt=""><figcaption></figcaption></figure>

#### 2. Browsing — Real-Time Product Availability

As the customer browses your store, CrushSuite dynamically controls what they see:

* **Available products** display normally with full "Add to Cart" functionality
* **Restricted products** show a compliance message (e.g., "This wine cannot be shipped to your state") or a visual indicator badge
* **Collection pages** show compliance badges on restricted product thumbnails

If the customer changes their shipping state (using the floating shipping button), product availability updates instantly — no page reload needed.

#### 3. Cart — Fee Calculation

When the customer adds wine to their cart, CrushSuite calculates:

* **State alcohol fees** based on the customer's state and the bottles in their cart (see Setting Up State Alcohol Fees)
* The fee appears as a **separate line item** in the cart

#### 4. Checkout — Final Validation

When the customer clicks checkout, CrushSuite presents the **compliance form** — shown as a slide-in **drawer** or a centered **modal**, your choice. It collects and verifies everything needed before payment:

* **Age verification** — date of birth confirms the customer is 21 or older
* **Billing & shipping address** — entered with predictive autofill (a single "Same as Shipping Address" checkbox reuses billing); the destination is validated for wine delivery (not a P.O. box in a restricted area, not a dry county)
* **State compliance check** — verifies the order doesn't violate any state-specific rules (quantity limits, product restrictions)

If everything passes, the customer is sent into Shopify's native payment flow with their details pre-filled, the order is placed, and CrushSuite syncs it to Vinoshipper (or your self-managed fulfillment system). If a check fails, the form shows a clear **non-compliance** message explaining what to fix — the customer is never silently blocked.

You control whether this form runs (it's on by default) and whether carts with no compliance-tracked products skip it. See Customizing the Compliance UI for all options.

#### 5. Post-Checkout — Order Sync

After a successful purchase:

* **Vinoshipper users:** The order syncs automatically to Vinoshipper for fulfillment
* **Self-compliance users:** The order appears in your Shopify orders dashboard for manual fulfillment

***

### What Happens When a Check Fails

CrushSuite never silently blocks a customer. When a compliance check fails, the customer sees a clear, human-readable explanation:

| Failure Type            | What the Customer Sees                                     |
| ----------------------- | ---------------------------------------------------------- |
| Underage (under 21)     | "You must be 21 or older to purchase alcohol."             |
| Restricted state        | "We're unable to ship to \[state]." or customized message  |
| Invalid address         | "We can't verify this address for wine delivery."          |
| Quantity limit exceeded | A message explaining the state's per-order or annual limit |

These messages are designed to inform — not frustrate. The customer can change their shipping state, update their address, or adjust their cart to resolve the issue.

***

### The Customer Journey — Start to Finish

Here's the full experience from a customer's perspective:

1. **Land on your store** → See the entry pop-up, confirm age, select state
2. **Browse products** → Available wines display normally, restricted ones are clearly marked
3. **Add to cart** → Alcohol fees calculated and displayed as a line item
4. **Click checkout** → Complete the compliance form (age, billing, shipping), pre-filled where possible
5. **Proceed to payment** → Address validated, compliance verified, details carried into Shopify checkout
6. **Complete payment** → Standard Shopify checkout, order confirmed
7. **Receive confirmation** → Order details and tracking information

At no point does the customer leave your Shopify store. The entire experience happens natively within your theme.

***

### Customizing the Experience

Every customer-facing element of the compliance flow is customizable through your app embed settings:

* **Entry modal** — title, subtitle, logo, description text
* **Shipping button** — color, position, visibility
* **Product page messages** — cannot-purchase text, state list display
* **Collection badges** — color, size, position
* **Compliance form** — display style (drawer or modal), brand colors, fonts, corner radius, all on-screen copy (including the success and non-compliance messages), plus bypass options

See the individual embed guides in this section for detailed customization options.
