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

# Voucher Code Import

> Turn a partner's spreadsheet of codes into ready-to-send offers in minutes, with validation that catches bad codes before a customer ever sees one.

The Voucher Code importer loads a CSV of one-time-use codes from a partner
business into an [external voucher](/marketing-and-ai/flex-engage/external-vouchers)'s
pool. Once imported, FlexEngage assigns each code to a single customer at send
time, so every code redeems exactly once at the partner's point of sale.

<Frame>
  <img src="https://mintcdn.com/flexwash/Ro0a82FWcYHPhp-h/data-import/external-voucher-codes-import/voucher-codes-import-page.jpg?fit=max&auto=format&n=Ro0a82FWcYHPhp-h&q=85&s=bc1635af6151eceb076643a6772327a7" alt="Import Voucher Codes page" width="1408" height="873" data-path="data-import/external-voucher-codes-import/voucher-codes-import-page.jpg" />
</Frame>

## Where to Find It

Open **Admin -> Import -> Voucher Codes** in the left navigation, or click
**Import Codes** on the External Vouchers page. The page has two tabs:
**Import** for new uploads and **History** for every prior upload in this
organization. You need at least the Admin role.

<Note>
  Only **Single Use** vouchers accept code imports. Multi Use vouchers share
  one code across all recipients and need no import.
</Note>

## File Format

Your CSV must contain a single required column:

| Column | Description                                                         |
| ------ | ------------------------------------------------------------------- |
| `code` | The one-time-use code the customer presents at the partner business |

Every code is validated against the target voucher's barcode type, so an
unscannable code is rejected before it can ever be sent:

| Barcode type | Allowed characters                                   |
| ------------ | ---------------------------------------------------- |
| Code 39      | Digits, uppercase letters, spaces, and `- . $ / + %` |
| Code 128     | Printable ASCII characters                           |
| QR Code      | Any non-empty text                                   |

A sample CSV is available on the import page itself.

## Running an Import

<Steps>
  <Step title="Select the target voucher">
    Choose the Single Use voucher the codes belong to. The dropdown shows how
    many codes each voucher has left.
  </Step>

  <Step title="Upload the CSV">
    Drag and drop the file, or click to select it. The maximum file size is
    50MB. FlexWash validates the whole file first; nothing is written yet.
  </Step>

  <Step title="Review and confirm">
    A confirmation dialog shows the number of codes about to be imported and
    the target voucher. Type your organization name to enable the import
    button.

    <Frame>
      <img src="https://mintcdn.com/flexwash/Ro0a82FWcYHPhp-h/data-import/external-voucher-codes-import/voucher-codes-import-confirm.jpg?fit=max&auto=format&n=Ro0a82FWcYHPhp-h&q=85&s=aa3c8c5d79c4c23b2a98ce8e68614460" alt="Import confirmation dialog" width="1408" height="873" data-path="data-import/external-voucher-codes-import/voucher-codes-import-confirm.jpg" />
    </Frame>
  </Step>

  <Step title="Track the import">
    The import runs in the background with a live progress bar. Large files
    process in batches, and the finished import reports how many codes were
    newly added and how many already existed.
  </Step>
</Steps>

## Validation Rules

The validation pass must come back clean before the import button unlocks:

* The header row must contain the `code` column. Empty rows are ignored.
* Every code must be renderable in the voucher's barcode type (see the
  charset table above). Invalid codes are listed row by row.
* The same code may not appear on multiple rows of one file. In-file
  duplicates block the import until you remove them.

Codes that already exist on the voucher from an earlier upload are **not**
errors: the import skips them and reports them as "already existed". An
existing code is never modified, because it may already be assigned to a
customer.

This makes re-importing safe. If an upload is interrupted or the partner
sends an updated batch that overlaps the old one, upload the full file again
and only the new codes are added.

## History and Rollback

The **History** tab lists every voucher code upload with a link to download
the original file, and lets you roll back an upload.

A rollback deletes the codes that upload added, with one exception: a code
already sent to a customer is kept, because deleting it would break the
voucher page that customer received. The rollback report shows exactly how
many codes were deleted and how many were kept.

<Warning>
  Codes already sent to customers cannot be recalled. Verify the file
  carefully before confirming an import.
</Warning>

## Verify the Import

After the import completes, open **FlexEngage -> External Vouchers** and check
the voucher's **Total Codes** and **Remaining** columns against your CSV row
count. The import summary also breaks the upload down into newly imported
codes and codes that already existed, so the numbers should reconcile exactly.

<Note>
  The channel form's **Test Send** button sends your message text as-is, so
  `{{voucherUrl}}` is not replaced and no code is consumed. To see the
  customer-facing voucher page end to end, run a real Scheduled Blast filtered
  to a test customer.
</Note>
