CatalogIt Forms - Template Authoring Guide

Written by Patience Budurowich

Last published: February 19th, 2026

CatalogIt Forms - Template Authoring Guide

Use this guide to create and customize .docx form templates in CatalogIt. Templates use placeholder tags inside curly braces { } that are automatically replaced with your data when a form is generated.

Quick Start

Open your .docx template in Word. Wherever you want data to appear, type a tag using curly braces:

Dear {hasAccessionSource.hasName},

On behalf of the Officers and Directors of the {account.name}, we extend our gratitude.

Date: {today | formatDate}

When the form is generated, each {tag} is replaced with the actual value from your record.

You can download the default forms from the application's Settings -> Forms page. After you modify the document, you can upload your customized form to the appropriate location in Settings -> Forms.

Note: Some fields reference nested objects like People or Organizations. Use dot notation to access their properties (e.g., {hasAccessionSource.hasName} for the donor's name).

How Tags Work

A tag is a key wrapped in curly braces. Keys are short, predictable identifiers for each field in CatalogIt. For example:

You see in CatalogIt

You type in the template

Accession Number {hasName}
Source or Donor (name) {hasAccessionSource.hasName}
Description {hasDescription}
Today's date {today | formatDate}

If a field has no value for a particular record, the tag is replaced with blank text (no error).

Important: Many fields in CatalogIt reference other records like people, organizations, or places. These are represented as nested objects. Use dot notation to access their properties (e.g., {hasAccessionSource.hasName}). See Working with People & Organizations for full details.

Dynamic Template Features

The following features let you control how data appears in your template: filters for formatting, loops for repeating content, conditionals for optional sections, and images.

Filters

Filters transform a value before it is displayed. Add a filter after the key using the pipe | character.

formatDate

Formats a date value into a readable string.

Syntax

Output Example

{today | formatDate} Feb 5, 2026
{today | formatDate:"long"} Feb 5, 2026
{today | formatDate:"short"} 02/05/26

Important: Many date fields in CatalogIt are already formatted (e.g., "Jul 28, 2025", "Dec 21, 2025", "circa 2007"). You typically don't need to use formatDate on these. The formatDate filter is mainly useful for:

  • The special {today} field (which is a raw Date object)
  • Date fields that come through as ISO format strings (e.g., "2026-02-05T22:30:11.346Z")

Example:

Date Received: {hasAccessionReceivedDate}
Today's Date: {today | formatDate}

If a date field is already formatted nicely, just use it directly without the filter.

size (images only)

Controls the dimensions of an image in pixels. See the Images section.

Conditional Sections

You can show or hide entire sections in two ways: by checking whether a field has a value, or by using comparisons and expressions (e.g. array length, equality).

Show when a field has a value

If the field is empty or missing, the entire section (including labels) is hidden:

{#hasLoanPurpose}
Purpose of Loan: {hasLoanPurpose}
{/hasLoanPurpose}

{#hasInsuranceRequirements}
Insurance Requirements:
{hasInsuranceRequirements}
{/hasInsuranceRequirements}

Important: If a tag does not exist (no value for that field), it is not rendered—the tag is replaced with nothing. Be mindful of putting labels outside conditionals: those labels will always appear on the document regardless of whether the field has data. To avoid orphaned labels (e.g., "Phone:" with no number), wrap the label and the tag together in a conditional: {#hasPhone}Phone: {hasPhone}{/hasPhone}.

Conditionals with comparisons

You can use comparisons and expressions inside conditionals. Use {/} to close the block when the opening tag is an expression.

Array length — show content only when there are multiple (or any) items:

{#entries.length > 1}
This loan includes multiple catalog entries.
{/}

{#relatedIndividuals.length > 0}
The following people or organizations are associated with this record.
{/}

The first block renders only if there is more than one catalog entry. The second renders only if there is at least one related individual.

Equality — show content when a specific value matches:

{#entries[0].hasName == "Monitor"}
The first cataloged item is titled "Monitor".
{/}

{#hasAccessionSource.hasName == "Alex Smith"}
Thank you to Alex Smith for this donation.
{/}

The first block renders only when the first entry’s name is exactly "Monitor". The second renders only when the accession source (e.g. donor) name is "Alex Smith". You can use the same pattern with other fields and values (e.g. hasClass, hasCatalogNumber) as needed.

Loops

When you have a list of items (like catalog entries attached to a loan), use loop tags to repeat a section for each item.

Basic Loop

{#entries}
  Name: {hasName}
  Maker: {hasCreateOrManufactureInfo.hasMakerRelation.hasMaker}
{/entries}

The opening tag {#entries} and closing tag {/entries} define the repeated section. Everything between them is output once per entry. Inside the loop, you use entry fields like {hasName}, {hasCatalogNumber}, {hasCreateOrManufactureInfo.hasMakerRelation.hasMaker}, etc.—the context is each entry.

Numbered Lists

Use the built-in $index variable (0-based) to create numbered lists:

{#entries}
  Item {$index + 1}: {hasName}
{/entries}

Conditional Content Inside Loops

Show content only when a value exists:

{#entries}
  Title: {hasName}
  {#hasCreateOrManufactureInfo.hasMakerRelation.hasMaker}Maker: {hasCreateOrManufactureInfo.hasMakerRelation.hasMaker}{/hasCreateOrManufactureInfo.hasMakerRelation.hasMaker}
{/entries}

The conditional block only appears if the entry has a maker.

Images

To insert an image, use the {% prefix (note the percent sign):

{%account.logo | size:200:80}

The size filter sets width and height in pixels: size:WIDTH:HEIGHT.

For entry images inside a loop, use the first media item's thumbnail path:

{#entries}
  {%media[0].meta_info.thumbnail_2x.path | size:150:150}
  {hasName}
{/entries}

Without a size filter, images default to 100x100 pixels.

Working with People & Organizations

Many fields in CatalogIt reference Person or Organization records (like donors, lenders, borrowers, contacts, makers, etc.). These fields contain full individual records with their own properties.

Accessing Individual Properties

When a field references a person or organization, use dot notation to access their details:

Donor: {hasAccessionSource.hasName}
Email: {hasAccessionSource.hasEmails.hasEmail}
Phone: {hasAccessionSource.hasPhones.hasPhone}

Common Person/Organization Fields

All Person and Organization records share these properties:

Field

Template Tag (example with donor)

Name {hasAccessionSource.hasName}
Role/Tag {hasAccessionSource.hasTag}
Email {hasAccessionSource.hasEmails.hasEmail}
Phone {hasAccessionSource.hasPhones.hasPhone}
Street Address {hasAccessionSource.hasAddress.hasStreet}
City {hasAccessionSource.hasAddress.hasCity}
State {hasAccessionSource.hasAddress.hasState}
Postal Code {hasAccessionSource.hasAddress.hasPostalCode}
Country {hasAccessionSource.hasAddress.hasCountry}
Description {hasAccessionSource.hasDescription}
Notes {hasAccessionSource.hasNoteProperties}
Web Links {hasAccessionSource.hasWebLink}
Also Known As {hasAccessionSource.hasAlsoKnownAs}

Person-Specific Fields

When the individual is a Person, these additional fields are available:

Field

Template Tag (example)

First Name {hasAccessionSource.hasFirstName}
Last Name {hasAccessionSource.hasLastName}
Middle Name {hasAccessionSource.hasMiddleName}
Suffix {hasAccessionSource.hasSuffix}
Title {hasAccessionSource.hasTitle}
Gender {hasAccessionSource.hasGender}
Date of Birth {hasAccessionSource.hasDateOfBirth}
Date of Death {hasAccessionSource.hasDateOfDeath}
Place of Birth {hasAccessionSource.hasPlaceOfBirth}
Place of Death {hasAccessionSource.hasPlaceOfDeath}
Nationality {hasAccessionSource.hasNationality}
Ethnicity {hasAccessionSource.hasEthnicity}

Organization-Specific Fields

When the individual is an Organization, these additional fields are available:

Field

Template Tag (example)

Organization Type {hasAccessionSource.hasType}
Dates of Operation {hasAccessionSource.hasOrganizationDate}
Contact Person (Person) {hasAccessionSource.hasContactPerson.hasName}

Example: Full Address Block

{hasAccessionSource.hasName}
{#hasAccessionSource.hasAddress}
{hasStreet}
{hasCity}, {hasState} {hasPostalCode}
{/hasAccessionSource.hasAddress}

Inside {#hasAccessionSource.hasAddress}...{/hasAccessionSource.hasAddress}, the context is the address object, so you use {hasStreet}, {hasCity}, etc. without repeating the prefix.

Which Fields Reference Individuals?

In the following field reference tables, individual fields are marked with (Person/Org). These fields contain full Person or Organization records and support dot notation access to nested properties.

Accession Fields

These fields are available when generating a form from an Accession record.

Field Label

Template Tag

Accession Number {hasName}
Source or Donor (Person/Org) {hasAccessionSource.hasName}
Contact (Person/Org) {hasAccessionSourceContact.hasName}
Status {hasAccessionStatus}
Accession Date {hasAccessionDate}
Accessioned By (Person/Org) {hasAccessionPerson.hasName}
Received By (Person/Org) {hasAccessionReceivedBy.hasName}
Date Received {hasAccessionReceivedDate}
Formal Appraisal {hasAppraisal}
Receipt Method {hasReceiptMethod}
Acquisition Method {hasAquisitionMethod}
Approved By (Person/Org) {hasAuthorizedBy.hasName}
Proposed By (Person/Org) {hasProposedBy.hasName}
Funding Source {hasFundingSource}
Credit Line {hasAquisitionCreditLine}
Price or Value at Acquisition {hasAquisitionPrice}
Description {hasDescription}
General Notes {hasNotes}
Relationships {hasRelationship}
Related Deaccessions {hasDeaccessionRelation}
Related Shipment {hasShipment}

Note: Fields marked (Person/Org) reference Person or Organization records. Use .hasName to get the name, or access other properties like .hasEmail, .hasPhone, etc. See Working with People & Organizations.

Example: Deed of Gift

DEED OF GIFT

Date: {today | formatDate}
Accession Number: {hasName}

Donor: {hasAccessionSource.hasName}
{#hasAccessionSource.hasAddress}
{hasStreet}
{hasCity}, {hasState} {hasPostalCode}
{/hasAccessionSource.hasAddress}

{#hasAccessionSource.hasEmails}Email: {hasEmail}{/hasAccessionSource.hasEmails}
{#hasAccessionSource.hasPhones}Phone: {hasPhone}{/hasAccessionSource.hasPhones}

Date Received: {hasAccessionReceivedDate | formatDate}
Received By: {hasAccessionReceivedBy.hasName}
Approved By: {hasAuthorizedBy.hasName}

Description:
{hasDescription}

Items:
{#entries}
  - {hasName} ({hasCatalogNumber})
    {hasDescription}
{/entries}

Temporary Custody Fields

These fields are available when generating a form from a Temporary Custody record.

Field Label

Template Tag

Temporary Deposit No. {hasName}
Source or Donor (Person/Org) {hasAccessionSource.hasName}
Contact (Person/Org) {hasAccessionSourceContact.hasName}
Status {hasTemporaryCustodyStatus}
Purpose {hasTemporaryCustodyPurpose}
Purpose Notes {hasTemporaryCustodyPurposeNotes}
Approved By (Person/Org) {hasAuthorizedBy.hasName}
Date Received {hasDateReceived}
Due Date for Return {hasDateDue}
Date Returned {hasDateReturned}
Received By (Person/Org) {hasReceivedBy.hasName}
Returned By (Person/Org) {hasReturnedBy.hasName}
Valuation {hasEstimateAmount}
Insured By {hasInsuredBy}
Insurance Notes {hasInsuranceNotes}
Provenance Notes {hasProvenanceNotes}
Incoming Shipping Method {hasShippingIncomingNotes}
Outgoing Shipping Method {hasShippingOutgoingNotes}
Credit Line {hasAquisitionCreditLine}
Description of the Item(s) {hasDescription}
General Notes {hasNotes}
Relationships (Person/Org) {hasRelationship.hasName}
Related Shipment {hasShipment}

Note: Fields marked (Person/Org) reference Person or Organization records. Use .hasName to get the name, or access other properties. See Working with People & Organizations.

Example: Temporary Custody Agreement

TEMPORARY CUSTODY RECEIPT

Date: {today | formatDate}
Receipt No.: {hasName}

Received from: {hasAccessionSource.hasName}
Contact: {hasAccessionSourceContact.hasName}

Date Received: {hasDateReceived | formatDate}
Received By: {hasReceivedBy.hasName}
Due for Return: {hasDateDue | formatDate}

Purpose: {hasTemporaryCustodyPurpose}

Description:
{hasDescription}

{#hasInsuranceNotes}
Insurance Notes: {hasInsuranceNotes}
{/hasInsuranceNotes}

Loan In Fields

These fields are available when generating a form from a Loan In record.

Field Label

Template Tag

Loan In Number {hasName}
Lender (Person/Org) {hasLender.hasName}
Lender Contact (Person/Org) {hasContactPerson.hasName}
Status {hasLoanStatus}
Purpose of Loan {hasLoanPurpose}
Conditions of Loan {hasLoanConditions}
Description of Item(s) Borrowed {hasLoanItemsDescription}
Approved By (Person/Org) {hasAuthorizedBy.hasName}
Received By (Person/Org) {hasReceivedBy.hasName}
Requested Arrival Date {hasDateArrival}
Actual Arrival Date {hasDateReceived}
Requested Return Date {hasDateDue}
Actual Return Date {hasDateReturned}
Credit Line {hasCreditLine}
Insurance {hasInsuranceDetails}
Insurance Requirements {hasInsuranceRequirements}
Loan In Description {hasDescription}
General Notes {hasNoteProperties}
Relationships (Person/Org) {hasRelationship.hasName}
Related Exhibition {hasExhibitionRelation}
Related Shipment {hasShipment}

Note: Fields marked (Person/Org) reference Person or Organization records. Use .hasName to get the name, or access other properties. See Working with People & Organizations.

Example: Loan In Agreement

LOAN AGREEMENT (INCOMING)

Date: {today | formatDate}
Loan Number: {hasName}

Lender: {hasLender.hasName}
Contact: {hasContactPerson.hasName}
{#hasContactPerson.hasEmails}Email: {hasEmail}{/hasContactPerson.hasEmails}

Purpose: {hasLoanPurpose}
Conditions: {hasLoanConditions}

Arrival Date: {hasDateArrival | formatDate}
Return Date: {hasDateDue | formatDate}

Items on Loan:
{#entries}
  {$index + 1}. {hasName} ({hasCatalogNumber})
{/entries}

Total Insurance Value: {totalInsuranceValue}

Loan Out Fields

These fields are available when generating a form from a Loan Out record.

Field Label

Template Tag

Loan Out Name {hasName}
Borrower (Person/Org) {hasBorrower.hasName}
Borrower Contact (Person/Org) {hasContactPerson.hasName}
Status {hasLoanStatus}
Purpose of Loan {hasLoanPurpose}
Conditions of Loan {hasLoanConditions}
Description of Item(s) Lent {hasLoanItemsDescription}
Approved By (Person/Org) {hasAuthorizedBy.hasName}
Requested Ship Date {hasDateShip}
Actual Ship Date {hasDateLoaned}
Requested Return Date {hasDateDue}
Actual Return Date {hasDateReturned}
Exhibition Start Date {hasExhibitionDateStart}
Exhibition End Date {hasExhibitionDateEnd}
Insurance {hasInsuranceDetails}
Insurance Requirements {hasInsuranceRequirements}
Loan Out Description {hasDescription}
General Notes {hasNoteProperties}
Related Shipment {hasShipment}

Note: Fields marked (Person/Org) reference Person or Organization records. Use .hasName to get the name, or access other properties. See Working with People & Organizations.

Example: Loan Out Agreement

LOAN AGREEMENT (OUTGOING)

Loan Number: {hasName}
Date: {today | formatDate}

Borrower: {hasBorrower.hasName}
Contact: {hasContactPerson.hasName}

Purpose: {hasLoanPurposeOrExhibition}
Ship Date: {hasDateShip | formatDate}
Return Date: {hasDateDue | formatDate}

{#hasExhibitionDateStart}
Exhibition: {hasExhibitionDateStart | formatDate} - {hasExhibitionDateEnd | formatDate}
{/hasExhibitionDateStart}

Objects Lent:
{#entries}
  {$index + 1}. {hasName} ({hasCatalogNumber})
     {#hasCreateOrManufactureInfo.hasMakerRelation.hasMaker}by {hasCreateOrManufactureInfo.hasMakerRelation.hasMaker}{/hasCreateOrManufactureInfo.hasMakerRelation.hasMaker}
     {%media[0].meta_info.thumbnail_2x.path | size:100:100}
{/entries}

Total Insurance Value: {totalInsuranceValue}
Number of Items Valued: {numEntriesWithValuation}

Catalog Entry Fields

Each form includes the catalog entries (items) linked to the record. You can access a single entry by index (e.g., the first entry's name: {entries[0].hasName}). To repeat content for each entry, use a loop: {#entries}...{/entries}. Inside the loop, the following fields are available:

Field Label

Template Tag

Name/Title {hasName}
Entry/Object ID {hasCatalogNumber}
Classification {hasClass}
Description {hasDescription}
General Notes {hasNoteProperties}
Tags {hasTag}
Create Date {hasCreateDate}
Created By (Person/Org) {hasCreateUser.hasName}
Update Date {hasUpdateDate}
Updated By (Person/Org) {hasUpdateUser.hasName}

Note: Dates like hasCreateDate and hasUpdateDate under #entries are not formatted properly. You need to use the formatDate filter on these: {hasCreateDate | formatDate}

Creation & Maker Details

Nested under hasCreateOrManufactureInfo:

Field Label

Template Tag

Date Made (from) {hasCreateOrManufactureInfo.hasMadeDate.hasFromTime}
Date Made (to) {hasCreateOrManufactureInfo.hasMadeDate.hasToTime}
Maker (Person/Org) {hasCreateOrManufactureInfo.hasMakerRelation.hasMaker.hasName}
Maker Attribution {hasCreateOrManufactureInfo.hasMakerAttribution}
Place Made {hasCreateOrManufactureInfo.hasMadePlace}
Manufacturer (Person/Org) {hasCreateOrManufactureInfo.hasManufacturer.hasName}
Time Period {hasCreateOrManufactureInfo.hasTimePeriod}

Note: In the real data, hasMaker is often a string (the name), not always a full Person object. Test your template with actual data to see which format you have.

Dimensions

Nested under hasDimensions. Note: hasDimensions can be a single object or an array of dimension sets (e.g., frame dimensions + panel dimensions). When it's an array, loop over it or access the first set with hasDimensions[0].

For a single dimension set:

Field Label

Template Tag

Height {hasDimensions.hasHeight}
Width {hasDimensions.hasWidth}
Depth {hasDimensions.hasDepth}
Length {hasDimensions.hasLength}
Diameter {hasDimensions.hasDiameter}
Circumference {hasDimensions.hasCircumference}
Weight {hasDimensions.hasWeight}
Description {hasDimensions.hasDescription}

For multiple dimension sets (loop):

{#hasDimensions}
  {hasDescription}: H: {hasHeight}, W: {hasWidth}, D: {hasDepth}
{/hasDimensions}

If a field doesn't exist for a given dimension set (e.g., hasWidth is blank), the label will still render and you can get hanging text like "W: , D:" in the output. To avoid that, wrap each part in a conditional (e.g., {#hasWidth}W: {hasWidth}{/hasWidth}) so only present dimensions are shown.

Materials, Medium & Colors

Field Label

Template Tag

Medium (Art) {hasArtProperties.hasMedium}
Material {hasMaterials.hasMaterial}
Color {hasColors.hasColor}

Acquisition & Valuation

Field Label

Template Tag

Purchase Price {hasAquisitionInfo.hasPurchasePrice}
Purchase Date {hasAquisitionInfo.hasPurchaseDate}
Credit Line {hasAquisitionInfo.hasAquisitionCreditLine}
Accession Number {hasAquisitionInfo.hasAccession.hasName}
Accession Source {hasAquisitionInfo.hasAccession.hasAccessionSource}
Estimate Amount {hasValuation.hasEstimateAmount}
Estimate Date {hasValuation.hasEstimateDate}
Valuation Type {hasValuation.hasValuationType}
Estimator (Person/Org) {hasValuation.hasEstimator.hasName}

Condition

Nested under hasCondition. Note: hasCondition can be a single object or an array of condition reports. When it's an array, loop over it or access the first report with hasCondition[0].

For a single condition report:

Field Label

Template Tag

Condition Rating {hasCondition.hasConditionRating}
Condition Date {hasCondition.hasConditionDate}
Examined By (Person/Org) {hasCondition.hasConditionExaminedBy.hasName}
Exam Reason {hasCondition.hasConditionExamReason}

For multiple condition reports (loop):

{#hasCondition}
  {hasConditionDate | formatDate}: {hasConditionRating} (examined by {hasConditionExaminedBy.hasName})
{/hasCondition}

Location

Note: hasLocation can be a single object or an array of location records (for tracking movement history).

For a single location:

Field Label

Template Tag

Location {hasLocation.hasLocation}
Category {hasLocation.hasCategory}
Date {hasLocation.hasDateValue}

For multiple locations (loop):

{#hasLocation}
  {hasLocation} ({hasCategory}) - {hasDateValue | formatDate}
{/hasLocation}

Loans & Intake

Field Label

Template Tag

Loan In Number {hasIntake.hasLoanInRelation.hasLoanIn.hasName}
Loan In Lender {hasIntake.hasLoanInRelation.hasLoanIn.hasLender}
Loan In Credit Line {hasIntake.hasLoanInRelation.hasCreditLine}
Temporary Custody Number {hasIntake.hasTemporaryCustody}

Provenance

Field Label

Template Tag

Provenance {hasProvenance}

Publication Properties

For entries classified as publications (books, articles, etc.):

Field Label

Template Tag

Author (Person/Org) {hasPublicationProps.hasAuthor.hasName}
Publisher (Person/Org) {hasPublicationProps.hasPublisher.hasName}
Publish Date {hasPublicationProps.hasPublishDate.hasFromTime}

Note: Like hasMaker, the hasAuthor field is often a string (the name) rather than a full Person object.

Important: All entry fields above are used inside an {#entries}...{/entries} loop. Nested fields use dot notation (e.g., {hasDimensions.hasHeight}). Some fields like hasDimensions, hasCondition, and hasLocation can be arrays—loop over them or access the first item with [0].

Account Fields

Your organization's account information is available under the account prefix:

Field

Template Tag

Organization name {account.name}
Description {account.description}
Address {account.address}
Website {account.website_url}
Logo (image) {%account.logo | size:200:80}

When a form includes references to other people or organizations (beyond the main individual fields), they are provided in the relatedIndividuals array.

Structure

relatedIndividuals is an array containing all referenced individuals and organizations. Each individual has a hasClass property that indicates its type (e.g., Person, Organization, Person or Organization, Exhibition).

Loop through all related individuals:

{#relatedIndividuals}
  Related {hasClass}: {hasName}
  {#hasTag}Role: {hasTag}{/hasTag}
{/relatedIndividuals}

Filter by type using conditionals:

{#relatedIndividuals}
  {#hasClass == "Person or Organization"}
    Person/Org: {hasName}
  {/hasClass}
  {#hasClass == "Exhibition"}
    Exhibition: {hasName}
    Dates: {hasFromTime} to {hasToTime}
  {/hasClass}
{/relatedIndividuals}

Each related individual has the same properties as described in Working with People & Organizations.

Computed Fields

These fields are automatically calculated and added to every form:

Field

Template Tag

Description

Today's date {today | formatDate} Current date as a Date object. Always use the formatDate filter to display it. Raw output is ISO format like 2026-02-05T22:30:11.346Z.
Total insurance value {totalInsuranceValue} Sum of all entry valuations, formatted as currency (e.g., $6670.00)
Entries with valuation {numEntriesWithValuation} Count of entries that have a valuation amount
Loan purpose or exhibition {hasLoanPurposeOrExhibition} Exhibition name if linked, otherwise the loan purpose text
Exhibition start date {hasExhibitionDateStart} Start date from a linked exhibition (if any)
Exhibition end date {hasExhibitionDateEnd} End date from a linked exhibition (if any)

Invalid Template Errors

If you upload a custom form template with invalid tag formatting (for example, a missing closing brace or malformed loop syntax), CatalogIt will show an error window when you try to generate the form. The message will specify what went wrong (e.g., which tag or section caused the issue).

Fix the problem in your .docx template and re-upload the file.

Tips & Best Practices

Test with real data. After creating your template, generate a form from an actual record to verify tags are working. The data structure can vary based on your specific records.

Use conditional sections for optional fields. Wrap a label and its tag together so blank fields don't leave awkward labels:

  1. {#hasInsuranceRequirements}Insurance: {hasInsuranceRequirements}{/hasInsuranceRequirements}
    

Person/Organization fields need .hasName. When a field references a person or organization (marked (Person/Org) in the tables), use dot notation: {hasAccessionSource.hasName}, not just {hasAccessionSource}.

Watch for arrays. Fields like hasDimensions, hasCondition, and hasLocation can be arrays. If you see unexpected output, try looping over the field or accessing the first item with [0] (e.g., hasLocation[0])

Most dates are pre-formatted. Individual record dates like hasDateArrival or hasDateDue are already formatted (e.g., "Jul 28, 2025"). Only use formatDate for the special {today} field or ISO-format dates.

Size your images. Without the size filter, images default to 100x100px. Use | size:WIDTH:HEIGHT to control the display size.

Keep tag names exact. Tags are case-sensitive. {hasName} works, {HasName} or {hasname} will not.

Check spelling carefully. A misspelled tag (e.g., {hasNme}) will silently render as blank.

Some maker/author fields are strings. In entry data, fields like hasMaker and hasAuthor are often plain strings (the person's name) rather than full Person objects. Test your template to see which format your data uses.

Need Help?

If you need to find the key for a specific field, look at the field label in CatalogIt and find it in the tables above. The "Template Tag" column shows exactly what to type in your template.

For questions or assistance creating templates, contact CatalogIt support.