If you use Tropy to organize your research photos and use Zotero for citations of secondary literature, you can cite the sources you have in Tropy without having to manually type each one into Zotero. You can export Tropy items into a .json file (i.e. metadata of items, not the associated photos), then import the file into Zotero to generate citations automatically. The workflow below uses the 'Zotero Letter'—a customized template—as an example. You can also create your own custom templates compatible with Zotero (see the section below for details).





This section demonstrates how to create a customized Zotero Letter template. By following the step-by-step instructions, you’ll be able to build a template similar to Zotero Letter, tailored to your needs. If you have downloaded the customized templates for Zotero Letter or Zotero Manuscript and have no interest in creating your own, you can skip this section and follow the steps in the preceding section, Export to Zotero. These instructions are based on the Tropy forum post titled Best practice for creating citations.
We'll use the Zotero item type Letter. Its corresponding Citation Style Language (CSL) type is personal_communication. Remember, CSL acts as the bridge that allows Tropy to communicate with Zotero—it's the translator between the two systems.
Let’s approach this from the end goal and work our way back. You need to know all the fields for the item type letter in Zotero to begin, then create all the essential mapping fields in the customized template in Tropy with the CSL fields.
| UI Label | Zotero field | CSL field |
|---|---|---|
| Abstract | abstractNote | |
| Accessed | accessDate | |
| Archive | archive | |
| Loc. in Archive | archiveLocation | |
| Call Number | callNumber | |
| creator |
|
|
| Author | author (author) | |
| Contributor | contributor | |
| Recipient | recipient | |
| Date | date | |
| Extra | extra | |
| Language | language | |
| Type | letterType (type) | |
| Library Catalog | libraryCatalog | |
| Rights | rights | |
| Short Title | shortTitle | |
| Title | title | |
| URL | url |
| UI Label | Zotero field | CSL field |
|---|---|---|
| Archive | archive | |
| Loc. in Archive | archiveLocation | |
| Call Number | callNumber | |
| Author | author (author) | |
| Recipient | recipient | |
| Date | date | |
| Rights | rights | |
| Title | title | |
| URL | url |
Map Zotero fields.
First, map Zotero item type letter in Tropy custom template.
Move the Tropy Type field up and keep it. This is a mandatory field to have.
Use lower-case type in the Label field.
Use "personal_communication" in the default value field, a valid CSL type matching Zotero letter. See the screenshot below for illustration.

The table below shows how the fields are mapped. When you put "type" in the Label field and "personal_communication" in the default value field, you are literally telling the tropy-plugin-csl to write the code ("type": "personal_communication") in the exported .json file. When Zotero imports this file, it recognizes the item as a letter based on that CSL type.
| Zotero UI label | Zotero Item type value | CSL type value | Tropy field |
Tropy UI Label/CSL field |
|---|---|---|---|---|
| Item Type | letter | personal_communication | Type dc:type | type |
Zotero decides how to interpret the data in the CSL .json file based on the value in the Type field. Therefore, your customized template must include the Type field with a valid CSL type value. In our example, the default value of the Type is "personal_communication", which corresponds to letter item type in Zotero.
The CSL type you put in the default value field is case sensitive and must be in lowercase, such as "personal_communication" or "manuscript". There are 45 types in CSL types and 37 types in Zotero item types. To see how Zotero item types match to CSL types and an exhaustive list of all CSL fields per item type, check out this Zotero-CSL-Type-Map document.
Tip: Use "manuscript" as a general-purpose CSL type in the default value field when needed. Avoid using "document"—its citation output omits the archive location, which is essential for citing archival materials.
| Zotero UI Label | Zotero field | CSL field | Tropy field |
Tropy UI Label/CSL field |
|---|---|---|---|---|
| Archive | archive |
Source dc:source |
archive | |
| Loc. in Archive | archiveLocation | Collection tropy:collection | archive_location | |
| Call Number | callNumber | Identifier dc:identifier | call-number | |
| Author | author (author) | Creator dc:creator | author | |
| Recipient | recipient | Audience dcterms:audience | recipient | |
| Date | date | Date dc:date | issued | |
| Rights | rights | Rights dc:rights | license | |
| Title | title | Title dc:title | title | |
| URL | url | Data source bf:dataSource | URL |
For example, the Creator field in Tropy maps to the author field in CSL, as shown below. CSL then passes this value to Zotero, where it also corresponds to the author field.
In other words, the Creator field in Tropy ultimately becomes the author field in Zotero.




Below is a combined table from the above box to show how the Zotero fields have been matched to Tropy fields using CSL fields.
| Zotero UI label | Zotero Item type value | CSL type value | Tropy field |
Tropy UI Label/CSL field |
|---|---|---|---|---|
| Item Type | letter | personal_communication | Type dc:type | type |
| Zotero UI Label | Zotero field | CSL field | Tropy field |
Tropy UI Label/CSL field |
| Archive | archive |
Source dc:source |
archive | |
| Loc. in Archive | archiveLocation | Collection tropy:collection | archive_location | |
| Call Number | callNumber | Identifier dc:identifier | call-number | |
| Author | author (author) | Creator dc:creator | author | |
| Recipient | recipient | Audience dcterms:audience | recipient | |
| Date | date | Date dc:date | issued | |
| Rights | rights | Rights dc:rights | license | |
| Title | title | Title dc:title | title | |
| URL | url | Data source bf:dataSource | URL |