-
Purpose
This snippet lets you automatically display only the relevant hotel details for the supplier listed on a Purchase Order.
If your hotel_hub custom field contains details for multiple crew or suppliers, this code filters the output to show only the matching entry based on the supplier name in the PO header.
How It Works
Reads the hotel_hub data from the linked opportunity.
Finds the section that starts with the supplier’s name (e.g. Andy Brown).
Displays only that section of text on the Purchase Order document.
Ignores all other entries automatically.
———————————————————
{% assign opportunity = order.sources.first %}
<!-- Hotel section -->
<div class="section notes">
{% assign supplier_name = order.supplier_address_name | strip %}
{% assign hotel_lines = opportunity.hotel_hub | newline_to_br | split: '<br />' %}
{% assign matched_block = "" %}
{% assign current_block = "" %}
{% assign include_block = false %}
{% for line in hotel_lines %}
{% assign clean_line = line | strip %}
{% if clean_line == supplier_name %}
{% assign include_block = true %}
{% assign current_block = clean_line %}
{% elsif clean_line == "" %}
{% assign include_block = false %}
{% endif %}
{% if include_block %}
{% assign matched_block = matched_block | append: clean_line | append: "<br />" %}
{% endif %}
{% endfor %}
{% if matched_block != blank %}
<h4>Hotel Details</h4>
<p>{{ matched_block }}</p>
{% endif %}
</div>
-
Purpose
This snippet allows you to automatically display the Transport Schedule from an Opportunity directly against an item on a Purchase Order.
It’s ideal for courier bookings, haulage suppliers, or external transport providers who only need clear, readable transport instructions without accessing the full job.
The data is pulled straight from the Transport Hub schedule stored on the Opportunity, ensuring the information is always up to date.
How It Works
Reads the linked Opportunity from the Purchase Order.
Pulls the transport_schedule stored against the Opportunity Item.
Converts line breaks so the schedule formats correctly on documents.
Displays the transport schedule inline on the Purchase Order item.
Example Use Case
Courier Purchase Orders
External haulage companies
Driver paperwork
Job-specific transport instructions per item
———————————————————
{% assign opportunity = order.sources.first %}
{{ item.opportunity_cost.asset.opportunity_item.transport_schedule | newline_to_br }}
-
Purpose
This snippet allows you to automatically insert the Transport Hub schedule into a Discussion template on an Opportunity.
It’s ideal for sharing transport details with internal teams and external suppliers, ensuring everyone is working from the same, up-to-date transport plan without copying and pasting.
The data is pulled directly from the Transport Hub on the Opportunity, so any changes made to the schedule are instantly reflected in the discussion content.
How It Works
Reads the Transport Hub data stored on the Opportunity
Pulls the current transport schedule
Converts line breaks so formatting is preserved in the discussion
Inserts the transport schedule directly into the discussion body
Example Use Cases
Internal team communications
External suppliers and haulage partners
Courier and transport coordination
Ops and warehouse briefings
Sharing live transport plans without attachments
———————————————————
{{ opportunity.transport_hub | newline_to_br }}
-
Purpose
This snippet allows you to display all Transport Hub schedules directly on an Opportunity document.
It’s ideal for internal paperwork, driver packs, warehouse prep sheets, and job documents where the full transport plan needs to be clearly visible in one place.
The data is pulled directly from the Transport Hub on the Opportunity, ensuring the document always reflects the latest transport planning without manual updates.
How It Works
Reads the Transport Hub data stored on the Opportunity
Pulls the combined transport schedules
Converts line breaks so formatting is preserved on documents
Displays the full transport schedule inline on the Opportunity document
Example Use Cases
Driver packs
Warehouse preparation sheets
Internal job paperwork
Full transport overview per Opportunity
———————————————————
{{ order.transport_hub | newline_to_br }}
-
Purpose
This snippet allows you to display the Transport Schedule for an individual Opportunity Item directly on an Opportunity document.
It’s ideal when different items on the same job have separate transport requirements, allowing clear, item-specific instructions to be shown without cluttering the document with irrelevant details.
The data is pulled directly from the Transport Hub schedule stored against each Opportunity Item, ensuring transport instructions remain accurate and up to date.
How It Works
Reads the Transport Hub schedule stored on the Opportunity Item
Pulls the item-specific transport_schedule
Converts line breaks so formatting is preserved on documents
Displays the schedule inline against each item
Example Use Cases
Mixed courier and in-house transport on the same job
Item-specific delivery or collection instructions
Warehouse pick lists with transport notes per item
Driver paperwork for split or staged deliveries
———————————————————
{% for item in order.services %}
{{ item.transport_schedule | newline_to_br }}
-
Purpose
This allows you to hide individual Opportunity Items, groups, and related description rows from client-facing documents, including Quotes and Invoices.
It is ideal for internal only lines such as backup gear, warehouse items, or anything you don’t want the client to see.
Quote Template Setup
Find this line in your quote document:
{% for item in order.items %}
Replace it with:
{% for item in order.items %}
{% if item.hide_from_quote == ‘Yes’ %}
{% continue %}
{% endif %}Invoice Template Setup
Find this section in your invoice template:
<tbody>
{% for item in invoice.items %}
Replace it with:
{% assign opportunity = invoice.sources.first %}
<tbody>
{% for item in invoice.items %}
{% if item.is_item? %}
{% assign hide_invoice_item = false %}
{% assign invoice_name_count = 0 %}
{% for invoice_check_item in invoice.items %}
{% if invoice_check_item.is_item? and invoice_check_item.name == item.name %}
{% assign invoice_name_count = invoice_name_count | plus: 1 %}
{% endif %}
{% if invoice_check_item.id == item.id %}
{% break %}
{% endif %}
{% endfor %}
{% assign opportunity_name_count = 0 %}
{% for opp_item in opportunity.items %}
{% if opp_item.is_item? and opp_item.name == item.name %}
{% assign opportunity_name_count = opportunity_name_count | plus: 1 %}
{% if opportunity_name_count == invoice_name_count %}
{% if opp_item.hide_from_quote == 'Yes' %}
{% assign hide_invoice_item = true %}
{% endif %}
{% break %}
{% endif %}
{% endif %}
{% endfor %}
{% if hide_invoice_item == true %}
{% continue %}
{% endif %}
{% endif %}
Important Notes
This depends on invoice item order matching opportunity item order.
If item order differs, the item may still appear
Why it’s useful
Keeps quotes and invoices clean and client-friendly while still allowing full internal visibility inside the Opportunity.
-
Purpose
This snippet allows you to display crew schedule information directly on Purchase Order documents using data from Team Hub.
If your items include a crew_schedule custom field, this will format and display it in a clean, readable way on the document, broken down by date, time, and shifts.
How it works
• Reads the crew_schedule data stored against the opportunity item.
• Splits the structured data into days and shifts.
• Formats each entry into a clear, human-readable schedule.
• Displays dates, start/end times, and any shifts.
• Only shows if schedule data exists, otherwise stays hidden.
How to use it
This is important based on how your document is structured
• Add the snippet inside your item loop ({% for item in order.items %})
• Place it after the item description / transport schedule section
• It should sit alongside other item-level details like:
Description
Transport schedule
Notes
• Find this section in your PO template:
{% for item in order.items %}
• Then paste the snippet just before the item.description block
Code Snippet
{% assign crew_raw = item.opportunity_cost.asset.opportunity_item.crew_schedule %}
{% if crew_raw != blank %}
<tr>
<td style="padding-left: {{ item.depth_padding | plus:30 }}px;" colspan="6">
<strong>Crew Schedule</strong><br>
{% assign day_parts = crew_raw | split:'{"date":"' %}
{% for day_part in day_parts offset:1 %}
{% assign day_date = day_part | split:'","shifts":[' | first %}
{% assign pretty_date = day_date | date: "%A, %b %d" | replace: " 0", " " %}
{% assign shifts_raw = day_part | split:'","shifts":[' | last %}
{% assign shift_parts = shifts_raw | split:'{"start":"' %}
{% for shift_part in shift_parts offset:1 %}
{% assign shift_start = shift_part | split:'","end":"' | first %}
{% assign after_end = shift_part | split:'","end":"' | last %}
{% assign shift_end = after_end | split:'","tags":[' | first %}
{% assign tags_blob = after_end | split:'","tags":[' | last | split:']' | first %}
{% assign tags_line = tags_blob | replace:'"','' | replace:',',', ' %}
{{ pretty_date }}, {{ shift_start }} - {{ shift_end }}<br>
{% if tags_line != blank %}
{{ tags_line }}<br>
{% endif %}
<br>
{% endfor %}
{% endfor %}
</td>
</tr>
{% endif %}
-
Purpose
This snippet allows you to display Team Hub crew schedules directly on an Opportunity document.
It’s ideal for internal paperwork, crew call sheets, production packs, and service schedules where the full crew plan needs to be visible against each service item.
How It Works
Reads the Team Hub schedule saved against each service item
Falls back to the service record if no item-level schedule is present
Parses the stored schedule data into dates, shift times, and shift tags
Displays the Team Hub schedule inline beneath each relevant service on the Opportunity document
Example Use Cases
Crew call sheets
Internal operations paperwork
Project manager packs
Per-service crew planning on Opportunity documents
Important Placement
Add this inside your Opportunity services loop, usually inside:
{% for item in order.services %}
and within the service section, usually inside:
{% elsif item.is_service? %}
———————————————————
{% if item.service.service_type_name != "Transport" %}
{% assign crew_raw = item.crew_schedule | strip %}
{% if crew_raw == blank %}
{% assign crew_raw = item.service.crew_schedule | strip %}
{% endif %}
{% if crew_raw != blank and crew_raw contains '{"date":"' and crew_raw contains '{"start":"' %}
<tr>
<td colspan="5" style="padding-left: {{ item.depth_padding | plus:64 }}px;">
<strong>Crew Schedule</strong><br>
{% assign day_parts = crew_raw | split:'{"date":"' %}
{% for day_part in day_parts offset:1 %}
{% assign day_date = day_part | split:'","shifts":[' | first %}
{% assign pretty_date = day_date | date: "%A, %b %d" | replace: " 0", " " %}
{% assign shifts_raw = day_part | split:'","shifts":[' | last %}
{% assign shift_parts = shifts_raw | split:'{"start":"' %}
{% for shift_part in shift_parts offset:1 %}
{% assign shift_start = shift_part | split:'","end":"' | first %}
{% assign after_end = shift_part | split:'","end":"' | last %}
{% assign shift_end = after_end | split:'","tags":[' | first | split:'"}' | first %}
{{ pretty_date }}, {{ shift_start }} - {{ shift_end }}<br>
{% if after_end contains '","tags":[' %}
{% assign tags_blob = after_end | split:'","tags":[' | last | split:']' | first %}
{% assign tags_line = tags_blob | replace:'"','' | replace:',',', ' %}
{% if tags_line != blank %}
{{ tags_line }}<br>
{% endif %}
{% endif %}
<br>
{% endfor %}
{% endfor %}
</td>
</tr>
{% endif %}
{% endif %}