Ecommerce Plan — Industrial Consumables (30 SKUs)
Date: 2026-06-04 Architecture: Headless Shopify backend + static frontend channel sites Scale: ~30 SKUs, 1–4 channel sites, 1–3 items per order Inventory: No real-time tracking — manual sourcing / upward substitution
Contents
- Architecture Overview
- Content Strategy: Talking Human First
- Page Layout Spec
- Minimum Entry Point Pages (SEO + Agent Optimization)
- Cart & Checkout Flow
- Technical Build
- Content Inventory: Mapping SKUs to Perspectives
- Agent Search Optimization Notes
- Hosting & Deployment
- Build Order
1. Architecture Overview
┌──────────────────────────┐
│ Shopify Admin │
│ 30 products, orders, │
│ customers, fulfillment │
└────────────┬─────────────┘
│
Storefront API (GraphQL)
Public token — safe in JS
│
┌──────────────────────┼──────────────────────┐
│ │ │
┌─────┴──────┐ ┌─────┴──────┐ ┌─────┴──────┐
│ Channel A │ │ Channel B │ │ Channel C │
│ (use case) │ │ (material) │ │(compliance)│
│ static │ │ static │ │ static │
│ site │ │ site │ │ site │
└─────┬──────┘ └─────┬──────┘ └─────┬──────┘
│ │ │
┌─────┴──────┐ ┌─────┴──────┐ ┌─────┴──────┐
│ 8-10 pages │ │ 8-10 pages │ │ 8-10 pages │
│ per site │ │ per site │ │ per site │
└────────────┘ └────────────┘ └────────────┘
Core principle
One Shopify store. All 30 products live there with their variant IDs, prices, images, descriptions, and custom metafields (lead time, certifications, weight capacity).
Multiple static frontends. Each channel site is its own static site — pure HTML + CSS + JS, hosted on a different domain, with its own branding and content angle. They all call the same Storefront API.
Shared cart library. A single cart.js
is used across all sites. Add-to-cart buttons everywhere call the same
functions. The customer ends up on Shopify’s hosted checkout regardless
of which channel they started from.
2. Content Strategy: Talking Human First
The philosophy
Every SKU on the list has multiple identities:
| Perspective | A human says… |
|---|---|
| Use case | “I need liners that fit my 55-gallon drums for waste disposal” |
| Material | “I need 6mil poly, it has to be tough enough to not puncture” |
| Compliance | “It has to be food-grade FDA approved for my facility” |
| Size/fit | “My gaylords are 48x40, what liner fits?” |
| Budget | “What’s the cheapest 2mil bulk liner” |
Same product. Different language.
The content approach is simple: each entry point page is written for a specific human with a specific problem. No generic SEO mash. The copy assumes the reader knows their own industry and just needs to know whether this specific product fits their situation.
Voice guidelines
- Direct, not promotional. “This liner fits standard 48×40 gaylord boxes. It holds up to 1,350 lbs. It’s 2mil LLDPE.” Not “Revolutionary next-gen liner solution.”
- Specific always. Exact dimensions. Exact weight ratings. Exact compliance standards.
- Honest about lead times. “4-5 weeks typical” is fine. These aren’t Amazon.
- Upward substitution is a feature. “If you need it sooner, the 4mil equivalent (RL-TIOBB-BEE) is in stock. Slightly higher price, better durability.”
What authority looks like here
- Publishing actual dimension and fitment data (not hiding it behind “contact us”)
- Explaining the tradeoffs between mil thickness, material grade (EQ vs commercial), and cost
- Cross-referencing products across use cases transparently
- Upward substitution recommendations that save the customer a phone call
3. Page Layout Spec
All channel sites share the same basic layout template. Each page is a variation on this structure.
Layout wireframe
┌─────────────────────────────────────────────────────┐
│ [Logo] [Cart ICON] [Cart #] │ ← Header, lean
├─────────────────────────────────────────────────────┤
│ │
│ [ ] Skip to content │
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ H1: Use-case / problem headline │ │
│ │ Subtitle: 1-2 sentences framing the need │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ Hero / illustrative image or diagram │ │ ← Optional
│ └─────────────────────────────────────────────┘ │
│ │
│ ## The situation │
│ Body copy — 1-2 paragraphs. What problem this │
│ solves, who needs it, why it matters. │
│ │
│ ## What to look for │
│ Key specs, compliance marks, material properties │
│ that matter for this use case. │
│ │
│ ## Products for this job │
│ │
│ ┌────────────┬──────────┬──────┬───────┬──────┐ │
│ │ Item # │ Dims │ Mil │ Price │ Qty │ │ ← Table, sortable
│ ├────────────┼──────────┼──────┼───────┼──────┤ │ by price or
│ │ RL-TIOBB- │ 22×8×5.5 │ 2mil │ $11.21│ [2] │ │ thickness
│ │ LIE │ │ │ /ea │ [+] │ │
│ │ RL-TIOBB- │ 22×8×5.5 │ 4mil │ $15.19│ [1] │ │
│ │ BEE │ │ │ /ea │ [+] │ │
│ └────────────┴──────────┴──────┴───────┴──────┘ │
│ │
│ Each row: QTY selector + [Add to Cart] button │
│ │
│ ## Upward substitution note │
│ If you need it sooner/thicker — suggest alternatives │
│ │
│ ## Common questions about [topic] │
│ ┌─────────────────────────────────────────────┐ │
│ │ Q: Can this liner handle… │ │ ← FAQ schema
│ │ A: Yes, up to X lbs / No, use Y instead │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ [Footer: About us | All products | Contact] │
└─────────────────────────────────────────────────────┘
Key layout decisions
- No infinite scroll. These are considered purchases. Present the info, let them choose, add to cart.
- Product table is the hero component. On most category pages, the table of relevant SKUs is the core interaction. Clean, scannable, sortable by price/thickness.
- Cart is a simple slide-out or floating bubble. No full cart page needed. Just “X items added — [Checkout]”.
- Product detail is inline, not a separate page. For 30 SKUs, separate product detail pages per SKU aren’t worth it. The table + expandable row or tooltip covers depth.
- Copy comes first, tables second. The human needs to understand what they’re buying before they see prices. Table reinforces the decision.
4. Minimum Entry Point Pages (SEO + Agent Optimization)
The minimum viable set: 10 pages per channel site
These 10 pages cover the semantic landscape. Every search query or agent retrieval for an industrial liner question will find at least one page that answers it.
| # | Page | Perspective | Target keyword area |
|---|---|---|---|
| 1 | Home / All Products | Overview | industrial liners,
polyethylene bags bulk |
| 2 | Heavy-Duty Gaylord Box Liners | Use case | gaylord box liners,
bulk container liners |
| 3 | 55-Gallon Drum Liners | Use case | drum liners, 55 gallon drum inserts |
| 4 | Food Grade & FDA-Compliant Liners | Compliance | food grade liners,
FDA approved plastic bags |
| 5 | Chemical & Hazardous Material Liners | Compliance | chemical resistant liners,
hazmat containment bags |
| 6 | 2mil – 4mil Economy to General Purpose Liners | Material | 2mil poly liners,
lightweight industrial bags |
| 7 | 6mil – 10mil Heavy Duty & Extra Heavy Liners | Material | 6mil poly liners,
heavy duty industrial bags |
| 8 | Liner Size & Fit Guide | Educational | how to measure drum liner size,
gaylord box liner sizing |
| 9 | Dewatering & Sediment Control Bags | Use case | dewatering bags,
sediment control bags |
| 10 | Industrial Liner Material Guide (LDPE vs LLDPE vs HDPE) | Educational | polyethylene liner grades,
LLDPE vs LDPE strength |
Why 10?
- Semantic coverage. Every major search intent (use case / material / compliance / educational) has at least one page.
- Topic cluster density. Each page links to 2–4 other pages in the set. AI agents see a well-connected knowledge graph, not isolated pages.
- Content depth per page. 10 pages with 800–1,500 words of genuine expertise beats 30 pages with 200 words of fluff. Every word earns its place.
- Channel flexibility. Each channel site can emphasize a different subset. The compliance-focused channel leads with pages 4+5. The material-focused channel leads with 6+7. Same products. Different front door.
What each page needs to contain
Every entry point page needs:
- H1 that states the problem or use case in human language
- 200–400 word authoritative intro — who this is for, what problem it solves
- Product table — relevant SKUs with specs and add-to-cart
- 2–4 contextual subheadings — tradeoffs, substitution advice, best practices
- FAQ section — 3–5 real questions (with FAQ schema)
- Internal links — 2–4 links to related perspective pages
- Schema markup:
Productschema on each product row/tableFAQPageschema on Q&A sectionBreadcrumbListschemaArticleschema on the page itself
5. Cart & Checkout Flow
The JS cart approach (recommended)
A single shared cart.js handles everything before
checkout.
1. Page loads → cart.js initializes
2. User sees product info → reads copy → decides
3. User selects quantity → clicks [Add to Cart]
4. cart.js calls Storefront API → creates/updates Shopify cart
5. Mini cart appears → "2 items added" + subtotal + [Checkout]
6. User clicks [Checkout] → redirected to checkout.shopify.com
7. Shopify handles payment → creates order → shows in admin
Cart state
- Cart ID is stored in
localStorage(persists across page views within a session) - Mini cart shows: item count, subtotal, checkout button
- No cart persistence between sessions — if they close the tab, they start fresh
- This is fine for 1–3 item industrial orders
What the cart does NOT do
- ❌ No inventory checks (by design — you source/fill manually)
- ❌ No shipping calculation (Shopify checkout handles that)
- ❌ No tax calculation (Shopify checkout handles that)
- ❌ No coupon logic in JS (Shopify checkout handles that)
Why not the Buy Button?
The Shopify Buy Button can’t tell which channel site or perspective page the sale came from. With the Storefront API + JS cart, you can attach a channel identifier as a line item property:
addToCart(variantId, 2, { channel: 'compliance-site', page: 'food-grade-liners' })This metadata appears in the Shopify order admin. You know exactly where every order originated.
6. Technical Build
Shopify setup
| Task | Detail |
|---|---|
| Products | 30 products, each with name, SKU, price, weight, dimensions, images |
| Variants | Per-box pricing as a variant option if needed (box vs single) |
| Metafields | Custom fields: lead_time,
weight_capacity_lbs, mil_thickness,
material_grade, compliance_standards,
quantity_per_box |
| Collections | Grouped by: use case / material / compliance — for easy API filtering per channel |
| Storefront API | Enabled. Public access token generated. |
Frontend stack
| Layer | Choice | Why |
|---|---|---|
| Hosting | Netlify or Cloudflare Pages | Free tier, global CDN, deploy from git |
| Framework | No framework — plain HTML + CSS + JS | They’re effectively brochure sites with a cart. No build step, no framework churn. |
| CSS | Simple utility-light approach or a small custom CSS file | Under 10KB |
| JS | One cart.js file + page-specific scripts |
Cart logic shared across all pages and all channel sites |
| Build tools | None needed | Pure static files. Edit → deploy. |
Directory structure (one channel site)
channel-a.com/
├── index.html
├── gaylord-box-liners.html
├── drum-liners.html
├── food-grade-liners.html
├── chemical-liners.html
├── economy-liners-2-to-4-mil.html
├── heavy-duty-liners-6-to-10-mil.html
├── liner-size-guide.html
├── dewatering-bags.html
├── liner-material-guide.html
├── css/
│ └── style.css
├── js/
│ ├── cart.js ← shared across all sites
│ └── site-config.js ← channel-specific config (brand, collection filter)
└── images/
Multi-channel config
Each channel site has a site-config.js:
window.SITE_CONFIG = {
name: 'Industrial Liner Co',
shopifyDomain: 'your-store.myshopify.com',
storefrontToken: 'abc123...',
channelId: 'compliance-site',
collectionHandle: 'food-grade', // optional — filter products
accentColor: '#2b6cb0',
logoUrl: '/images/logo.png',
}The cart.js reads window.SITE_CONFIG to know which store
to talk to and what channel metadata to attach to orders.
7. Content Inventory: Mapping SKUs to Perspectives
Product categories (derived from SKU prefixes)
| Prefix | Type | Count |
|---|---|---|
| RL- | Roll-form liners (continuous on rolls) | 17 |
| DL- | Drum liners (pre-made, individual) | 7 |
| DSL- | Specialty bags (dewatering?) | 2 |
Dimension clusters
| Size range | Typical use | SKUs |
|---|---|---|
| 22” × 8” × 5.5” (standard) | 55-gal drums, standard gaylord boxes | ~12 |
| 24” × 8” × 5.5–6.3” | Oversized drums | ~3 |
| 33.5” × 8” × 6” | Large drums, totes | ~2 |
| 37–39” × 8–8.5” × 5.5–9” | Extra-large drums, specialty | ~5 |
Thickness spectrum
| Mil | Grade | Typical use |
|---|---|---|
| 2mil | Economy (EQ) | Lightweight, single-use, non-critical |
| 3mil | General purpose | Standard industrial, food contact |
| 4mil | Heavy duty | Puncture risk, moderate loads |
| 6mil | Extra heavy | Sharp contents, high loads |
| 8–10mil | Super duty | Extreme conditions, hazmat |
| 90 GSM | Non-woven specialty | Dewatering, filtration |
Compliance tiers
| Tier | SKUs | Standards |
|---|---|---|
| Food grade | Select RL- and DL- items | FDA 21 CFR, USDA |
| General industrial | Majority | ASTM D… |
| Chemical containment | Heavy mil items | EPA, DOT related |
8. Agent Search Optimization Notes
“Agent Search Optimization” (LLM / AI chat retrieval) values different signals than traditional SEO. Here’s what matters.
For traditional SEO
- Keyword alignment (covered by 10 topic pages)
- Backlinks → authoritativeness
- Page speed / Core Web Vitals
- Meta descriptions, title tags, heading structure
For AI / LLM retrieval (ChatGPT, Perplexity, Gemini, Claude)
| Signal | How we address it |
|---|---|
| Clean heading hierarchy | Every page has a clear H1 → H2 → H3 structure. Not just for skimming — agents parse heading trees to understand page structure. |
| Specific facts in natural language | “55-gallon drum liners weigh up to 1,350 lbs and fit standard 22×8×5.5 openings.” Not “heavy duty.” Specifics. |
| Structured data | Product schema, FAQ schema, Article schema. Agents use this as ground truth. |
| FAQ sections | FAQPage schema is probably the single highest-value structured data format for AI retrieval. Each page gets 3–5 real questions with answers. |
| Topic cluster linking | Internal links between perspective pages. Agents follow these to understand breadth of expertise. |
| Authoritative but not promotional | AI models are tuned to favor neutral, expert-sounding content over marketing copy. Our “authority” approach fits this naturally. |
| Clear entity references | “Polyethylene (PE)”, “Linear Low-Density Polyethylene (LLDPE)”, “FDA 21 CFR 177.1520” — naming actual entities improves agent comprehension. |
| No fluff, no padding | Agents penalize content that wastes tokens. Every paragraph earns its place. |
Specific file for agent consumption
Optional: an /llms.txt file at the root
of each site. This is a proposed standard (llmstxt.org) that gives AI
agents a map of the site’s most important pages.
# Industrial Liner Co
> Expert resources for industrial polyethylene liners and bags.
## Essential pages
- [All products](/)
- [Heavy-Duty Gaylord Box Liners](/gaylord-box-liners)
- [55-Gallon Drum Liners](/drum-liners)
- [Food Grade & FDA-Compliant Liners](/food-grade-liners)
- [Liner Size & Fit Guide](/liner-size-guide)
- [Industrial Liner Material Guide](/liner-material-guide)
## About
We manufacture and supply industrial polyethylene liners...
9. Hosting & Deployment
| Channel | Domain | Hosting | Cost |
|---|---|---|---|
| Shopify backend | store.myshopify.com |
Shopify | $39/mo |
| Channel A | example.com |
Netlify/Cloudflare Pages | Free |
| Channel B | brand2.com |
Netlify/Cloudflare Pages | Free |
| Channel C | brand3.com |
Netlify/Cloudflare Pages | Free |
| Channel D | brand4.com |
Netlify/Cloudflare Pages | Free |
Deployment: push to git → auto-deploys. Zero server maintenance.
10. Build Order
Phase 1: Shopify foundation (2-3 days)
Phase 2: Cart library + template (2-3 days)
Phase 3: Content (ongoing, 3-5 days for first channel)
Phase 4: Additional channels (1-2 days each)
Phase 5: Refine
Open questions to resolve
- Per-box pricing. Some SKUs show “Per Box” quantities (2, 3, 4). Is the Shopify price per piece, per box, or should there be a box qty selector?
- “CORE” variants. The RL-TIOBB-HECS CORE is dimensionally identical to RL-TIOBB-HECS but different pricing/stock. Single product with variant option, or separate product?
- One vs multiple stores. One Shopify store for all channels is assumed. Confirm if any channel needs truly separate pricing or catalog.
- Lead time updates. Static text on pages or pull from Shopify metafields (requires API call)?
- Image assets. Do you have or need product images for all 30 SKUs?