> ## Documentation Index
> Fetch the complete documentation index at: https://docs.passentry.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Batch Pass Update

> Learn how to update existing passes in bulk using CSV uploads in the PassEntry Dashboard, including partial updates, template field mapping and how to track progress and resolve errors.

**Batch Pass Update** allows you to modify existing passes in bulk using a CSV file. Use this feature when you need to apply the same type of change to many passes at once, such as updating expiration dates, modifying pass fields, deactivating passes or adjusting NFC and barcode settings.

<Info>
  This guide covers updating passes via CSV upload in the PassEntry Dashboard.
  For programmatic bulk updates, see the [Batch Pass Update API documentation](/api-reference/v1/batches/update-passes-batch).
  For recurring or real-time per-pass updates, use the standard [Update Pass API](/api-reference/v1/passes/update-pass).
</Info>

<h2>Step by Step</h2>
Head over to the Bulk Operations section, you will find an "Update via CSV" button.

Then, create a new batch.
Optionally enter a batch name, and select the pass template you want the passes to be updated under.

<img style={{border: "1px solid #e0e0e0", borderRadius: "10px"}} src="https://mintcdn.com/passentry-0/HmGZWgR5hl_EFpPJ/documentation/bulk-operations/batch-pass-update/update-form.png?fit=max&auto=format&n=HmGZWgR5hl_EFpPJ&q=85&s=33830bc874b5c98ae3cee2dd8cbc6912" width="2420" height="1548" data-path="documentation/bulk-operations/batch-pass-update/update-form.png" />

**Sample CSV**

Once you've selected your Pass Template, you will be able to download a sample CSV, specific to your chosen Pass Template.

You can download an example CSV here: [HERE](/assets/passentry-pass-batch-update-sample.csv)

## Configuration

<Warning>
  Ensure the CSV is formatted in UTF-8 encoding.
</Warning>

### Fixed headers

For more information on the functionality of each field, please refer to the [API Reference](../../../api-reference/v1/passes/update-pass).

<table>
  <thead>
    <tr>
      <th>Column Name</th>
      <th>Description</th>
      <th>Required?</th>
      <th>Example</th>
      <th>Type</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>pass\_id</td>
      <td>UUID or external ID for the pass</td>
      <td>Yes</td>
      <td>1234567890</td>
      <td>Text (uuid or extId)</td>
    </tr>

    <tr>
      <td>group\_tags</td>
      <td>Comma separated tags to group passes</td>
      <td>No</td>
      <td>summer\_offer\_24</td>
      <td>Text (Any)</td>
    </tr>

    <tr>
      <td>nfc\_enabled</td>
      <td>Boolean to enable NFC</td>
      <td>No</td>
      <td>true</td>
      <td>Boolean (true or false)</td>
    </tr>

    <tr>
      <td>nfc\_source</td>
      <td>Source of NFC data</td>
      <td>No</td>
      <td>extId</td>
      <td>Text (extId or uuid or custom)</td>
    </tr>

    <tr>
      <td>nfc\_custom\_value</td>
      <td>Custom value for NFC, nfc\_source must be set to custom</td>
      <td>No</td>
      <td>summer\_20\_off</td>
      <td>Text (any)</td>
    </tr>

    <tr>
      <td>barcode\_enabled</td>
      <td>Boolean to enable barcode</td>
      <td>No</td>
      <td>true</td>
      <td>Boolean (true or false)</td>
    </tr>

    <tr>
      <td>barcode\_type</td>
      <td>Type of barcode</td>
      <td>No</td>
      <td>qr</td>
      <td>Text (qr, code128, aztec or pdf417)</td>
    </tr>

    <tr>
      <td>barcode\_source</td>
      <td>Source of barcode</td>
      <td>No</td>
      <td>extId</td>
      <td>Text (extId, uuid or custom)</td>
    </tr>

    <tr>
      <td>barcode\_value</td>
      <td>Value for the barcode, barcode\_source must be set to custom</td>
      <td>No</td>
      <td>abcd12345</td>
      <td>Text (Any)</td>
    </tr>

    <tr>
      <td>barcode\_display\_text</td>
      <td>Boolean to display barcode value as text</td>
      <td>No</td>
      <td>true</td>
      <td>Boolean (true or false)</td>
    </tr>

    <tr>
      <td>expires\_at</td>
      <td>Expiration date and time for the pass</td>
      <td>No</td>
      <td>2024-08-14T18:12:11Z</td>
      <td>Datetime in iso8601 format</td>
    </tr>

    <tr>
      <td>pass\_action</td>
      <td>Action to perform on the pass</td>
      <td>No</td>
      <td>deactivate</td>
      <td>Text (deactivate or reactivate)</td>
    </tr>

    <tr>
      <td>override\_background\_color</td>

      <td>
        Override the background colour of the pass, or `null` to revert to template default.
        [Restrictions apply depending on device and template type](../../../api-reference/v1/passes/update-pass#body-pass-template-override)
      </td>

      <td>No</td>
      <td>#000000</td>
      <td>Text (hex colour code or `null`)</td>
    </tr>

    <tr>
      <td>override\_label\_color</td>

      <td>
        Override the label colour of the pass, or `null` to revert to template default.
        [Restrictions apply depending on device and template type](../../../api-reference/v1/passes/update-pass#body-pass-template-override)
      </td>

      <td>No</td>
      <td>#FFFFFF</td>
      <td>Text (hex colour code or `null`)</td>
    </tr>

    <tr>
      <td>override\_text\_color</td>

      <td>
        Override the text colour of the pass, or `null` to revert to template default.
        [Restrictions apply depending on device and template type](../../../api-reference/v1/passes/update-pass#body-pass-template-override)
      </td>

      <td>No</td>
      <td>#FFFFFF</td>
      <td>Text (hex colour code or `null`)</td>
    </tr>

    <tr>
      <td>override\_banner\_image\_asset\_id</td>
      <td>UUID of a processed [Image Asset](/api-reference/v1/image-assets/guide) to use as the banner image, or `null` to remove</td>
      <td>No</td>
      <td>f47ac10b-58cc-4372-a567-0e02b2c3d479</td>
      <td>Text (UUID or `null`)</td>
    </tr>

    <tr>
      <td>override\_logo\_image\_asset\_id</td>
      <td>UUID of a processed [Image Asset](/api-reference/v1/image-assets/guide) to use as the logo image, or `null` to remove</td>
      <td>No</td>
      <td>f47ac10b-58cc-4372-a567-0e02b2c3d479</td>
      <td>Text (UUID or `null`)</td>
    </tr>

    <tr>
      <td>override\_thumbnail\_image\_asset\_id</td>
      <td>UUID of a processed [Image Asset](/api-reference/v1/image-assets/guide) to use as the thumbnail image (generic passes only), or `null` to remove</td>
      <td>No</td>
      <td>f47ac10b-58cc-4372-a567-0e02b2c3d479</td>
      <td>Text (UUID or `null`)</td>
    </tr>
  </tbody>
</table>

<Info>
  Template override columns require template overrides to be enabled for your organisation. Image assets must be uploaded and fully processed before they can be referenced by UUID. See the [Image Assets guide](/api-reference/v1/image-assets/guide) for details.

  Set any override column to the literal string `null` to remove the override and revert to the template default.
</Info>

### Dynamic headers

As each template might have custom fields, this can be identified and set via custom, dynamic headers.
When creating a template, you set an `ID` for each field.

This can then be targeted in your CSV by including the prefix `passfield_` followed by your template ID.

<Info>
  You only need to include columns for the fields you wish to update. Any columns omitted from the CSV will remain unchanged on the pass. The only required column is `pass_id`.
</Info>

Example:
In your pass template, you've chosen to display Field 1 as "Customer Name", and given it the `ID` of "name".

Then, for each row in your CSV, you've entered a different name, to correspond with the data downloaded from your system.

In which case, your CSV would need to have a row called `passfield_name`

<img style={{border: "1px solid #e0e0e0", borderRadius: "10px"}} src="https://mintcdn.com/passentry-0/HmGZWgR5hl_EFpPJ/documentation/bulk-operations/batch-pass-update/dynamic-field-id-example.png?fit=max&auto=format&n=HmGZWgR5hl_EFpPJ&q=85&s=2d4e344dc2436be8cd00466ba48ef39b" width="560" height="347" data-path="documentation/bulk-operations/batch-pass-update/dynamic-field-id-example.png" />

### Special Characters and Markdown

When working with CSV files that include special characters such as commas, quotes, or line breaks—and especially when embedding HTML or markdown-style content—it’s important to format fields correctly to ensure they are parsed reliably.

Follow these rules:

* Commas (`,`): Wrap the entire field in double quotes (`"`).
* Line breaks (`\n`): Wrap the entire field in double quotes (`"`).
* Double quotes (`"`) inside fields: Use double quotes around the field, and escape inner quotes by doubling them (`""`).
* Markdown or HTML: Use double quotes around the full field, and use single quotes inside HTML attributes to avoid quote conflicts, or escape double quotes if needed.

For example\*\*:\*\*

| Desired Field Content                      | CSV-Compliant Value                            |
| ------------------------------------------ | ---------------------------------------------- |
| London, UK                                 | "London, UK"                                   |
| London\nUK (line break)                    | "London\nUK"                                   |
| `<a href="https://example.com">Link</a>`   | `"<a href='https://example.com'>Link</a>"`     |
| "Quoted Text"                              | """Quoted Text"""                              |
| `<a href="https://example.com">"Link"</a>` | `"<a href='https://example.com'>""Link""</a>"` |

This will ensure that the special characters are handled correctly, and the markdown is rendered as expected.

## Tracking and managing your batches

Once you've uploaded your CSV, you'll be able to track the progress of your batch.
The progress bar will update in real-time, and you'll be able to see the number of passes processed, pending, and total.

If the progress bar is not updating, please refresh the page.

<img style={{border: "1px solid #e0e0e0", borderRadius: "10px"}} src="https://mintcdn.com/passentry-0/HmGZWgR5hl_EFpPJ/documentation/bulk-operations/batch-pass-update/pass-update-index.png?fit=max&auto=format&n=HmGZWgR5hl_EFpPJ&q=85&s=c28b82a369fe4c587cbc0ab933dbaacb" width="2482" height="1266" data-path="documentation/bulk-operations/batch-pass-update/pass-update-index.png" />

The batch will be listed in the "Batches" section, and you can click on it to see the progress of the batch.

* **Main Information**: Each batch displays key details such as the batch name, template name, status, and scheduled time.
* **Cancelling a scheduled batch**: You can cancel a scheduled batch at any time prior to the scheduled update time.
* **Rescheduling a batch**: To reschedule an existing batch, cancel it, and create a new batch with the desired scheduled time.
* **Updating a batch ahead of schedule**: You can update a batch ahead of schedule by clicking the "Update now" button. This will process the updates immediately.

## Error handling

If there are any errors, you'll be able to download a CSV of the errors that occurred, and once you've fixed them, you can re-upload the CSV to try again.

## FAQ

### Will this overwrite all fields on my passes?

No. Only the columns included in your CSV will be updated. Any fields omitted from the CSV will remain unchanged on the pass.

### When should I use batch updates instead of the Update Pass API?

Use batch updates for one-off or infrequent bulk changes, such as migrations or campaign-wide updates. For real-time or recurring updates, use the Update Pass API.

### What happens if some rows fail to update?

If any rows fail, you can download an error CSV showing which passes failed and why. After fixing the errors, you can re-upload the CSV to retry.


## Related topics

- [Update Passes Batch](/api-reference/v1/batches/update-passes-batch.md)
- [Pass Lifecycle](/documentation/passes/lifecycle/guide.md)
