{{-- Quick Nav ──────────────────────────────────────────────────────────── --}}
Jump to: @php $sections = [ ['getting-started', '🚀', 'Getting Started', '#2563eb'], ['products', '📦', 'Products', '#16a34a'], ['categories', '📁', 'Categories', '#7c3aed'], ['suppliers', '🚚', 'Suppliers', '#ea580c'], ['shipping', '📬', 'Shipping', '#0891b2'], ['coupons', '🏷️', 'Coupons', '#dc2626'], ['orders', '🧾', 'Orders', '#d97706'], ['returns', '↩️', 'Returns (RMA)', '#0369a1'], ['refunds', '💸', 'Refunds', '#7c3aed'], ['site-settings', '⚙️', 'Settings', '#475569'], ['branding', '🎨', 'Branding', '#db2777'], ['stripe', '💳', 'Stripe', '#4f46e5'], ['storefront', '🛒', 'Storefront', '#059669'], ['staff', '👥', 'Staff', '#0d9488'], ['reviews', '⭐', 'Reviews', '#ca8a04'], ['analytics', '📊', 'Analytics', '#0ea5e9'], ['developer-api', '🔌', 'Developer API', '#6366f1'], ['faq', '❓', 'FAQ', '#e11d48'], ]; @endphp @foreach($sections as [$id, $emoji, $label, $color]) {{ $emoji }} {{ $label }} @endforeach
{{-- 1. Getting Started ─────────────────────────────────────────────────── --}}

Welcome to your ECStores Admin Panel. This is where you manage everything about your online store — products, orders, appearance, and payment settings. Your customers never see this panel; they only see your store at your-store.ecstores.ca.

What's in the sidebar?

Menu ItemWhat it does
📦 ProductsAdd, edit, and manage everything you sell.
📁 CategoriesGroup your products so customers can filter by type.
🚚 SuppliersTrack the businesses you buy your products from.
📬 Shipping MethodsSet up shipping options. Flat rate on all plans; weight-based pricing and free shipping threshold on Growth and Pro.
🏷️ CouponsCreate coupon codes and discounts for customers. Available on Growth and Pro plans.
🧾 OrdersView and manage every order placed in your store. Issue refunds and manage returns directly from the order page (Pro plan).
👤 CustomersView customer profiles, purchase history, and lifetime value. CLV analytics require Pro plan.
↩️ Returns (RMA)View all return requests across your store — RMA numbers, statuses, and linked refunds. Pro plan only.
⚙️ Site SettingsConfigure store name, currency, tax rate, free shipping threshold, and policies.
🎨 Branding StudioCustomize colours, fonts, logo, and style.
💳 PaymentsView your Stripe connection status (you connect in your ECW portal).
📊 Financial ReportsView sales stats, top-selling products, and export reports. Detail level and exports depend on your subscription plan.
❓ Help CenterThis page — step-by-step guides for everything.

✅ First-Time Setup Checklist

Work through these in order to get your store ready to sell:

    @foreach([ ['💳 Connect Stripe', 'In your ECW client portal → Merchant Payments, connect your Stripe account so you can receive payment. Status shows here under Settings → Payments.'], ['⚙️ Configure your store', 'Go to Site Settings — set your store name, currency, and tax rate.'], ['🎨 Set up your branding', 'Go to Branding Studio — upload your logo, set brand colours and font.'], ['📁 Create categories', 'Go to Categories — add groupings for your products (e.g., "Shirts", "Accessories").'], ['📬 Set up shipping', 'Go to Shipping Methods — add at least one shipping option with a price.'], ['📦 Add your products', 'Go to Products — add your items with images, prices, and descriptions.'], ['🛒 Test your store', 'Visit your store URL, add a product to the cart, and test the full checkout flow.'], ] as $i => [$title, $desc])
  1. {{ $i + 1 }} {{ $title }} — {!! $desc !!}
  2. @endforeach
💡 Tip: You can come back and change any setting at any time. Nothing is locked in.
{{-- 2. Products ─────────────────────────────────────────────────────────── --}}

Products are the items you sell. Each product can have images, a price, description, inventory count, and variants (like sizes or colours).

📋 Plan Limits: Starter — 50 products  ·  Growth — 250 products  ·  Pro — unlimited. When you reach your limit, the "New Product" button is hidden. Existing products are never removed if you downgrade. Your plan also includes a media-storage allowance (Starter 250 MB · Growth 1 GB · Pro 5 GB) and staff seats (1 / 3 / 10) — see your dashboard usage meters.

Viewing Your Products

Click Products in the sidebar to see a table of all your products. From here you can:

  • 🔍Search by typing a product name into the search bar.
  • 🔽Filter by category or status using the Filters button.
  • ✏️Edit by clicking the row or the pencil icon.
  • 🗑️Delete a single product from its row actions or its Edit page, or several at once by ticking checkboxes and choosing Delete from bulk actions.

Restoring a Deleted Product

Deleting a product moves it to the Trash — it disappears from your storefront and product list, but its details (name, price, images, variants) are kept so you can bring it back.

  • 1️⃣On the Products page, click Filters and set Deleted records (the Trashed filter) to With deleted or Only deleted.
  • 2️⃣Find the product, then click Restore (the row action, or the Restore button on its Edit page). It immediately returns to your active products and storefront with all original data intact.
  • ♻️To bulk-restore, tick several deleted products and choose Restore from bulk actions.
⚠️ Force delete (also available under the Trashed view and bulk actions) permanently removes a product and cannot be undone. Use it only when you are sure you will never need the product again.

Adding a New Product

Click New Product (top right). Fill in the form sections from top to bottom:

@foreach([ ['Images', 'Upload photos. Drag to reorder — the first image is the main photo. Up to 10 images per product.'], ['Name', 'The display name customers see on your storefront. Keep it clear and descriptive.'], ['Slug', 'Auto-filled from the name when you first create the product — used in the product\'s web address. It then stays the same even if you rename the product, so existing links keep working. You can edit it manually if you really need to change the URL.'], ['Category', 'Assign a category (e.g., "Accessories"). Set up categories first for best results.'], ['SKU', 'Optional internal product code (e.g., "WS-BUR-001"). Useful for real-world inventory tracking.'], ['Description', 'Tell customers what the product is, what it\'s made of, and why they\'ll love it.'], ] as [$field, $desc])

{{ $field }}

{{ $desc }}

@endforeach
⚠️ A product will not appear on your storefront if its Discontinued toggle is on. Make sure Discontinued is off before saving.

Pricing & Sale Prices

Regular Price *

The normal selling price. Enter a number without the dollar sign (e.g., 24.99). Always required.

Sale Price

Optional. Must be lower than the Regular Price. On your storefront the sale price shows highlighted and the regular price appears crossed out.

Is On Sale toggle

Turn On to activate the sale price on your storefront. Turn Off to show only the regular price — even if a sale price is saved. Lets you prepare a sale in advance.

Inventory Tracking

Units in Stock

How many you have available. Decrements automatically when a customer buys (only if Track Inventory is on).

Track Inventory

Turn On to show "Out of Stock" when stock reaches zero. Turn Off for unlimited/made-to-order products.

Allow Overselling

Only applies when Track Inventory is On. Allows orders even when stock is zero — useful for pre-orders or quick-restock items.

💡 If you're just getting started, leave Track Inventory Off. You can turn it on later.

📬 Per-Product Shipping Settings

Each product has three shipping options in the Shipping section of the product form (scroll down past Inventory):

Ships Free

When On, this product does not trigger a base shipping charge. If every item in the cart is set to Ship Free, base shipping is waived entirely at checkout.

Count Toward Free Shipping Threshold

When On (default), this item's price counts toward the store-wide free shipping threshold. Turn Off for items you do not want to trigger free shipping on the rest of the cart.

Separate Shipment Cost

Adds a fixed per-quantity shipping charge regardless of the normal shipping method (e.g., $25.00 for an oversized item that ships on its own). Shown as a separate line at checkout. Leave blank to use standard shipping rules for this product.

Product Variants (Sizes, Colours, etc.)

Variants let a single product be offered in multiple options (e.g., a T-shirt in Small/Medium/Large). The Variants section in the product form is collapsed by default — click to expand.

🏷️ Growth plan or higher required. The Variants section is visible only on Growth and Pro plans. On Starter it is hidden — existing variant data is preserved if you downgrade, but you cannot add new variant groups.

Variant Group

A dimension of choice — e.g., "Size", "Colour", "Scent". You can have multiple groups on one product.

Variant Option

A value within a group — e.g., "Small", "Medium", "Large" within a "Size" group.

  1. 1Open the Variants section. Click "Add variant group".
  2. 2Type the group name (e.g., Size).
  3. 3Click "Add option" and type each option (e.g., Small, Medium, Large).
  4. 4To add a second group (e.g., Colour), click "Add variant group" again and repeat.
  5. 5Save the product. The system auto-generates all combinations (e.g., Small/Red, Medium/Blue).
  6. 6Re-open the product after saving. Scroll to the Combinations table to set per-variant stock counts if needed.
🏷️ Every group needs at least one option. If you add a group but leave it with no options, saving shows the prompt "Add at least one option to this variant group (or remove the group)." An option-less group is also ignored by Generate Combinations — you'll see a warning naming the skipped group instead of empty/invalid combinations being created.

Featured & Discontinued

⭐ Featured

Shows the product in a "Featured Products" spotlight section at the top of your homepage.

🚫 Discontinued

Hides the product from your storefront. The product stays saved in your admin so you can bring it back later.

⚠️ Deletion is permanent. If you just want to hide a product temporarily, use the Discontinued toggle instead of deleting it.
{{-- 3. Categories ───────────────────────────────────────────────────────── --}}

Categories are groupings for your products. Customers can click a category name on your storefront to filter the product grid — e.g., "Candles", "Jewellery", "Home Decor".

Creating a Category

  1. 1Click Categories in the sidebar → New Category.
  2. 2Enter the Name. The Slug is auto-generated — no need to change it.
  3. 3Optionally add a Description and a Sort Order number (lower = appears first in the filter).
  4. 4Click Create Category. Then assign products to it from each product's form.
💡 Create your categories before adding products, so you can assign them during product creation.

Deleting a Category

Open the category and click Delete (confirm when prompted). Any products in that category are not deleted — they simply become uncategorised (their Category field is cleared) and stay visible on your storefront. Re-assign them to another category from each product's form when you're ready.

{{-- 4. Suppliers ─────────────────────────────────────────────────────────── --}}

Suppliers are the companies or people you purchase products from. This is for your own reference only — customers never see supplier information. You can link a supplier to a product to always know at a glance where it comes from.

Adding a Supplier

  1. 1Click Suppliers → New Supplier.
  2. 2Enter the supplier's Name (required). All other fields are optional.
  3. 3Fill in Contact Email, Phone, Contact Person, and Payment Terms as needed.
  4. 4Click Create Supplier. You can now assign it to products in the product form.

Deleting a Supplier

Deleting a supplier does not delete its products. Any products linked to it simply have their Supplier field cleared and remain in your catalogue.

{{-- 5. Shipping Methods ──────────────────────────────────────────────────── --}}

Shipping Methods are the delivery options customers choose at checkout. All plans support flat-rate methods. Growth and Pro plans also support weight-based pricing, a free-shipping threshold, and per-product separate shipment costs.

⚠️ If you have no shipping methods set up, customers cannot complete checkout. Add at least one before opening your store.

Flat Rate Shipping

Available on all plans. A single fixed price is charged regardless of cart contents.

  1. 1Click Shipping Methods → New Shipping Method.
  2. 2Enter a Name — what the customer sees (e.g., "Standard Shipping", "Local Pickup").
  3. 3Enter a Description — optional but helpful (e.g., "Arrives in 5–7 business days").
  4. 4Leave Pricing Type as Flat Rate. Enter the Price — use 0 for free.
  5. 5Click Create Shipping Method.

Free Shipping

Name: "Free Shipping"
Description: "3–5 business days"
Price: $0.00

Flat Rate

Name: "Standard Shipping"
Description: "Via Canada Post"
Price: $12.99

Local Pickup

Name: "Local Pickup"
Description: "Pick up in Halifax"
Price: $0.00

Weight-Based Shipping Growth+

Charge different rates depending on the total weight of items in the cart. Define weight tiers — each tier has a minimum weight, an optional maximum weight, and a price.

  1. 1Click New Shipping Method → set Pricing Type to Weight-Based.
  2. 2The flat rate price field is hidden. Click Add Weight Tier.
  3. 3Set Min Weight (kg), Max Weight (kg), and Price. Leave Max Weight blank on the last tier to catch all heavier carts.
  4. 4Add as many tiers as you need. Tiers are inclusive of Min and exclusive of Max (e.g., 0–5 kg = $8, 5–10 kg = $13, 10+ kg = $20).
  5. 5Save. The system automatically selects the correct tier at checkout based on cart weight.
💡 Products need a Weight (kg) value set in their Inventory section for weight-based shipping to work correctly. Items with no weight are counted as 0 kg.

Free Shipping Threshold Growth+

Set a minimum order amount that, once reached, waives the base shipping charge automatically. Configure this in Site Settings → Free Shipping.

How Threshold Works

When the qualifying items in the cart reach or exceed the threshold (e.g., $75), base shipping becomes free. Items with Count Toward Threshold turned off are excluded from this calculation. Items with their own Separate Shipment Cost are still charged those costs even when the threshold is met.

{{-- 6. Coupons ───────────────────────────────────────────────────────────── --}}
🏷️ Growth plan or higher required. If you are on the Starter plan, this section shows a notification and coupons cannot be created. Upgrade to Growth or Pro to unlock coupons.

Coupons let you offer customers a discount code they enter at checkout. You control the amount, whether it is a flat dollar discount or a percentage, and when it expires.

Creating a Coupon

  1. 1Click Coupons in the sidebar → New Coupon.
  2. 2Enter a Code — what customers type at checkout (e.g., SUMMER20). Codes are stored in uppercase automatically.
  3. 3Choose the Discount Type: Fixed Amount (e.g., $10 off) or Percentage (e.g., 15% off).
  4. 4Enter the Discount Value — the dollar amount or the percentage number.
  5. 5Optionally set: Minimum Order Amount, Expiry Date, and Max Uses.
  6. 6Make sure the Active toggle is On. Save the coupon.

Coupon Fields Explained

Minimum Order Amount

Optional. The coupon will only apply if the cart subtotal is at or above this amount. Leave blank to allow the coupon on any order value.

Expiry Date

Optional. After this date the coupon is invalid and customers will see an "expired" error at checkout. Leave blank for no expiry.

Max Uses

Optional. Limits how many total times the coupon can be used across all orders. Once the limit is reached, the coupon stops working automatically. Leave blank for unlimited uses.

How Customers Use Coupons

At checkout, Step 3 (Order Review) shows a coupon code field. Customers type their code and click Apply. The discount appears immediately in the order summary. Only one coupon can be applied per order.

💡 Tip: Percentage coupons are applied to the cart subtotal only — not to shipping or tax. Flat-amount coupons reduce the subtotal directly; if the discount exceeds the subtotal, the order total is capped at $0.
{{-- 7. Orders ───────────────────────────────────────────────────────────── --}}

When a customer completes checkout, an order is created here. This is where you manage fulfillment, update statuses, and communicate with customers.

Reading the Order List

  • 🔢Order ID — unique number for this order.
  • 👤Customer Name — name entered at checkout.
  • 🏷️Status — colour-coded badge showing where the order is.
  • 💰Total — full amount paid including shipping and tax.
  • 📅Order Date — when the order was placed.

Order Statuses Explained

StatusWhat it meansWhat to do
PendingOrder placed, payment not confirmed yet.Wait for payment. If never received, cancel the order.
ProcessingPayment received, order being prepared.Pick, pack, and prepare items for shipping.
ShippedOrder has been dispatched.Use the Mark as shipped button to record the carrier + tracking and email the customer automatically.
CancelledOrder was cancelled.Contact customer and arrange a refund if they paid.
Return RequestedA return (RMA) has been created and is waiting for the items to arrive.Share return shipping instructions with the customer. Click Mark Return Received when items arrive.
Return ReceivedReturned items have been received and inspected.Issue a refund using the Refund button. The return request closes automatically.
Partially RefundedA partial refund has been issued — the order is still partially paid.Issue additional refunds if needed from the order page.
RefundedThe full order amount has been refunded.No further action needed. Refund was processed through your admin.

Opening and Updating an Order

  1. 1Click on any order row to open the order detail page.
  2. 2Review the customer's contact info, billing/shipping address, and item list.
  3. 3Change the Status dropdown to the new status (e.g., Processing once payment confirmed).
  4. 4Click Save changes.
⚠️ Unusual status changes. If you pick a status that skips the normal flow (for example jumping a Pending order straight to Return Received, or moving a Refunded order backwards), a warning appears with a "Yes, apply this unusual status change" toggle. Saving is blocked until you tick it — this prevents accidental status corruption while still letting you override on purpose. Normal steps (Pending → Processing → Shipped, or Cancelled) save without any prompt. Tip: use the Request Return, Mark Return Received, and Refund buttons for those statuses so the matching return/refund records are created automatically.

📦 Marking an Order Shipped (with Tracking)

Instead of changing the status by hand, use the Mark as shipped button (on the order page and in the orders list; it appears while an order is Pending or Processing). It does three things at once:

  1. 1Click Mark as shipped.
  2. 2Optionally choose a Carrier (Canada Post, Purolator, UPS, FedEx, Canpar, DHL, USPS) and enter a Tracking number. Both are optional.
  3. 3Click Submit. The order becomes Shipped with today's date, and the customer is emailed a shipping notification.
💡 If you picked a known carrier, the customer's email includes a one-click Track your package button linking straight to that carrier's tracking page. If you leave the carrier blank, the email shows the tracking number as plain text. Leave both fields empty to simply tell the customer it's on the way.

Notes to Customers

The Note to Buyer field on the order edit page shows the customer a message when they check their order history — useful for delivery estimates or anything the automatic emails don't cover.

💸 Issuing a Refund Pro

🏷️ Pro plan required. The Refund button only appears on Pro plan stores. On Starter and Growth, refunds must be processed manually in your Stripe dashboard.

To issue a refund, open the order and click the Refund button at the top right of the page. A panel opens with these options:

Stripe — Original Payment

Returns money to the customer's card via Stripe automatically. Requires that the order was paid via Stripe. The refund appears on their bank statement within 5–10 business days.

Manual — E-transfer / Cash

Records a refund that you process yourself outside the system (e-transfer, cash, cheque). No automatic Stripe action is taken.

Store Credit — Generates a Coupon Code

Automatically creates a single-use coupon code worth the refund amount. The code is emailed to the customer (if you enable the notification) and also appears in your Coupons list. The customer enters it at checkout like any coupon. The code is locked to that customer — only the email it was issued to can redeem it, so a forwarded or leaked code won't work for anyone else.

Enter the Refund Amount (up to the unpaid balance), choose a Reason, and optionally turn on Notify customer by email to send them a refund confirmation. Click Issue Refund to confirm.

💡 Partial refunds are supported — enter any amount up to the order total. The order status changes to Partially Refunded until the full amount is refunded, then moves to Refunded.

📥 Returning Items to Inventory

The Refund panel has a Return items to inventory switch. Turn it on to add the refunded items back to your stock counts:

  • ✅Each line is prefilled with how many units can still be returned. Leave them as-is to restock a full return, or edit the Qty to restock down for a partial return (e.g. the customer kept one of three).
  • 🚫Leave the switch off for a goodwill refund or an item the customer keeps — no stock is returned.
  • 🔁Stock is never returned twice: if you restock a partial refund and later refund the rest, only the remaining units are added back.
💡 Cancelling before shipping also returns stock automatically: change a Pending or Processing order to Cancelled and save. Cancelling an order that already shipped does not restock (the goods already left).

↩️ Requesting a Return (RMA) Pro

🏷️ Pro plan required. Return management is available on the Pro plan only.

When a customer needs to return items, open their order and click Request Return (visible on Processing, Shipped, and Partially Refunded orders). This creates an RMA (Return Merchandise Authorization). See the ↩️ Returns (RMA) section below for full details.

{{-- 8. Returns (RMA) ──────────────────────────────────────────────────────── --}}
🏷️ Pro plan required. Return management (RMA) is a Pro plan feature. On Starter and Growth plans, the Returns (RMA) section shows a notification. The Request Return and Mark Return Received buttons do not appear on orders.

An RMA (Return Merchandise Authorization) is a tracked return request. When a customer needs to send something back, you create an RMA on their order. The system assigns a unique RMA number (e.g., RMA-AB12CD), tracks the items coming back, and links to the refund once it is processed.

Return Workflow — Step by Step

StepWhat you doOrder status after
1. Request ReturnOpen the order → click Request Return. Fill in the reason, select items and quantities, optionally email the customer.Return Requested
2. Mark Return ReceivedWhen the items arrive, open the order → click Mark Return Received. Confirm quantities received. Optionally email the customer.Return Received
3. Issue RefundClick Refund → choose Stripe, Manual, or Store Credit. The return request closes automatically.Refunded or Partially Refunded

Step 1 — Creating a Return Request

  1. 1Open the order (must be in Processing, Shipped, or Partially Refunded status).
  2. 2Click Request Return in the header buttons (top right of the order page).
  3. 3Choose a Return Reason: Defective Product, Wrong Item Shipped, Customer Request, or Other.
  4. 4In the Items to Return list, enter the Return Qty for each item being returned. Set to 0 for items staying with the customer.
  5. 5Optionally enter a Return Tracking Number (if you provided the customer with a return label) and any Internal Notes (not visible to customer).
  6. 6Turn on Notify customer by email to send them an acknowledgement email with the RMA number. You can include a custom message (e.g., return shipping instructions).
  7. 7Click Create Return. The order status changes to Return Requested and the RMA is assigned a number.

Step 2 — Marking Items as Received

  1. 1When the returned items arrive, open the order (must be in Return Requested status).
  2. 2Click Mark Return Received. The panel shows the expected items with pre-filled quantities.
  3. 3Adjust the Received Qty for each item if anything is missing or damaged.
  4. 4Turn on Notify customer by email if you want to let them know their return arrived.
  5. 5Click Confirm Receipt. The order status changes to Return Received.
💡 After marking received, use the Refund button to issue the refund. The return request closes and links to the refund automatically.

Returns (RMA) List Page

Click Returns (RMA) in the sidebar to see all return requests across all orders in one place. You can filter by status:

Requested

Return created — awaiting the physical items.

Return Received

Items are in your hands — ready to refund.

Completed

Refund issued and return closed.

Rejected

Return was declined.

Each row links to the original order where you can take action.

{{-- 10. Site Settings ─────────────────────────────────────────────────────── --}}

Go to Settings → Site Settings. After making changes, always click Save Settings at the bottom.

Store Information

Store Name — Appears in the header and customer emails.
Contact Phone — Shown to customers in the storefront footer. Optional.
Use my account email as the storefront contact email — When this toggle is On, your storefront shows your login email as the contact. Turn it Off to enter a separate Contact Email that displays instead.
Slogan — Short tagline shown below your store name. Optional.
Contact / Business Address — Shown to customers in the storefront footer. Optional.

Currency & Tax

Currency — CAD, USD, EUR, or GBP. Changing it auto-fills the symbol.
Currency Symbol — Shown next to prices (e.g., CA$, £). You can override it.
Collect Tax (toggle) — Enable to automatically add tax to every order at checkout.
Tax Rate (%) — The percentage to add (e.g., 15 for 15% Nova Scotia HST).
Tax Registration Number — Optional. Shown on order receipts if set.

⚠️ If you're unsure what tax rate to charge, consult an accountant or review the Canada Revenue Agency guidelines for your province.

Free Shipping Threshold Growth+

Enter a dollar amount (e.g., 75.00). When qualifying items in the cart reach or exceed this total, base shipping is automatically waived at checkout. Leave blank to disable. Items with Count Toward Threshold turned off on their product page are excluded from the calculation.

Require Account to Check Out

Off (default): Customers check out as guests — no account needed. Recommended for most stores.
On: A customer who reaches checkout without being signed in is asked to sign in or create an account first, then returns straight to checkout. The cart page also tells guests an account will be needed.

Policies

Enter your Shipping Policy, Return Policy, and Privacy Policy. They appear (each in its own section) on your storefront's Store Policies page (/policies), linked in the footer of every page; while all three are blank the page and link are hidden. Be specific — clear policies reduce disputes and build trust.
Privacy Policy — explain what customer data you collect, why, and how you protect it. Strongly recommended if you collect personal information, and expected under Canada's PIPEDA if you use analytics or marketing pixels (e.g. Google Analytics or a Meta pixel).

{{-- 11. Branding Studio ───────────────────────────────────────────────────── --}}

Go to Settings → Branding Studio. After changes, click Save and visit your store to see the result.

🎨 Brand Colours

Five colour slots. Click to open a colour wheel or type a 6-digit hex code (e.g., #005888). Hex codes must be a # followed by exactly six characters 0–9/A–F — if you enter anything else, you'll see a "6-digit hex colour" prompt and the colour won't save.

@foreach([ ['Primary', 'Main brand colour — buttons, links, active states.'], ['Secondary', 'Supporting colour — hover states and secondary elements.'], ['Accent', 'Highlight colour — sale badges, featured labels.'], ['Background', 'Storefront page background. Usually white or near-white.'], ['Text', 'Default body text colour. Usually near-black for readability.'], ] as [$name, $desc])

{{ $name }} Colour

{{ $desc }}

@endforeach

🔤 Fonts

Set a Heading Font and Body Font. Type any Google Font name (e.g., Playfair Display, Lato). Default is Inter — clean and professional.

🔲 Button Style

Rounded

Clean and modern.

Pill

Friendly and trendy.

Sharp

Bold and professional.

🖼️ Logo, Favicon & Banner

Logo — Top-left of every page. PNG/WebP with transparent background is best.
Favicon — Tiny icon in the browser tab. Upload a square image (32×32 or 64×64 pixels).
Banner — Full-width image at the top of your homepage. Landscape format, at least 1400×400 pixels.

📐 Image Guidelines (Logo, Favicon, Banner & Products)

For fast page loads and crisp display, follow these recommendations. Uploads must be image files — JPG, PNG, WebP, or GIF (PDFs, SVGs and other file types are rejected).

ImageRecommended sizeMax file size
Logo~300 × 100 px, transparent PNG4 MB
FaviconSquare, 32 × 32 or 64 × 64 px1 MB
Homepage bannerLandscape, ≥ 1400 × 400 px4 MB
Product imagesSquare-ish, ~1000 × 1000 px, up to 10 per product4 MB each
💡 Tips: Save photos as JPG (smaller) and logos/graphics as PNG. Resize large camera photos to about 1000–2000 px wide before uploading — anything larger just slows your store down. If an upload is rejected, check the file type and that it is under the 4 MB size limit shown above.
💾 Storage limit: your plan includes a total media-storage allowance — Starter 250 MB · Growth 1 GB · Pro 5 GB. Your dashboard shows how much you've used. If an upload is rejected for storage, remove some images or upgrade your plan.
{{-- 12. Stripe Connect ────────────────────────────────────────────────────── --}}
@php // D12 S1 — the platform fee is whatever ECW pushed to THIS store (0% by default, // 0% always while studio-bundled). The copy below reads it; nothing is hard-coded. $platformFee = \App\Support\PlatformFee::for(\App\Models\SiteSettings::current(), now()); $feeIsZero = $platformFee->rate <= 0.0; $feeAmountText = match (true) { $platformFee->reason === \App\Support\PlatformFee::REASON_STUDIO_BUNDLE => '0% — included with your studio plan', $platformFee->reason === \App\Support\PlatformFee::REASON_GRACE_PERIOD => '0% — studio grace period', $feeIsZero => 'None — EastCoast WebCraft currently charges no platform fee', default => $platformFee->label() . ' of the order total', }; $feeOn100 = number_format($platformFee->cents(10000) / 100, 2); $receiveOn100 = number_format(100 - 3.20 - $platformFee->cents(10000) / 100, 2); $feeCountText = $feeIsZero ? 'One fee comes out of each sale automatically' : 'Two small fees come out of each sale automatically'; $feeExample = $feeIsZero ? "Stripe takes about \$3.20, there is no platform fee, and you receive about \${$receiveOn100} in your Stripe balance." : "Stripe takes about \$3.20, the {$platformFee->label()} platform fee is \${$feeOn100}, and you receive about \${$receiveOn100} in your Stripe balance."; $feeFaq = $feeIsZero ? "One fee comes out of every sale automatically: Stripe's processing fee (about 2.9% + \$0.30, Stripe's standard rate). EastCoast WebCraft currently charges no platform fee on your storefront sales. On a \$100 order that's roughly \$3.20 to Stripe, so you receive about \${$receiveOn100} in your Stripe balance. If a platform fee is ever introduced it is published on the EastCoast WebCraft pricing page and you get at least 30 days' notice. See the 💳 Getting Paid — Stripe Connect section for the full breakdown." : "Two fees come out of every sale automatically: Stripe's processing fee (about 2.9% + \$0.30, Stripe's standard rate) and the {$platformFee->label()} EastCoast WebCraft platform fee. On a \$100 order that's roughly \$3.20 to Stripe and \${$feeOn100} to EastCoast WebCraft, so you receive about \${$receiveOn100} in your Stripe balance. See the 💳 Getting Paid — Stripe Connect section for the full breakdown. If you refund a customer, both fees are returned in proportion."; @endphp
⚠️ You must connect Stripe before your store can accept payments. You do this once in your EastCoast WebCraft client portal (Merchant Payments), not in this panel. Until connected, customers can browse but cannot purchase.

When a customer pays, their money goes directly into your own connected Stripe account — EastCoast WebCraft never touches your funds. It's a full Stripe account that belongs to you (it goes with you if you ever leave). Stripe is free to sign up for. {{ $feeCountText }} (see the breakdown below), so there is nothing for you to pay separately or invoice for.

💰 The fees on each sale

Because the payment is charged straight to your own Stripe account, this is what is deducted from every sale:

FeeAmountGoes to
Stripe processing fee2.9% + $0.30 per sale (Stripe's standard rate)Stripe — for handling the card payment
Platform fee{{ $feeAmountText }}EastCoast WebCraft — for running your store

Example on a $100.00 order: {!! $feeExample !!}

💡 International cards or currency conversion can make Stripe's fee a little higher — see stripe.com/pricing for exact rates. The platform fee is set by EastCoast WebCraft, published on its pricing page, and you get at least 30 days' notice before any change. If you refund a customer, the fees are returned in proportion, so you are never left paying a platform fee on money you gave back.

Connecting Your Stripe Account

You connect Stripe in your EastCoast WebCraft client portal — not in this admin panel.

  1. 1Log into your ECW client portal and open Merchant Payments.
  2. 2Click "Connect your Stripe account" — you'll be taken to Stripe's secure website.
  3. 3Log into your existing Stripe account, or create one. You'll need your business name, address, bank account, and government ID.
  4. 4Follow Stripe's onboarding steps. Usually takes 5–10 minutes.
  5. 5You're done. Your store picks up the connection automatically — check Settings → Payments here to see the green Connected status once Stripe enables charges.

Understanding Your Stripe Status

The Settings → Payments page in this panel is read-only — it shows your status and links back to your ECW portal. It does not onboard or change anything.

Charges Enabled ✅

Stripe can process card payments. This must show Enabled before your store can accept orders.

Payouts Enabled

Collected funds can transfer to your bank. Stripe typically uses a rolling payout schedule (e.g., 2-day rolling). Check your Stripe dashboard for your schedule.

Your Stripe Dashboard

Once connected, the Open Stripe Dashboard link on the Payments page takes you to your own full Stripe dashboard (dashboard.stripe.com) where you can view payment history, see payout amounts, look up transactions by Payment Intent ID, issue refunds, and respond to disputes.

{{-- 13. Your Storefront ──────────────────────────────────────────────────── --}}

Your storefront is the public-facing website at your-store.ecstores.ca. Here's what customers experience:

🏠 Homepage (Product Grid)

Shows all products in a grid. Banner image at the top if uploaded. Featured products in a spotlight section. Customers search by name or filter by category. Products are paginated — 12 per page.

📄 Product Page

Full description, images, price, and variant options. Customer selects variants, sets quantity, and clicks "Add to Cart".

🛒 Cart

Shows all added items with the ability to change quantities or remove items, then proceeds to checkout.

✅ Checkout (4 Steps)

(1) Contact & Billing → (2) Shipping selection → (3) Order review → (4) Secure payment via Stripe. Ends on an "Order Confirmed" page.

👤 Customer Accounts

Customers can optionally register to view order history, manage their wishlist, and save their address. No account is required to purchase (unless you enable that in Site Settings).

💡 Always test your store after major changes. Visit your store in a browser, add a product to your cart, and confirm everything looks and works correctly.
{{-- 14. Staff ────────────────────────────────────────────────────────────── --}}

The Staff page (under Store in the sidebar) is where you add and manage the people who can sign in to your admin panel. Everyone you add gets full admin access for now.

📋 Staff seats: Starter — 1  ·  Growth — 3  ·  Pro — 10. A seat is an active staff member; deactivating frees a seat. When you're at the limit the Invite staff member button is hidden — deactivate someone or upgrade your plan (in your EastCoast WebCraft client portal). Your dashboard's Staff seats meter shows how many you've used.

Inviting a Staff Member

  1. 1Click Staff → Invite staff member.
  2. 2Enter their Name and Email. You do not set a password — for security you never see or choose it.
  3. 3Click Create. They receive an email with a secure link to set their own password and sign in.
  4. 4If the link expires, click Send password reset on their row to email a fresh one.

Deactivate vs. Delete

Deactivate

The person can no longer sign in, but their account and history are kept — and it frees a seat. Use it when someone leaves; Reactivate restores access later (if you have a free seat).

Delete

Permanently removes the account.

⚠️ Safety rules: you can't deactivate or delete your own account (ask another owner), and you can't remove the last active staff member — every store must keep at least one person who can sign in. Those buttons are simply hidden when they'd break a rule.
{{-- 14b. Reviews ─────────────────────────────────────────────────────────── --}}

The Reviews page (under Store in the sidebar) is your moderation queue for customer product reviews. Reviews are available on every plan. Only customers who have purchased a product can review it, and nothing appears on your storefront until you approve it.

🔔 The Reviews menu item shows an amber number badge whenever reviews are waiting for you. That number is how many reviews are pending your approval.

Approving or Rejecting a Review

Each row shows the product, the customer, their star rating, whether it's a Verified purchase (linked to a real order), the review text, and its status.

  1. 1Open Store → Reviews. New reviews have the status pending.
  2. 2Click Approve to publish it — it now shows on the product page and counts toward that product's average star rating (and its Google rich-result rating).
  3. 3Click Reject (you'll be asked to confirm) to hide it from your storefront. You can re-approve it later from the list.
  4. 4To handle several at once, tick the checkboxes and use Approve selected or Reject selected.
💡 Good to know: a customer can leave one review per product. If they edit a review they already left, it returns to pending and you'll need to approve it again — so changed text is always re-checked before it re-appears.
{{-- 14c. Analytics ────────────────────────────────────────────────────────── --}}

You can connect Google Analytics 4 and/or a Meta (Facebook) Pixel to see how visitors find and use your store. This is available on every plan. Both are optional — leave a field blank and nothing is added to your storefront.

Connecting your accounts

  1. 1Go to Settings → Site Settings and open the Analytics & Marketing section.
  2. 2Google Analytics 4 Measurement ID — paste your ID (it starts with G-, e.g. G-ABC1234567). Find it in Google Analytics under Admin → Data Streams → your web stream (shown top-right).
  3. 3Meta (Facebook) Pixel ID — paste your numeric Pixel ID. Find it in Meta Events Manager → your pixel → Settings.
  4. 4Click Save Settings. The tracking snippet is added to every storefront page immediately — there's nothing to paste into your theme.

To turn tracking off, clear the field and save. If you enter something that isn't a valid ID, the form tells you and won't save it.

⚖️ Privacy (PIPEDA): collecting visitor data means Canadian privacy law expects you to publish a Privacy Policy. Fill in the Privacy Policy box under Policies on the same Site Settings page — it appears on your storefront's Store Policies page. Say what you collect, why, and who you share it with.
💡 Good to know: a cookie-consent banner is not built in yet. If you sell into the EU/UK, add your own consent tooling before enabling tracking.
{{-- 14d. Developer API ──────────────────────────────────────────────────────── --}}

The REST API lets you read your store's products and orders from your own tools and scripts. It's a Pro plan feature — the API page (under Settings in the sidebar) shows an upgrade prompt on Starter and Growth.

1. Create an API key

  1. 1Open Settings → API and click Create API key.
  2. 2Give it a name (e.g. "Zapier" or "Warehouse sync") so you can tell your keys apart, and click Create.
  3. 3Copy the key right away. The full key is shown only once — we store only a fingerprint of it, so we can never show it again. If you lose it, revoke it and create a new one.
🔒 Treat your key like a password. Anyone with it can read your products and order details (including customer names and shipping addresses). Never paste it into public code or share it. To turn a key off, click Revoke on the API page — it stops working immediately.

2. Make a request

Send your key as a Bearer token in the Authorization header. The base URL is your store address followed by /api/v1:

curl https://your-store.ecstores.ca/api/v1/products \
     -H "Authorization: Bearer ecs_xxxxxxxx_your_key_here" \
     -H "Accept: application/json"

3. What you can read

Method & pathReturns
GET /api/v1/productsYour live products (discontinued ones are hidden), newest id first, paginated.
GET /api/v1/products/{id}A single product.
GET /api/v1/ordersYour orders, newest first, paginated (line items omitted for speed).
GET /api/v1/orders/{id}A single order with its line items and shipping details.

The API is read-only for now — it never changes your data. Order responses include what you need to fulfil (contact, shipping address, totals, items) but never raw card or Stripe payment identifiers.

4. Pagination

List endpoints return 25 records per page. Add ?per_page=50 (max 100) to change the page size and ?page=2 to move through pages. Each response includes a meta block (total, per_page, current_page) and links (first/last/prev/next).

5. Rate limit & errors

  • 60 requests per minute per key. Going over returns 429 Too Many Requests — wait a moment and retry.
  • 401 Unauthorized — missing, mistyped, or revoked key.
  • 403 Forbidden — your plan doesn't include the API (upgrade to Pro), or your store is temporarily unavailable.

6. Order webhooks

Rather than polling for new orders, have your store push you a signed message the instant an order is placed. Open Settings → Webhooks and add the URL on your server that should receive it. Webhooks are part of the same Pro plan feature as the API.

  • The endpoint URL must be https:// — order notifications carry customer names and addresses, so we never send them over an insecure connection (this is checked when you save and again right before every send).
  • When you add an endpoint we show a signing secret once — copy it. You can register up to 3 endpoints, and pause, rotate the secret, or delete any of them.

Each delivery is a POST with a JSON body { "event": "order.created", "created_at": …, "data": { …the order… } } (the same order shape as GET /orders/{id} — no payment identifiers) and these headers:

HeaderMeaning
X-ECStores-EventThe event name, e.g. order.created.
X-ECStores-TimestampUnix time the message was signed.
X-ECStores-SignatureHMAC-SHA256 of timestamp | body, keyed with your signing secret.

Verify every message before trusting it, then return a 2xx to acknowledge:

$payload   = file_get_contents('php://input');
$timestamp = $_SERVER['HTTP_X_ECSTORES_TIMESTAMP'] ?? '';
$signature = $_SERVER['HTTP_X_ECSTORES_SIGNATURE'] ?? '';

$expected = hash_hmac('sha256', $timestamp . '|' . $payload, 'YOUR_SIGNING_SECRET');
if (! hash_equals($expected, $signature)) {
    http_response_code(400);   // reject: bad signature
    exit;
}
http_response_code(200);       // 2xx = delivered
⚠️ If your endpoint keeps failing (no 2xx after our retries) for 5 orders in a row, we automatically disable it and email you. No orders are lost — only the notifications pause. Fix the endpoint, then switch it back to Active in Settings → Webhooks.
{{-- 15. FAQ ──────────────────────────────────────────────────────────────── --}}
@php $faqs = [ ["I've hit my product limit — what can I do?", "Starter plans allow 25 products, Growth allows 100, and Pro is unlimited. When you reach the limit, the New Product button disappears. You can either delete products you no longer need, or contact EastCoast WebCraft to upgrade your plan."], ["I see a 'Growth+' badge on Coupons or a menu item — what does it mean?", "That badge means the feature is available on the Growth plan or higher. If you're on the Starter plan, you'll see a notification when you open that section explaining what's restricted. Contact EastCoast WebCraft to upgrade your plan."], ["My variants section or coupons section is missing from the admin.", "Variants and Coupons are Growth plan features. On the Starter plan, the Variants section is hidden in the product form and the Coupons page shows a notice instead of the table. Existing variant data is preserved — you just can't create new ones. Upgrade to Growth or Pro to re-enable these features."], ["My store says 'Out of Stock' but I have items.", "Go to the product and check the Inventory section. If Track Inventory is On, your Units in Stock may be zero. Update the quantity. If you never want to show out of stock, turn Track Inventory Off."], ["A product is not showing on my storefront.", "Check that the product's Discontinued toggle is Off. Make sure you saved the product. If just added, refresh your storefront page."], ["Customers can't complete checkout — there's an error.", "Most likely Stripe is not connected or charges are not enabled. Go to Settings → Payments and check the status. If it's not connected, connect your Stripe account in your ECW client portal → Merchant Payments. Also confirm you have at least one Shipping Method set up."], ["I can't see the 'Pay' button or it doesn't work.", "Your Stripe account is not fully set up. Check Settings → Payments. If not connected, connect it in your ECW client portal → Merchant Payments. If connected but charges not enabled, log into your Stripe dashboard to complete any outstanding verification — this page updates automatically once Stripe enables charges."], ["What fees are taken out of each sale?", $feeFaq], ["My logo doesn't look right.", "Upload a version with a transparent background (PNG or WebP). Logos on coloured backgrounds can look out of place against a different header colour. If too large or small, resize the image before uploading."], ["How do I issue a refund to a customer?", "Pro plan: Open the order → click the Refund button (top right). Choose Stripe (card refund), Manual (e-transfer/cash), or Store Credit (generates a coupon code). The order status updates automatically. Starter/Growth plans: Issue the refund in your Stripe dashboard, then manually update the order status to Refunded in your admin."], ["What is a Store Credit refund?", "When you issue a Store Credit refund (Pro plan), the system automatically creates a single-use coupon code worth the refund amount (e.g., CREDIT-AB12CD). The code is valid in your store at checkout. It also appears in your Coupons list. Email the code to your customer using the Notify option in the Refund panel. The code is locked to that customer's email — only they can redeem it, so a forwarded or leaked code won't work for anyone else."], ["How do I start a return / RMA?", "Open the order (must be Shipped, Processing, or Partially Refunded) → click Request Return. Choose a reason, set return quantities for each item, then click Create. The order moves to Return Requested. See the ↩️ Returns (RMA) section in this Help Center for the full workflow."], ["Where do I see all my return requests?", "Click Returns (RMA) in the sidebar. All return requests across all orders are listed with their RMA number, status, reason, and linked order. You can filter by status. This is a Pro plan feature."], ["A customer says they paid but I see no order.", "Check the Orders list without any status filters. Ask the customer for their confirmation email. You can also search for the payment in your Stripe dashboard. If payment was taken but no order exists, contact EastCoast WebCraft support."], ["I made changes in Branding Studio but my store looks the same.", "Make sure you clicked Save. Then do a hard refresh: Ctrl+Shift+R on Windows, Cmd+Shift+R on Mac."], ["How do I change my store's web address?", "Your store address (yourname.ecstores.ca) is set at creation and cannot be self-changed. Contact EastCoast WebCraft if you need it updated."], ["Who do I contact for help?", "Contact EastCoast WebCraft at info@eastcoastwebcraft.ca. Include your store name and a description of the issue."], ]; @endphp @foreach($faqs as $i => $faq)
{!! $faq[1] !!}
@endforeach

Still need help?

EastCoast WebCraft is here to support you. Don't hesitate to reach out.

Email info@eastcoastwebcraft.ca
{{-- Scroll-to-top button ──────────────────────────────────────────────── --}}