Home  /  Docs  /  Advanced editor

Your website, your code.

The advanced editor gives you full control over your site's HTML and CSS — restructure sections, restyle anything, and build exactly the site you want. Your template stays wired to the basic editor through simple {{variables}}, so products, reviews, and brand changes keep flowing in.

Availability Premium & MaxLanguage HTML + CSS with Handlebars-style tagsOpen it Website editor → Advanced
Docs · Website

Advanced editor

Every variable you can use, the blocks that power loops and conditionals, and how to keep your custom template connected to checkout.

Overview

Every Hustl website is rendered from a theme template — an HTML file plus a CSS file with placeholders like {{business.name}} that get filled in with your real content. The basic editor changes that content behind the scenes; the advanced editor lets you edit the template itself.

This is Shopify-style theming: you get the raw HTML and CSS of your current theme and can change anything — layout, markup, styles, section order. As long as you keep the {{variables}} you care about, the site stays dynamic and keeps updating from the basic editor. The advanced editor is available on the Premium and Max plans.

Getting started

  1. Open the editor. In the dashboard, go to the Website editor → Advanced. You'll see two tabs — template.html and styles.css — next to a live preview.
  2. Save your site once first. The live preview renders through your own site host, so save your site in the basic editor at least once to unlock it.
  3. Edit, and watch it save. Changes auto-save as you type (debounced) and the preview refreshes after each save. No publish button to remember.
  4. Reference the variables. The Template variables panel in the editor lists them inline; this page is the full reference.
Good to know

Editing the template doesn't disconnect the basic editor — the two stay linked through variables. Change a product price or brand color in the basic editor and it flows straight into your custom template on the next render.

How templating works

At render time, Hustl builds a context object from your site config, products, and reviews, then renders your HTML against it. Placeholders are replaced with real values; blocks let you loop and branch. A few things worth knowing:

  • Values are pre-computed for you. Prices come pre-formatted ({{priceLabel}}), ratings come as star strings ({{stars}}), and colors are already resolved with sensible fallbacks — so your template stays declarative.
  • Missing values are safe. An empty field renders as an empty string rather than breaking the page. Pair optional content with a boolean guard (see {{#if}} below).
  • Nested values use dots. {{business.name}}, {{hero.title}}, {{colors.primary}}.

Syntax: blocks & conditionals

Beyond simple {{value}} substitution, three block helpers are available:

BlockWhat it does
{{#if x}} … {{/if}}Renders the inner block only when x is truthy. Supports an optional {{else}}.
{{#unless x}} … {{/unless}}The inverse — renders only when x is falsy.
{{#each list}} … {{/each}}Repeats the inner block for every item. Inside, fields refer to the current item; {{this}} is the item itself (for lists of plain strings like aboutPoints).

Prefer the boolean guards Hustl provides ({{#if hasServices}}, {{#if hasImage}}, {{#if reviews.hasReviews}}) — they read cleanly and already account for the basic-editor toggles.

Variable reference

Everything you can use in a template, grouped by section. Booleans are meant for {{#if}} / {{#unless}}; the rest render as text you can place anywhere, including inside style attributes.

Business

Your core contact and identity details, edited under the Business tab of the basic editor.

VariableDescription
{{business.name}}Business name.
{{business.initial}}First letter of the name, uppercased — handy for a monogram / avatar badge.
{{business.email}}Contact email.
{{business.phone}}Phone number.
{{business.niche}}Business niche / category (e.g. "Auto Detailing").
{{business.logo}}Logo image URL. Empty string if none uploaded.
{{business.operatingArea}}Free-text service / operating area.
{{business.description}}Longer business description.

Brand — colors & font

Resolved brand values (every color falls back to a sensible default, so these are always safe to use). Drop them straight into style attributes or a <style> block.

VariableDescription
{{font}}Selected font family, e.g. "Inter".
{{colors.primary}}Primary brand color.
{{colors.primaryHover}}Hover shade for the primary color.
{{colors.secondary}}Secondary color.
{{colors.secondaryHover}}Hover shade for the secondary color.
{{colors.accent}}Accent color.
{{colors.accentHover}}Hover shade for the accent color.
{{colors.footerBackground}}Footer background color.
{{colors.footerText}}Footer body text color.
{{colors.footerHeading}}Footer heading color.
{{colors.socialIcon}}Social-icon color.
{{colors.socialIconHover}}Social-icon hover color.
{{colors.linkColor}}Link color (defaults to footer text).
{{colors.linkHoverColor}}Link hover color (defaults to footer heading).
{{colors.aboutBackground}}Background color for the about section.
{{colors.aboutTextColor}}Text color for the about section.

Hero

The headline area at the top of your site.

VariableDescription
{{hero.title}}Headline. Falls back to a default if left blank.
{{hero.subtitle}}Subheadline (may be empty).
{{hero.backgroundImage}}Hero background image URL (may be empty).
{{hero.hasBackgroundImage}}Boolean — use with {{#if}} to switch styling when there is no image.
{{hero.ctaLabel}}Hero button label, e.g. "View Services".

Products & services

The section wrapper values, plus a loop over your active products. Fields marked "inside the loop" are only available between {{#each services}} and {{/each}}.

Loop: {{#each services}} … {{/each}}

VariableDescription
{{hasServices}}Boolean — true when you have at least one active product.
{{servicesSection.overline}}Small label above the heading, e.g. "Services".
{{servicesSection.heading}}Section heading, e.g. "What we offer".
{{servicesSection.emptyHeading}}Heading shown when there are no products.
{{servicesSection.emptyDescription}}Body text shown when there are no products.
{{servicesSection.showImages}} / showPricesBooleans reflecting the basic-editor toggles.
{{servicesSection.headingColor}} / descriptionColor / priceColorResolved section text colors.
{{servicesSection.cardBackground}} / cardBorderColor / cardBorderRadiusPxResolved card styling values.
{{serviceImageFallback}}Fallback image URL for products with no image — your logo if set, otherwise the Hustl placeholder.
{{id}}Product ID — put on a button as data-hustl-service="{{id}}" to open checkout (inside the loop).
{{name}}Product name (inside the loop).
{{description}} / {{hasDescription}}Product description and a boolean guard (inside the loop).
{{image}} / {{hasImage}}Product image URL and a boolean guard, respecting the "show images" toggle (inside the loop).
{{showCardImage}}Boolean — whether the card image slot should render at all, reflecting the section toggle. Pair with {{serviceImageFallback}} when a product has no image (inside the loop).
{{type}} / {{isQuote}}Product type ("fixed", "subscription", "quote") and a quote boolean (inside the loop).
{{hasPrice}}Boolean — whether to show a price, respecting the "show prices" toggle (inside the loop).
{{pricePrefix}}Contextual price prefix — "Price", "Starting at", or "From" (inside the loop).
{{priceLabel}}Formatted price, e.g. "$75 – $120 /month" (inside the loop).
{{ctaLabel}}"Book Now" / "Subscribe" / "Request Quote", chosen from the product type (inside the loop).

Reviews

Aggregate rating plus a loop over individual reviews.

Loop: {{#each reviews.items}} … {{/each}}

VariableDescription
{{reviews.enabled}} / {{reviews.hasReviews}}Booleans — whether reviews are turned on and whether any exist.
{{reviews.average}}Average rating as a number, e.g. 4.8.
{{reviews.averageStars}}Average rating as a ★★★★☆ string.
{{reviews.count}}Total number of reviews.
{{name}}Reviewer name (inside the loop).
{{comment}} / {{hasComment}}Review text and a boolean guard (inside the loop).
{{rating}} / {{stars}}Numeric rating and its ★★★★☆ string (inside the loop).
{{date}}Formatted review date, e.g. "Jun 2026" (inside the loop).

About, CTA banner, social & misc

The remaining sections. About points and social links are loops; the CTA banner and year are plain values.

Loop: {{#each aboutPoints}}{{this}}{{/each}} · {{#each socialLinks}} … {{/each}}

VariableDescription
{{#each aboutPoints}}{{this}}{{/each}}Trust badges / bullet points from the About tab. {{this}} is each string.
{{hasAboutPoints}}Boolean — true when at least one about point exists.
{{ctaBanner.overline}}Small label above the CTA banner heading.
{{ctaBanner.heading}}CTA banner heading.
{{ctaBanner.description}}CTA banner body text.
{{ctaBanner.buttonLabel}}CTA banner button label.
{{hasSocial}}Boolean — true when any social link is set.
{{platform}} / {{url}}Inside {{#each socialLinks}}: the network name and its URL.
{{year}}Current year — handy for a footer copyright line.

Example: hero

<section class="hero" style="background-image: url('{{hero.backgroundImage}}')">
  <h1>{{hero.title}}</h1>
  {{#if hero.subtitle}}
    <p>{{hero.subtitle}}</p>
  {{/if}}
  <a href="#services" class="btn">{{hero.ctaLabel}}</a>
</section>

Example: products loop

<section id="services">
  <p class="overline">{{servicesSection.overline}}</p>
  <h2>{{servicesSection.heading}}</h2>

  {{#if hasServices}}
    <div class="grid">
      {{#each services}}
        <article class="card">
          {{#if hasImage}}<img src="{{image}}" alt="{{name}}" />{{/if}}
          <h3>{{name}}</h3>
          {{#if hasDescription}}<p>{{description}}</p>{{/if}}
          {{#if hasPrice}}
            <span class="price">{{pricePrefix}} {{priceLabel}}</span>
          {{/if}}
          <!-- data-hustl-service opens checkout for THIS product -->
          <button data-hustl-service="{{id}}">{{ctaLabel}}</button>
        </article>
      {{/each}}
    </div>
  {{else}}
    <h3>{{servicesSection.emptyHeading}}</h3>
    <p>{{servicesSection.emptyDescription}}</p>
  {{/if}}
</section>

Example: reviews

{{#if reviews.hasReviews}}
  <section class="reviews">
    <h2>{{reviews.averageStars}} · {{reviews.average}} from {{reviews.count}} reviews</h2>
    {{#each reviews.items}}
      <blockquote>
        <span class="stars">{{stars}}</span>
        {{#if hasComment}}<p>"{{comment}}"</p>{{/if}}
        <cite>{{name}} — {{date}}</cite>
      </blockquote>
    {{/each}}
  </section>
{{/if}}

Wiring up checkout

The one attribute that connects your custom HTML to Hustl's payments is data-hustl-service. Put it on any clickable element and set it to a product's {{id}}:

<button data-hustl-service="{{id}}">{{ctaLabel}}</button>

When a visitor clicks it, Hustl opens the checkout / booking flow for that specific product — no wiring, forms, or API calls on your side. Because it's just an attribute, you can put it on a button, link, card, or image. Use it inside {{#each services}} so every product gets its own working buy button.

Powered-by banner

A small "Powered by Hustl" banner is injected at page load, outside your template markup, so it can't be removed by editing the template. Everything else on the page is yours to change.

Preview & autosave

  • Autosave. Edits save automatically a moment after you stop typing. The status in the header shows Saving…Saved, and a Customized badge appears once your template differs from the theme default.
  • Live preview. The right pane renders your saved template through your real site host, so it matches production exactly. It refreshes after each save — or hit the refresh button, or open it in a new tab.
  • Two files. template.html holds structure and content; styles.css holds your CSS. Both are edited in the same panel via the tabs.

Plans, reset & fallback

  • Availability. Editing custom HTML/CSS requires the Premium or Max plan. On lower plans the editor is read-only behind an upgrade prompt.
  • Reset to theme default. The Reset to theme default button discards your customizations and restores the current theme's stock template. This can't be undone, so it asks first.
  • Graceful fallback. If your plan is downgraded, your site quietly falls back to the stock theme template (your custom code is kept, not deleted) and renders your custom template again when you upgrade.

Limits & good practice

  • Templates have generous size caps (roughly 300 KB of HTML and 150 KB of CSS) — plenty for a rich site, but keep assets like images and fonts hosted externally rather than inlined.
  • Keep the variables you care about. Deleting {{#each services}} removes your products from the page; drop data-hustl-service and buttons stop opening checkout.
  • Guard optional content with the has* booleans so empty sections don't leave stray headings or empty grids behind.
  • Prefer the resolved {{colors.*}} and {{font}} values over hard-coded ones — then a brand change in the basic editor restyles the whole site for free.
  • Preview on mobile widths too. The stock themes are responsive; if you restructure heavily, re-check your own breakpoints.
New variables may be added over time — unknown placeholders simply render empty.Questions? support@hustl.it