{
  "spec": "quick-html/v0",
  "id": "pricing-table",
  "version": "0.1.0",
  "name": "Pricing Table",
  "description": "One-page plan and tier comparison sheet: three price cards above a feature-by-feature matrix whose cells hold a tick, a dash or a value. Pick it for SaaS pricing sheets, service packages, membership tiers and quote leave-behinds.",
  "useWhen": [
    "pricing table",
    "compare plans",
    "plan comparison",
    "tier comparison",
    "price sheet",
    "packages and rates",
    "subscription tiers",
    "pricing one-pager",
    "prijslijst",
    "tarievenoverzicht",
    "abonnementen vergelijken",
    "preisliste",
    "grille tarifaire"
  ],
  "format": "printable",
  "theme": "data-reporting",
  "audience": [
    "sales",
    "small-business",
    "marketing-team"
  ],
  "tags": [
    "pricing",
    "plans",
    "tiers",
    "comparison",
    "packages"
  ],
  "language": "en",
  "page": {
    "size": "A4",
    "orientation": "portrait"
  },
  "modules": [
    "edit-overlay",
    "print-helper"
  ],
  "slots": [
    {
      "name": "doc-title",
      "type": "text",
      "required": true,
      "example": "Kordaat — plans & pricing 2026",
      "notes": "Browser tab title; used as the download filename."
    },
    {
      "name": "brand-name",
      "type": "text",
      "required": true,
      "example": "Kordaat",
      "notes": "Seller or product name next to the mark. Under ~24 characters."
    },
    {
      "name": "sheet-title",
      "type": "text",
      "required": true,
      "example": "Field-service planning, priced per technician",
      "notes": "The offer in one line, under ~60 characters so it stays on two lines."
    },
    {
      "name": "sheet-subtitle",
      "type": "text",
      "required": true,
      "example": "Dispatch, mobile job execution and invoicing hand-off for installation and maintenance firms across the Benelux.",
      "notes": "What the product does and who buys it. One or two lines, under ~150 characters."
    },
    {
      "name": "validity-line",
      "type": "text",
      "required": true,
      "example": "Prices valid until 31 Dec 2026 · excl. VAT · per technician seat",
      "notes": "The boxed line top right. Must carry an expiry date AND whether amounts include or exclude VAT. Under ~80 characters."
    },
    {
      "name": "basis-note",
      "type": "html",
      "required": true,
      "example": "<p>Every amount is per activated technician seat, per month, and <strong>excludes VAT</strong>.</p><p>Dispatcher and back-office logins are unlimited on all three plans.</p>",
      "notes": "Left rail beside the cards: 2–3 short <p> stating the unit of pricing, the VAT position and any standing discount. Keep under ~260 characters total."
    },
    {
      "name": "contact-body",
      "type": "html",
      "required": false,
      "example": "<p><strong>Joost Wielinga</strong> — Account Executive</p><p>joost.wielinga@kordaat.nl</p><p>+31 40 268 51 74</p>",
      "notes": "Inside the contact optional: 2–3 short <p> with name, role and one or two contact routes."
    },
    {
      "name": "notes-body",
      "type": "html",
      "required": false,
      "example": "<ul><li>All prices exclude VAT (21% in the Netherlands).</li><li>Annual plans run 12 months from activation; seats added mid-term are invoiced pro rata.</li></ul>",
      "notes": "Inside the notes optional: a <ul> of 3–5 footnotes on VAT, billing term, discounts and contract length. Renders in two columns."
    },
    {
      "name": "footer-line",
      "type": "text",
      "required": false,
      "example": "Kordaat B.V. · Emmasingel 33, 5611 AZ Eindhoven · kordaat.nl",
      "notes": "Legal entity, address, website."
    }
  ],
  "repeats": [
    {
      "name": "tier",
      "description": "One price card per plan, laid out as a row above the matrix. Cards divide the width equally and always share one height, so three tiers is the sweet spot; two or four also work.",
      "min": 2,
      "max": 4,
      "slots": [
        {
          "name": "tier-card-class",
          "type": "text",
          "required": true,
          "example": "tier tier-featured",
          "notes": "The card's class attribute. Exactly two values are allowed: \"tier\" for a normal card and \"tier tier-featured\" for the highlighted one. Use \"tier tier-featured\" on exactly one card — it gains an accent border, a tinted body and the 'Most chosen' tag (edit that tag's text in the HTML if you need another language)."
        },
        {
          "name": "tier-name",
          "type": "text",
          "required": true,
          "example": "Crew",
          "notes": "Plan name, renders uppercase. Under ~14 characters."
        },
        {
          "name": "tier-price",
          "type": "text",
          "required": true,
          "example": "€ 60",
          "notes": "The headline amount for the term named in tier-period. Keep it short — 4 to 8 characters — or the 26px type wraps."
        },
        {
          "name": "tier-period",
          "type": "text",
          "required": true,
          "example": "per technician / month, billed yearly",
          "notes": "Unit and billing term in full, e.g. 'per user / month, billed yearly'. Identical wording on every card."
        },
        {
          "name": "tier-annual",
          "type": "text",
          "required": true,
          "example": "€ 720 per technician / year",
          "notes": "The total actually invoiced per period. Must equal 12 × tier-price when tier-period says monthly billed yearly. Renders on two balanced lines; that is intended."
        },
        {
          "name": "tier-blurb",
          "type": "text",
          "required": true,
          "example": "For growing teams planning a full week of work ahead.",
          "notes": "One line on who the plan suits. Under ~62 characters; keep all cards within a line of each other."
        },
        {
          "name": "tier-highlights",
          "type": "html",
          "required": true,
          "example": "<p>Everything in Start, plus:</p><ul><li>Route optimisation</li><li>Parts &amp; stock tracking</li><li>Open API and webhooks</li></ul>",
          "notes": "3–4 <li>, each under ~26 characters so it stays on one line. An optional leading <p> such as 'Everything in Start, plus:' keeps the cards from repeating each other."
        }
      ]
    },
    {
      "name": "feature-section",
      "description": "A full-width section header row that groups the feature rows beneath it. Insert one above each group; drop them all for an ungrouped matrix.",
      "min": 0,
      "max": 6,
      "slots": [
        {
          "name": "section-name",
          "type": "text",
          "required": true,
          "example": "Planning & dispatch",
          "notes": "Renders uppercase on a sand band. Under ~34 characters."
        }
      ]
    },
    {
      "name": "feature-row",
      "description": "One row per compared feature: the name on the left, then one cell per tier. Order the rows so the features that differ between plans sit near the top.",
      "min": 3,
      "max": 20,
      "slots": [
        {
          "name": "feature-name",
          "type": "text",
          "required": true,
          "example": "Route optimisation & travel time",
          "notes": "Under ~45 characters; roughly 34 fit on one line, longer names wrap to a second and that is fine."
        },
        {
          "name": "feature-note",
          "type": "text",
          "required": false,
          "example": "live traffic, up to 40 stops per route",
          "notes": "Muted second line, lower case, under ~44 characters. Use it on 2–3 rows only; leave empty otherwise."
        },
        {
          "name": "cell-a",
          "type": "html",
          "required": true,
          "example": "<em>—</em>",
          "notes": "First tier's cell. Write <strong>✓</strong> when included, <em>—</em> when not, or a short plain value such as 50 GB or 3 seats (under ~12 characters). Never leave it empty."
        },
        {
          "name": "cell-b",
          "type": "html",
          "required": true,
          "example": "<strong>✓</strong>",
          "notes": "Second tier's cell — same convention as cell-a."
        },
        {
          "name": "cell-c",
          "type": "html",
          "required": true,
          "example": "Unlimited",
          "notes": "Third tier's cell — same convention as cell-a. Delete this cell in every row (and the last <col>) if you ship only two tiers."
        }
      ]
    }
  ],
  "optionals": [
    {
      "name": "notes",
      "description": "Billing and terms footnotes: VAT, billing term, discounts, contract length, what is included in onboarding."
    },
    {
      "name": "contact",
      "description": "Who to call for a custom quote — sales contact block in the bottom-left rail."
    }
  ],
  "changelog": [
    {
      "version": "0.1.0",
      "date": "2026-08-19",
      "notes": "Initial release: A4 tier-card row plus feature comparison matrix with tick/dash/value cells."
    }
  ],
  "agentInstructions": "Delete every data-example card and row first; they are preview only. CHECK THE ARITHMETIC and state the basis: tier-annual must equal 12 × tier-price for the term named in tier-period, and any discount claim must be exact (placeholders: rolling monthly € 35/€ 75/€ 115, minus 20% when billed yearly = € 28/€ 60/€ 92, × 12 = € 336/€ 720/€ 1.104). Format money exactly like the placeholders — '€ 28', '€ 1.104', dot as thousands separator, no decimals — and never mix conventions. Always say whether prices include or exclude VAT, in both validity-line and basis-note; the most-forgotten line on a pricing sheet. tier-card-class accepts exactly two values, \"tier\" and \"tier tier-featured\"; give exactly one card \"tier tier-featured\" (usually the middle). Cells: <strong>✓</strong> when included, <em>—</em> when not, otherwise a short plain value like 50 GB — never leave a cell empty. Keep feature-name under ~45 characters, cell values under ~12, and put the differentiating features near the top. Add a feature-section row above each group. For 2 or 4 tiers, add or remove one <col>, one cell per feature-row and the section colspan to match. Drop the notes or contact block when there is nothing real to say. Unknown price: leave [PRICE] and tell the user to fix it with the built-in Edit button.",
  "license": "MIT",
  "authors": [
    {
      "github": "bvrln"
    }
  ]
}
