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} |
{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 likehasDimensions,hasCondition, andhasLocationcan 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} |
Related Individuals
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).
Example: Accessing Related Individuals
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:
{#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.