Best Way to Build a Product Selector I have a channel on my site which holds the products and services available.
Each has various categories to narrow it down. I want to build a product selector and not sure the best method to go about it.
Concept is in image:


The first 3 questions are filters by categories which apply to each product/service. The Q4 is a price which each product/service has.

I already have a page set up with a custom route which filters the products based on the categories e.g:

/products-services/inks/sales-marketing/tiles  which is
/(to load template)/category/category/category

And that currently filters the products as required.

What is my best way to build the product selector? I'm guessing it is to build a url somehow and link to the above route I have already set up?
Could it be done with a structure with a sub level for each question?
If I understand correctly, it looks like you really only have 2 branches to your tree (products and services). Everything else applies to all products or all services respectively and is one-to-one (except for budget). Instead of using categories, I would probably opt for using Entry Type to determine whether it's a product or service, and dropdown and/or checkbox fields to determine the product/service attributes, which you can then use to search for products/services directly using an ElementCriteriaModel.

Channel =&gt; productsServices
    Entry Type =&gt; product
        Field =&gt; testingType (dropdown)
        Field =&gt; surfaceType (dropdown)
    Entry Type =&gt; service
        Field =&gt; reportingLevel (dropdown)
        Field =&gt; isoCertification (checkbox)
        Field =&gt; price


In your template, you can use javascript to display the correct form questions (based on the answer to the first question) using .on('change', function(event){..}). Select field options can be set dynamically from the field options. Budget options can perhaps be stored in a separate field in a global set ('budgetOptions') for example.

Who will test your self-cleaning surface?
&lt;select name="productServiceType"&gt;
    &lt;option value="product"&gt;I'll test it myself&lt;/option&gt;
    &lt;option value="service"&gt;I want the experts&lt;/option&gt;
&lt;/select&gt;

&lt;div class="product-questions" style="display:none"&gt;
    What is the reason for your testing?
    &lt;select name="testingType"&gt;...&lt;/select&gt;
    What surface type will you be testing?
    &lt;select name="surfaceType"&gt;...&lt;/select&gt;
&lt;/div&gt;

&lt;div class="services-questions" style="display:none"&gt;
    What level of reporting do you require?
    &lt;select name="reportingLevel"&gt;...&lt;/select&gt;
    Do you require ISO certification?
    &lt;select name="isoCertification"&gt;...&lt;/select&gt;
    What is your budget?
    &lt;select name="budget"&gt;...&lt;/select&gt;
&lt;/div&gt;


You can then submit the form to your productServices template, retrieve the attributes and find the associated products/services.

{# set default params #}
{% set params = {
    section: 'productsServices',
    limit: null
} %}

{# determine productService Type #}
{% set type = craft.request.getParam('productServiceType') %}

{# set product params #}
{% if type == "product" %}
    {% set testingTypeParam = craft.request.getParam('testingType') %}
    {% set surfaceTypeParam = craft.request.getParam('surfaceType') %}
    {% set params = params|merge([
        testingType: testingTypeParam, 
        surfaceType: surfaceTypeParam 
    ]) %}
{% endif %}

{# set service params #}
{% if type == "service" %}
    {% set reportingLevelParam = craft.request.getParam('reportingLevel') %}
    {% set isoCertificationParam = craft.request.getParam('isoCertification') %}
    {% set budgetParam = craft.request.getParam('budget') %}
    {% set params = params|merge( [
        reportingLevel: reportingLevelParam, 
        isoCertification: isoCertificationParam
        price: '&gt;= ' ~ budgetParam
    ]) %}
{% endif %}

{# retrieve entries #}
{% set entries = craft.entries(params) %}
{% for entry in entries %}
    {{ title }}
    ...
{% endfor %}


Not tested, but should be close.