Creating a Product
Click Add Product in the Products list to open the quick-create modal. Enter the essential fields (Title, Code, Type, Classification, Price) and click Create product. You are automatically taken to the full Product Detail Page to complete configuration.Product Detail Page
Navigate to the Product Detail Page by clicking any product code or title in the Products list. The page uses a persistent tab layout. Changes are saved by clicking Save in the top toolbar.General Tab
Core product identity, titles, images, descriptions, category assignment, and SEO metadata.Pricing Tab
Selling price, retail (compare-at) price, currency, and tax settings.Subscription Tab
Visible only when This is a subscription product is enabled. See Subscriptions Overview for full billing documentation.Fulfillment Tab
Warehousing, inventory, cost breakdown, SKU categorisation, product specifications, and shipping profile.Merchants Tab
Configure product identifiers per payment gateway integration. For each active payment gateway (NMI, Stripe, BuyGoods, ClickBank, etc.) enter the product ID used on that gateway. These are exposed asproduct | merchantPriceId:'stripe' in templates.
Bonuses Tab
Assign bonus products that customers receive when purchasing this product. Select from products withclassification = bonus.
Files Tab
Visible when product type is Digital or classification is Bonus. Add one or more downloadable files:- Purpose — Digital or Bonus
- Title — File display name
- Description — Optional description
- Image — Thumbnail image
- File — Upload or URL
- Primary — Mark as primary file for this purpose
Courses Tab
Assign courses that customers are automatically enrolled in after purchase.Attributes Tab
Fill in values for brand-level Product Attributes defined under Settings → Products → Product Attributes. Supports all field types: text, textarea, rich text, number, boolean, date, select, multiselect, color, image URL, file URL, and JSON. Attributes withapplies_to = variant are managed per variant in the Variants tab, not here.
Custom Attributes Tab
Legacy unstructured key/value pairs for ad-hoc product metadata (e.g. a download URL or custom flag).Note: For structured, typed attributes, use the Attributes tab with Product Attribute definitions instead. Custom Attributes are a legacy system.
Variants Tab
Define product variants (e.g. Color, Size) with individual pricing.- Select variant options — Check which brand-level variant options apply to this product (managed under Settings → Variant Options)
- Add variants — Each row shows one field per selected option plus Code and Price
Template Reference
All product data is available in ElasticFunnels templates via data functions and filters. Functions are called with{% set x = FunctionName(args) %} or inline. Filters are applied with {{ value | filterName:arg }}.
Product Object Shape
Every product returned by a data function has the following fields:ProductFile shape
Each item inproduct_files, digital_files, and bonus_files:
Data Functions
GetProduct(code)
Loads a single product by its code for the current brand. Also pre-loads structured attribute values so the attr and attrLabel filters work immediately on the returned object.
ProductObject | null
GetProducts(filters?)
Returns all active products for the brand, with optional filters.
ProductObject[]
GetAllProducts()
Returns every product for the brand without filters. Fastest when you need to iterate all products and filter in the template.
ProductObject[]
GetProductCategories(filters?)
Returns product categories. By default returns a full tree ordered by position, then name, with a depth field.
Each item:
{ id, name, position, parent_id, depth? }
CategoryObject[]
ProductDownloads(product)
Flattens all downloadable files attached to a product into a single deduplicated array. Useful for rendering download lists on digital product pages.
{ url, title, kind, purpose, extension, mime_type, size, is_primary, sort_order }
Returns: DownloadObject[]
ProductSavings(product)
Returns a structured savings breakdown comparing retail_price to price. Returns null if there is no saving.
{ amount: number, percent: number, amountFormatted: string, percentFormatted: string } | null
SubscriptionSummary(product)
Generates a human-readable billing summary string for a subscription product (e.g. "7-day free trial · Every 1 month").
string
GetProductAttributes(filters?)
Returns the brand’s structured attribute definitions. See Product Attributes for details on attribute types and scoping.
Each item:
{ id, name, slug, type, applies_to, options, filterable, visible_on_product_page, required }
Returns: AttributeDefinition[]
GetProductAttributeValues(product)
Returns all attribute values for a product as a { slug: value } map.
Record<string, string | number | boolean>
Filters
formatPrice
Formats a numeric price using the brand’s active currency locale.
savings
Computes the saving between retail_price and price and returns a formatted string.
"" when retail_price is not set or not greater than price.
compareAt
Formats retail_price as a “Was $X” string.
"" when retail_price is not set.
pricePerUnit
Divides price by physical_units_per_product to give the per-unit price. Useful for “per bottle” or “per capsule” displays.
string (float formatted to 2 decimal places)
subscriptionLabel
Short-form billing label. Returns trial info if present, otherwise the billing frequency.
"" for non-subscription products.
merchantPriceId
Looks up the merchant-specific product identifier from merchant_product_ids (configured in the Merchants tab).
attr
Returns the value of a structured attribute by its slug. Only works on products loaded via GetProduct (which pre-loads attribute values).
"" when the attribute is not set.
attrLabel
Returns the human-readable label (name) of a structured attribute definition by slug.
Gallery
product.gallery is a string[] — an array of CDN image URLs. It is always an array (never null or a JSON string). product.has_gallery is true when the array has at least one entry.