Bulk Operations¶
Bulk operations let you create and distribute large numbers of gift cards in one job — without issuing them one at a time.

Three types of bulk jobs¶
| Job type | What it does | Best for |
|---|---|---|
| Generate | Creates codes with a set balance, no recipient | Export to CSV, physical card programs, internal use |
| Send | Creates codes and emails each one to a recipient | Corporate gifting, loyalty rewards, promotions |
| Update | Adjusts the balance on a set of existing cards | Adding bonus credit, correcting balances |
Bulk Generate¶
Use this to create a batch of gift card codes that you'll distribute yourself (e.g., export and print, add to packaging, hand to a partner).

Settings¶
| Field | Description |
|---|---|
| Quantity | Number of cards to generate (up to 10,000 per job) |
| Amount per card | Fixed balance loaded on each card |
| Currency | Currency the cards are issued in. Only shown when your Shopify Markets enable more than one — see Cards in other currencies |
| Expiry | Optional expiry date |
| Gift card type | Which design/settings template to use |
| Gift cards images | Artwork the generated cards are shown with |
| Export format | CSV with code, balance, expiry, and status |
Generate without import¶
Use the Generate without import option for physical printed cards. This generates codes without activating them in Shopify — codes remain inactive until sold. Configure a prefix (up to 4 characters) and code length (8-16 characters).
After generation¶
When the job completes, you can download a CSV with all generated codes and their details. The codes are also live in Shopify as active gift cards (unless you used "Generate without import").
Bulk Send¶
Use this to send gift cards to a list of named recipients. Each person gets their own card and a personalized email.

Preparing your recipient list¶
Upload a CSV with the following columns:
| Column | Required | Description |
|---|---|---|
initial_value |
Yes | Amount the card is issued with |
currency_code |
Optional | Three-letter currency code, e.g. EUR. Leave empty for your store currency — see Cards in other currencies |
email |
Yes | Recipient's email address |
name |
Optional | Recipient name, used in email greeting |
message |
Optional | Per-recipient personal message |
expires_on |
Optional | Expiry date in YYYY-MM-DD format |
image |
Optional | https:// link to the artwork for this card — see Custom artwork per card |
Example CSV:
initial_value,currency_code,email,name,message,expires_on
50,,jane@example.com,Jane Smith,Thank you for your loyalty!,2027-03-15
100,EUR,bob@example.com,Bob Jones,Happy birthday Bob!,
Settings¶
- Default amount — used for rows that don't specify an amount
- Gift card type — design and settings template
- Sender name — shown in the email as "A gift from..."
- Default message — used when a row doesn't have a message column
- Schedule — send all at once or spread over time (e.g., 500/hour to avoid email throttling)
Sending throttle¶
For large lists (1,000+), GiftCard Hero spreads the sends over time to avoid hitting Shopify's email rate limits. You can set the rate in the advanced options.
Bulk Update¶
Adjust balances on a set of existing cards. Use cases:
- Add $10 bonus credit to all cards issued in a specific month
- Zero out cards that are past expiry
- Correct an incorrect balance after a system issue
Upload a CSV with the following columns:
| Column | Required | Description |
|---|---|---|
code |
Yes | The gift card code to update |
new_balance |
Optional | New balance value. Use + or - prefix for relative adjustments (e.g., +10.00 adds $10, -5.00 subtracts $5) |
disabled |
Optional | Set to TRUE to disable the card (irreversible) |
recipient_email |
Optional | Update the recipient email |
customer_email |
Optional | Update the customer email |
notify_customer |
Optional | Send notification to customer |
notify_recipient |
Optional | Send notification to recipient |
image |
Optional | https:// link to new artwork — re-skins a card that already exists |
currency_code |
Optional | A check, not a change: the row fails if the card is not in that currency. A card's currency can never be changed |
code,new_balance
ABCD-1234-EFGH-5678,75.00
IJKL-9012-MNOP-3456,+10.00
QRST-7890-UVWX-1234,-5.00
Note: Bulk Update sets the balance to the value you provide — it doesn't add or subtract — unless you use the
+or-prefix for relative adjustments. To add $10 to a card with $40, either setnew_balanceto50.00or use+10.00.
Bulk Import¶
Import existing gift cards from other systems into GiftCard Hero.
Upload a CSV with the following columns:
| Column | Required | Description |
|---|---|---|
initial_value |
Yes | Amount the card is issued with |
currency_code |
Optional | Three-letter currency code, e.g. EUR. Leave empty for your store currency — see Cards in other currencies |
code |
Optional | Gift card code (auto-generated if omitted) |
customer_id |
Optional | Shopify customer ID to associate |
expires_on |
Optional | Expiry date in YYYY-MM-DD format |
recipient_email |
Optional | Recipient's email address |
customer_email |
Optional | Customer's email address |
notify_customer |
Optional | Send notification to customer |
notify_recipient |
Optional | Send notification to recipient |
image |
Optional | https:// link to the artwork for this card — see Custom artwork per card |
Steps¶
- Navigate to the Import tab
- Prepare your CSV file with the columns above
- Upload the CSV file
- Click Start Import
Cards in other currencies¶
If your store sells in several currencies through Shopify Markets, a bulk job can issue cards in any of those currencies rather than only your store currency.
- Generate and Send — pick the currency next to the amount field. The picker only appears when your markets enable more than one currency.
- Import and Send from CSV — fill in the
currency_codecolumn, e.g.EUR. An empty column means your store currency. - Update — a card's currency cannot be changed. Filling in
currency_codeonly checks that the card is in that currency; a row that names a different one fails instead of adjusting the balance in the wrong money.
A row naming a currency your markets have not enabled fails on upload with an explanation, before any card is created.
What the card holds¶
The card is issued in the currency you chose and keeps its balance in it. Whether a shopper can then spend it in a different currency is controlled by Gift cards → Shopify Markets support → Cross-currency redemption:
| Setting | Behaviour |
|---|---|
| Shopify default | Shopify decides, based on your store and market settings |
| Only in the card's own currency | The card is refused at checkout in any other currency |
| Convert at your market's exchange rate | Uses the rate configured for the market |
| Convert at the spot exchange rate | Uses the standard spot rate at checkout |
Analytics¶
Dashboard totals are in your store currency. Cards in other currencies are listed separately above the tiles, with their own count and totals per currency — amounts in different currencies cannot be added together into a single figure.
Custom artwork per card¶
Generate, Send, Update and Import jobs can all give each card its own picture through the image column.
- In your Shopify admin, open Content → Files and upload your artwork.
- Hover the file and click the link icon to copy its URL.
- Paste the URL into the
imagecolumn of the row.
The copied link looks like this:
https://cdn.shopify.com/s/files/1/0594/1241/4670/files/gift-card-birthday.png?v=1671206648
- The value must be a full URL starting with
https://—http://, protocol-relative (//cdn.shopify.com/...) and bare file names are rejected, and the row fails with an error on the Results tab. - Keep the
?v=...suffix; it is part of the link Shopify gives you. - A per-row
imageoverrides the design selected on the page, so one file can mix several designs. - Use roughly 1000 × 600 px (5:3) PNG/JPG/WebP images under 2 MB.
- Generate jobs have no CSV — pick the design under Gift cards images on the Generate tab instead.
For the step-by-step version, see Managing Gift Cards with Bulk Actions.
Tracking results¶
After starting any bulk job, you can monitor progress in Bulk → Results.
The results page shows:
- Job status (queued, running, completed, failed)
- Progress (e.g., 847 / 1000 sent)
- Per-row errors (e.g., invalid email, duplicate code)
- Download links for the results CSV
Results CSV¶
The results CSV includes all input columns plus:
status— success / failed / skippederror— error message if failedhelpscout_url— public URL of the gift card (for Generate jobs)code_last4— last 4 digits of the gift card code
Limits and performance¶
| Limit | Value |
|---|---|
| Max cards per Generate job | 10,000 |
| Max rows per Send job | 10,000 |
| Max rows per Update job | 50,000 |
| Estimated speed (Generate) | ~500 cards/minute |
| Estimated speed (Send) | ~200 emails/minute |
Large jobs run in the background — you don't need to keep the browser open. You'll receive a summary email when the job completes.