> For the complete documentation index, see [llms.txt](https://help.dollarlabs.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://help.dollarlabs.io/dollarback-store-credit/analytics-data-and-account/bulk-import-credit-csv.md).

# Bulk import credit (CSV)

{% hint style="info" %}
**Plan:** bulk import is a plan-gated feature; check your plan's feature list. It is also blocked entirely on development stores.
{% endhint %}

{% embed url="<https://dollarlabs.neetorecord.com/watch/5556c4b90df71d34cc86>" %}

*This article's section starts at 0:00 in the video.*

When you're done, you'll have credited (or debited) store credit for a whole list of customers from one CSV file. It's the tool for migrations, compensation batches, and B2B credit. This article is the full contract: the exact file format, how jobs run, and how errors are handled.

## Prerequisites

* A plan that includes bulk import (see [Plans, usage & overage billing](/dollarback-store-credit/analytics-data-and-account/plans-usage-and-overage-billing.md)).
* A live store; imports are blocked on development stores.
* Your customers already exist in Shopify; the import matches rows to existing customers, it doesn't create them.

## The CSV format

| Header              | Required                  | Notes                                                                                                                                                                                                                                                                                                                                                                                    |
| ------------------- | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Amount`            | Yes                       | Positive number. Quoted fields and thousand separators are handled: `"8,260.90"` parses fine.                                                                                                                                                                                                                                                                                            |
| `Currency`          | Yes                       | The currency code for the row's amount. The column must exist; a row with an empty value is read as `USD`.                                                                                                                                                                                                                                                                               |
| `Email`             | One of Email / CustomerId | Matches the Shopify customer by email.                                                                                                                                                                                                                                                                                                                                                   |
| `CustomerId`        | One of Email / CustomerId | Matches by Shopify customer ID. **When both are present, CustomerId is tried first.** If no customer has that ID, the import tries the email; the row fails only when neither finds a customer.                                                                                                                                                                                          |
| `CompanyLocationId` | B2B mode only             | Required on every row when the job runs in B2B mode; the credit attaches to the company location instead of a customer. Enter the number only (for example `123456789`), not the full `gid://shopify/CompanyLocation/...` ID. The row still needs an Email or CustomerId of an existing customer.                                                                                        |
| `ExpiryDays`        | No                        | Whole days until that row's credit expires. Leave blank to use the job's **Credit expires** setting, or `0` for never. A value that isn't a whole number of 0 or more is ignored, and the row uses the job's setting.                                                                                                                                                                    |
| `ExpiresAt`         | No                        | An exact expiry for that row; it overrides `ExpiryDays`. `2026-12-31` is the end of that day and `2026-12-31 18:00` is that time, both in your store's time zone. A value with an offset, such as `2026-12-31T18:00:00+05:30`, is that exact moment. It must be at least an hour in the future. A value that isn't a date stops the whole file, so nothing is imported until you fix it. |

Header names are not case-sensitive (`email`, `Email` and `EMAIL` all work), columns can be in any order, and columns DollarBack doesn't know are ignored.

Additional constraints:

* **File size:** 5 MB maximum. Split larger files into multiple jobs.
* **Invalid rows are dropped before the job starts.** A row with no email and no customer ID, an amount that isn't a number, or an amount of 0 or less is left out of the job. It doesn't appear in the job log, and it isn't counted in the job's total. Compare the job's total with the number of rows in your file to spot dropped rows. (The note on the page says invalid rows are "skipped and logged"; they are skipped, but not logged.)
* **Amounts are always positive.** Whether the job credits or debits is set on the job, not per row.
* **Duplicates are not deduped.** Two rows for the same customer credit that customer twice. Clean your file before importing.

## Run an import

1. Open **DollarBack admin → Home** and, in the **Quick links** card, click **Open** next to **Bulk import**.
2. In the **Upload CSV File** section, click **Choose CSV File** and select your file.
3. Set **Action Type**: **Credit** or **Debit**.
4. For credits, set **Credit expires**: **Never** (the default), **After a number of days**, or **On a date** (a date and time in your store's time zone). It applies to every credited row, and an `ExpiryDays` or `ExpiresAt` column overrides it per row. The field is disabled for debits; expiry applies to credits only.
5. Choose your toggles:
   * **Notify Customers**, "Send notification email to customers": a credit import sends each customer the **Store Credit Credited** email, and a debit import sends **Store Credit Debited**. Each email goes out only if its template is enabled.
   * **Send to Integrations**, "Send event integrations": emits the credited/debited events to Klaviyo, Omnisend, Mailchimp, and Shopify Flow, exactly as an organic credit would.
   * **B2B Mode**, "Apply store credit to a company location. CSV must include a CompanyLocationId column." See [B2B store credit](/dollarback-store-credit/analytics-data-and-account/b2b-store-credit.md).
6. Optionally fill in **Reason** (up to 200 characters), for example "Spring migration" or "Delivery delay compensation". It is for your records only: customers don't see it. It is saved with the job and shown in the **Reason** column of **Bulk Import History**.
7. Click **Import CSV**.

<figure><img src="https://2844543096-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcVBfwy7Yj4tU8TsxkHEr%2Fuploads%2Fgit-blob-ff81b7ba24c21c43ce84de26ef72f3b73f1b988f%2Fdb-dash-plan-usage-quick-links-annotated.png?alt=media" alt="Two DollarBack home page cards. Plan and usage shows the current plan with a Manage link and the orders this period with a View link. Quick links shows Bulk import and Backfill past orders, each with an Open link."><figcaption><p>Bulk import has no item in the DollarBack menu. Open it from the Quick links card on the home page.</p></figcaption></figure>

<figure><img src="https://2844543096-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcVBfwy7Yj4tU8TsxkHEr%2Fuploads%2Fgit-blob-d35daa1ecfbbad0854d32f948be4a796db71408d%2Fdb-bulk-import-form-annotated.png?alt=media" alt="The Bulk Import page with the Upload CSV File card (Action Type, Credit expires, Notify Customers, Send to Integrations, B2B Mode, Reason, Download Sample CSV, Choose CSV File) and the CSV Format Requirements card."><figcaption><p>Set the action, expiry and options, then choose your CSV; the Import CSV button appears once a file is selected.</p></figcaption></figure>

{% hint style="warning" %}
Think before enabling **Notify Customers** on a large migration import: every row sends an email. For silent migrations, leave it off.
{% endhint %}

## How jobs run

A job moves through: **pending → processing → completed / failed / stopped**.

* **One import at a time.** While a job is pending or processing, the page shows **An import is in progress** and a new upload is refused with "An import is already in progress. Wait for it to finish." Upload the next file when the job finishes, or stop it from **Bulk Import History**.
* **Rows commit individually**, in small batches. There is no all-or-nothing transaction: a job that fails halfway has still applied everything it processed.
* **Stop Import** halts the job but **keeps all rows already processed**. Don't re-run the same file after a stop; the processed customers would be credited again.
* **There is no automatic per-row retry.** A failed row stays failed until you fix it and import a corrected file containing only those rows.
* **Unknown customers don't kill the job.** A row whose CustomerId and Email both match no customer is logged as "Customer not found: " followed by the row's email (or ID), and processing continues with the next row.

## Read the job log

Each job in the history keeps a downloadable log with one entry per processed row (rows dropped before the job started aren't listed):

<figure><img src="https://2844543096-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcVBfwy7Yj4tU8TsxkHEr%2Fuploads%2Fgit-blob-aa669f5ce9ea53ad14527a0a85457247c5fa4214%2Fdb-bulk-import-history-annotated.png?alt=media" alt="The Bulk Import History table with one completed credit import, its progress, success and error counts, start and finish times, and a Download Logs link."><figcaption><p>Every import is listed in the history; download its log to see which rows failed and why.</p></figcaption></figure>

| Log column     | Contents                                                                                                                  |
| -------------- | ------------------------------------------------------------------------------------------------------------------------- |
| Customer ID    | The row's resolved (or attempted) customer ID.                                                                            |
| Customer Email | The row's email.                                                                                                          |
| Action Type    | Credit or debit.                                                                                                          |
| Amount         | The row's amount.                                                                                                         |
| Currency       | The row's currency.                                                                                                       |
| Status         | Whether the row succeeded or failed.                                                                                      |
| Log            | What happened to the row: "Successfully credited …" (or debited), or the reason it failed (e.g. "Customer not found: …"). |
| Timestamp      | When the row was processed.                                                                                               |

## Verify it works

Run a tiny test file first: two or three rows including yourself. After the job completes, check the customers' balances, then confirm the rows also appear in **Analytics → Activity**, under the **Credits earned** view. Remember that imports count toward outstanding liability but are excluded from the Overview's **Cashback issued** card and all campaign figures; see [Understand your analytics](/dollarback-store-credit/analytics-data-and-account/understand-your-analytics.md).

## Common issues

* Rows failed with "Customer not found", the upload was rejected, or a job stopped early: see [My bulk import failed](/dollarback-store-credit/troubleshooting-and-faq/bulk-import-failed.md) for the full diagnosis checklist.
* A customer was credited twice: the file contained two rows for them, or the same file was imported twice; duplicates are not deduped.
* The page says bulk import isn't available: plan gate or development store; see the hint at the top.

## Related articles

* [My bulk import failed](/dollarback-store-credit/troubleshooting-and-faq/bulk-import-failed.md)
* [B2B store credit](/dollarback-store-credit/analytics-data-and-account/b2b-store-credit.md)
* [Migrating from another loyalty app](/dollarback-store-credit/getting-started/migrating-from-another-loyalty-app.md)
* [Export balances & reports](/dollarback-store-credit/analytics-data-and-account/export-balances-and-reports.md)
