This website uses cookies

We use cookies to enable purchasing apps from our website, interacting with the help desk widget, analyzing the web traffic and commenting in blog posts. Our analytics partners gather anonymous information about how you use our site (ex: how many visitors we get a day, which pages are the most popular, etc) and may combine it with other information that you’ve provided to them or that they’ve collected from your use of their services. We do not use the collected information to create user profiles.

You consent to our cookies if you continue to use our website.

QR Factory 3

How to create multiple QR codes using a CSV file

QR Factory 3 is a complete solution for generating QR codes, either individually or in batches. It is available for both macOS and iPadOS on the respective App Stores.

There's no cost to download it and has a 1 week trial to try everything out for free. All codes are generated on-device and belong to the user with no re-directing to ads or interference. To learn more about the handy features and professional options, see the homepage for QR Factory 3.

One of the most powerful features is that it can generate an unlimited number of QR codes in one batch. This can be three codes, ten codes, one hundred codes, or even 10,000 codes. All at once, with optional verification and/or saving to templates for printing to Avery or DYMO labels.

The following sections explain in detail how to setup and create a CSV file that QR Factory 3 uses to generate multiple codes in one batch.

Note: The documentation for the older QR Factory 2.x is also available here.

Stacks Image 58497
Stacks Image 58490
Download on the App Store

Getting Ready

Before beginning to setup for generating multiple codes, there are two things that need to be done. The first is to make sure you have QR Factory 3 and it's open. The second is to ensure you have an app that's capable of editing spreadsheets - this is usually Numbers, or Microsoft Excel.

The reason that a spreadsheet app is used is that it makes it easy to format the data and then export it to a Comma Separated Values (CSV) file, which is the format QR Factory 3 reads to generate the multiple codes. The data is formatted in a grid system, with columns and rows. The columns are used for setting the options and information that will go into a QR code, and each row has all the necessary information for exactly one QR code.

The instructions in the following sections will apply to both macOS or iPadOS, so it doesn't matter which one is being used.

There are two choices for this tutorial, either start from a blank spreadsheet, or download the sample files and use them instead.


Option A: Create New Spreadsheet

To start, we're going to create a blank spreadsheet, so go ahead and open either Numbers or Excel.

For Excel: Use the File menu and choose "New".
For Numbers: Use the File menu and choose "New…", then "Blank".

It will look something like this (the screenshots are from Excel, but it will be similar for Numbers):

Stacks Image 55507


Add Data

Now that the spreadsheet is created and ready to fill in, it's time to add some data. There are two ways to add the data that QR Factory understands.

The first is to use columns, which is the easiest as well.

The second way is to use key-value pairs where all the content for a QR code goes into a special column labelled Content.

Note: Regardless of which method is used, the final CSV file must contain the Type column so QR Factory can properly determine which type of QR code to create for each row.


Using Columns

Now that we have an empty spreadsheet, let's go ahead and add a few columns that tell QR Factory what type of QR codes to create, what will be in them and what to name the generated files.

In this example, we will be adding in the necessary columns to create SMS (test message, URL and Text QR codes.

Each column needs to have its name in the first row (so row #1) so when QR Factory reads the file, it knows what the data is for. For a full list of all the possible columns to use, click here.

Add the following columns (the capitalization doesn't matter):

Type (what type of code the row will be)
Content (for code types that only text)
Number (specific for SMS codes)
Message (specific for SMS codes)
Filename (the name of the file that will be created)
FileType (which format to use, ex: PNG)

It will look like this once those have been added:

Stacks Image 55518

Next, we'll add a few rows of data, with each row representing all the data for one QR code. For the URL and Text types, the data goes into the Content column since it doesn't have any other optional parameters. For the SMS type, the data goes into the Number and Message columns.

Stacks Image 55524


Using Key-Value Pairs

As an alternative way to add the data to the spreadsheet, instead of using a column for each parameter, it's possible to use key-value pairs, such as "subject=Please sign documents". All the pairs are combined and separated by a semicolon. Here's an example of how an Email code content column/row could look like:;subject=Hello;body=Type your email here;;

Note: If this format is used, then a semicolon cannot be used in the actual data or the parsing will fail.



Here are a few tips to help make it easier to setup and fill in the appropriate data.

Use a comma: If a comma is needed in the data, for example, say a company name like Tunabelly Software, Inc. then Excel or Numbers should wrap that row/column cell in quotes when the spreadsheet is exported to a CSV file. However if it doesn't, just add a quote at the beginning of the text in the cell and one at the end. For example, it would change

Tunabelly Software Inc. —> "Tunabelly Software Inc."

Use a quote: If a quote is needed in the data, again Excel or Numbers should escape the quotes, which changes each quote that's needed into a double quote, and also wrap the cell in quotes. For example, it would change

This is the "text" for a QR code —> "This is the ""text"" for a QR code"

  • QR codes can be saved in RGB, CMYK or Grayscale color spaces using the ColorSpace column. Please note the only format that supports all three color spaces is TIFF, which is only available on macOS.
  • Color values can be specified in one of three ways:
    • Hex (web): In the format #RRGGBB
    • RGB: In the format "rgb(R,G,B)", with the quotes since there are commas between the values. The RGB values should be between 0-255.
    • CMYK: In the format "cmyk(C,M,Y,K), and also with the quotes. The CMYK value should be between 0-100.


Export to CSV

The last step in getting the data organized is to export the spreadsheet to a CSV file. This type of file is plain text with each column and row separated by a comma. Here's how, depending on which app is being used:

Numbers: From the File menu, choose "Export To", then "CSV…".
Excel: From the File menu, choose "Save As", then set the format to "CSV UTF-8 (Comma delimited) (.csv)".

The resulting file should have a ".csv" extension and look similar to the following. It can also be clicked to download the CSV file to try out if needed.

Stacks Image 55534


Option B: Use Sample Files

We have a full assortment of sample files to use, which include already exported CSV files for all QR code types, using both columns or key-value pairs. It also includes an example with all the appearance related options such as colors, using text at the bottom, adding a logo, modifying the safe zone and more.

Download Sample Files


Generate Mulitple Codes

Now that the CSV file is finished, the fun part is to use it with QR Factory to generate the QR codes in one batch. The steps are the same for both platforms, although we'll be using macOS for most of the screenshots.

The first thing is to switch over to the Multiple Codes section in the app. Here's how:


Stacks Image 55553
Stacks Image 55562


Stacks Image 55557
Stacks Image 55564

The next steps are to choose which CSV file will be used and where the generated QR codes will be stored.

  1. Choose the CSV file to use. In this example, we'll use the one created in the previous section. Note that it will only allow selecting a file that has the ".csv" extension.
  2. Choose where the QR codes will be saved. This can be any folder. For this example, we'll choose a folder on the Desktop.
  3. If any of the QR codes will have a logo in the middle, choose the folder where the logo images are stored. In this example, we're not using this feature.
Verify codes: Enable this to have a document generated showing the readability of each QR code.
Combine codes for printing to labels: Enable this to have all the QR codes arranged in specific patterns for printing them to Avery or DYMO labels.

It should now look like this, and the Start button will be enabled:

Stacks Image 55570

Click/tap the Start button and it will being generating the QR codes in one batch. Since this example only has three, it will be done almost as soon as it was started.

Once it's finished, check out the folder that was chosen in Step 2 and there will be three new files, just like this:

Stacks Image 55574


Optional: Verify Codes

One feature that has been requested is to have each generated code tested to ensure they can be scanned properly (ex: a middle logo isn't obscuring too much of the code, the foreground and background colors aren't too similar, etc) with the summary in a PDF file. If this feature is needed, just turn on the checkbox/slider labeled Verify codes and generate results file.

Once the generation is finished, there will be a file in the same folder as the QR codes labelled Verification Result.pdf. Here's an example of what one looks like:

Stacks Image 55584


Optional: Print to Avery or DYMO labels

One other optional feature to enable is to have the QR codes laid out in a specific pattern so they can be printed directly onto Avery or DYMO labels. To enable this, turn on the checkbox/slider labelled Combine codes into PDF file for printing labels. Once this is enabled, new options will appear to the right to choose which model of labels will be used. Choose the correct options for label type and then generate the codes using the Start button.

Stacks Image 55596

Once it's finished, instead of having a file for each QR code generated, there will be a PDF containing the codes, in the exact same layout that's needed for printing to the labels. Here's an example of how it would look like:

Stacks Image 55602


All Columns

The following details every single column that can be used to modify the appearance of a QR code, how it's stored, what type it is and what's contained inside it.

All of the columns can be used as key-value pairs instead, with the exception of Type and Content - those must be actual columns.

Stacks Image 59107
Any options that aren't used will default to being off. For example, if the UseCompanyIcon option for Social codes isn't in the CSV file or it's blank for a row, then it will default to No.


For columns that contain a color, there are multiple formats that define which color to use:

  • Web (also known as hex) written as #RRGGBB where RR, GG and BB are the hex values for each colour channel. Ex: #FF0000 is pure red.
  • RGB, written as rgb(R,G,B), where R, G and B are between 0-255. Example: rgb(0, 0, 255) is pure blue.
  • CMYK, written as cmyk(C,Y,M,K) where C, Y, M and K are between 0-100. Example: cmyk(91, 11, 75, 19) is a shade of green.



There is only one column that is required, and that's the Type, which must be present so QR Factory knows which type of QR code to create for each row.

Column Name Value
Type Calendar, Crypto, Email, Location, Person, Phone, SMS, SEPA, Social, Text, URL or WiFi



These columns are common to all QR code types and are used for changing the appearance or how the file is stored. They are all optional, with default values being used if they aren't used.

Column Name Value
OutputSize Any value between 64 and 4096. Note that the size will always be a square (the output size is the same for both width and height).
FileName The name of the file. The file extension will automatically be added if it's not part of the name.
FileType PNG or PDF can be used on both platforms, however TIFF and EPS are only available on macOS.
ColorSpace RGB, CMYK or Grayscale. Please note that the only format that supports all three color spaces is TIFF.
RotationAngle 0, 90, 180 or 270
ReliabilityLevel The amount of deterioration to the code that can occur where it is still readable. Another way to think about it is how much of the code can be covered and it still be readable. This is important in the case where there is a logo in the middle which obscures part of the code.

Low, Medium, High or Highest.
UseAutoReliabilityLevel Yes or No
PixelRoundness From 0.0 (square) to 1.0 (fully rounded)
PixelColorType Solid, LinearGradient or RadialGradient
BackgroundColorType Solid or Transparent
BackgroundColor Depending on what was set for BackgroundColorType:

"Transparent" - this parameter is ignored.
"Solid" - the color to use for the background.

It must be one of the formats specified in Colors.
PixelColorStart Depending on what was set for PixelColorType:

"Solid" - the pixel color.
"LinearGradient" or "RadialGradient" - the start color of the gradient.

It must be one of the formats specified in Colors.
PixelColorEnd Depending on what was set for PixelColorType:

"Solid" - this is ignored.
"LinearGradient" or "RadialGradient" - the end color of the gradient.

It must be one of the formats specified in Colors.
GradientAngle Any value between 0 and 359


Center Icon

Parameters for how the center icon should look along with an optional border.

Column Name Value
IconPath The full path to the icon file to overlay in the middle of the code. It must reside inside the icons folder that was chosen in Step 3, otherwise QR Factory will not be able to access it.

For example: /Users/macuser/Desktop/Logo.png

Pro Tip: To quickly copy the full path to a file, right click on it in the Finder, hold down the Option key and choose "Copy … as Pathname".
IconSizePercent The percentage (1-100) that the middle icon should be scaled to. The icon will always retain its original aspect ratio. Note that the icon cannot be scaled to larger than its original size.
IconBorderPercent The percentage (1-100) of the icon's size to use for drawing a border around the middle icon. It will be the same color as the background.
IconBorderType The type of border to use around the icon.

Automatic to have QR Factory generate the border based on the shape of the icon.

Manual to use a square with optional rounded corners.
IconBorderManualCornerSize The size to use for the rounded corners when IconBorderType is set to "Manual".

The value must be between 0-50, where 0 is no rounded corners and 50 is full rounded, where the border is a circle.
IconBorderColor The color to use for the border around the icon.

It must be one of the formats specified in Colors.
IconLockToSquares Yes - will make the center icon aligned with the QR code squares so they overlap perfectly with no gaps.
No - will use the exact size from IconSizePercent


Bottom Text

Parameters for how the text below the QR code should appear.

Column Name Value
BottomText The text to place below the QR code.
BottomTextSize Any value between 1 and 100. With 1 being the smallest possible and 100 being the largest.
BottomTextColor The color to use for the text below the QR code.

It must be one of the formats specified in Colors.
BottomTextFont The font to use for the text below the QR code. It must be spelled exactly as it appears in either the popup menu in QR Factory, or using the Font Book application on macOS.

Some examples: Times New Roman, Keep Calm, Roboto, SF Pro, Verdana

If not specified, the default font will be Helvetica.
BottomTextFontStyle The style to use for the chosen font. It must be spelled exactly as it appears in either the popup menu in QR Factory, or using the Font Book application on macOS.

For example, if Avenir Next is the chosen font, it could be one of: Ultra Light, Ultra Light Italic, Regular, Italic, Medium, Medium Italic, Demi Bold, Demi Bold Italic, Bold, Bold Italic, Heavy, Heavy Italic

For another example, if Damascus is the chosen font, it could be one of: Light, Regular, Medium, Semi Bold, Bold

If not specified, the default font style will be Regular.


Safe Zone

Parameters for how the optional safe zone around the QR code should appear.

Column Name Value
SafeZonePercent The percentage (0-100) to use for the safe zone around the QR code. The maximum size of 100% would draw the safe zone 1/4 the size of the QR code around all sides (ie: the division from left to right would be 1/4 safe zone, 1/2 QR code, 1/4 safe zone).
SafeZoneColor The color to use for the safe zone.

It must be one of the formats specified in Colors.


QR Code Type

The following sections describe the available columns for each QR code type. The type used is specified in the required column labeled Type.



Column Name Value
Type Text
Content The text that will be used in the QR code, up to 2048 characters.



Column Name Value
Type URL
Content The URL that should be opened when the QR code is scanned. It needs to include the full URL with scheme (ex: https://, http://, etc).



Column Name Value
Type Email
Email The recipient's email address.
Subject The subject of the email.
Body The body of the email.
CC Email address to CC (carbon copy).
BCC Email address to BCC (blind carbon copy)



Column Name Value
Type Location
Latitude GPS latitude as a decimal number.
Longitude GPS longitude as a decimal number.



Column Name Value
Type Phone
Number Phone number to dial. Make sure to include the area code and country code as well if necessary.


SMS (Text Message)

Column Name Value
Type SMS
Number Phone number to message. Make sure to include the area code and country code as well if necessary.
Message The text message to send.



Column Name Value
Type Calendar
Title The name of the event.
Location The location of the event. This is only text and is not GPS coordinates.
Description The description (may be interpreted as a note in some scanners) of the event.
TimeZone Time zone of the event. Ex: "America/Vancouver".
StartDate Start time of the event in format YYYY-MM-DDThh:mm
EndDate End time of the event in format YYYY-MM-DDThh:mm
AlarmType None - No alarm
AtStart - Alarm will be set at the same time as the event
Minutes - Number of minutes before the event for the alarm
- Number of hours before the event for the alarm

Note: Not all phones will be able to set the alarm properly when scanning a calendar QR code. The built-in scanner for iOS works well, but some Android scanners may ignore it.
AlarmValue Only used if AlarmType is set to either Minutes or Hours.
AlarmDescription The description to use for the alarm.



Column Name Value
Type WiFi
AuthenticationType None, WEP, WPA, WPA2 or WPA3
SSID Name of the WiFi network.
Password Password to log in to the WiFi network.
isNetworkHidden Yes or No



Column Name Value
SEPAVersion V1 or V2
IBAN IBAN (International Bank Account Number) of the beneficiary. Maximum of 34 characters.
BIC BIC (Business Identifier Code) of the beneficiary bank. Maximum of 11 characters.
SEPAName Name of the beneficiary. Maximum of 70 characters.
AmountInEuros Amount in Euros. EUR is an optional prefix that will automatically get filled in if missing. Ex: "EUR10.5". Maximum of 12 characters.
PurposeCode Purpose of the transfer. Maximum of 4 characters.
RemittanceType Reference or Text
RemittanceReference Reference for the transaction. Maximum of 35 characters.
RemittanceText Remittance information. Maximum of 140 characters.
BeneficiaryInfo Extra info for the beneficiary. Maximum of 70 characters.


Person (vCard)

Column Name Value
Type Person
FirstName First name
LastName Last name
NameTitle Person's title (ex: Mr, Mrs, etc)
Nickname Nickname
Company Company name
JobTitle Job title (ex: Software Developer, CEO, etc).
JobDepartment Job department (ex: Engineering, Warehouse, etc).
Note Any notes about the person.
Phone Numbers
Column Name Value
PhoneHome Home phone number
PhoneWork Work phone number
PhoneMobile Mobile (cell) phone number
PhoneHomeFax Home fax phone number
PhoneWorkFax Work fax phone number
Column Name Value
EmailHome Personal email address
EmailWork Work email address
Postal Addresses
Column Name Value
StreetHome Home street name and number
CityHome Home city
ProvinceStateHome Home province/state
CountryHome Home country
PostalZipCodeHome Home postal/zip code
StreetWork Work street name and number
CityWork Work city
ProvinceStateWork Work province/state
CountryWork Work country
PostalZipCodeWork Work postal/zip code
Social Profiles

Social profiles are a bit different because QR Factory doesn't know which services will be used, so there aren't any hardcoded column names. To add a social profile, use a column that starts with "SocialProfile" then add the service name. For example, to add a Twitter profile, the column name would be "SocialProfileTwitter", or for YouTube, it would be "SocialProfileYouTube".

For the value, the format is the full URL to the social profile, a vertical divider, then the username.

For example, the Tunabelly Software Twitter username is tunabelly, and the full URL to the account is, so the value would be|tunabelly

For another example, the Tunabelly Software YouTube username is @tunabellysoftware5670 and the full URL to the account is, so the value would be|@tunabellysoftware5670

Column Name Value

SERVICE_NAME = The service name to use. For example: Twitter, FaceBook, YouTube, Vimeo, etc.
FULL_URL = The full URL to the social profile. For example:
USERNAME = Just the username. For example: tunabelly


Social Media

Creating a social media QR code is a bit different since the data is dynamic and QR Factory doesn't have a hard coded list of what it could be. It used to be that this type required the use of key-value pairs, although starting with version 3.3.0, it's possible to use the normal columns as well.

Using key-value pairs

It requires a Type column with the value set to Social, plus a Content column, and any other optional ones that are needed. For example:

Type Content
Social name=FacebookMessenger;username=tunabellysoftware

The easiest way to figure out the format is to use the template for the social media platform needed from the list below. Just copy it and fill in the placeholders with the proper values.

The placeholders will have square brackets around them, for example, [USERNAME] and should be completely replaced with the actual username. Here's how one example would look:

name=Twitter;username=[USERNAME] —> name=Twitter;username=tunabelly

Using columns

It requires a Type column with the value set to Social, a Name column set to the social media platform used, plus a column for each value that is required. For example:

Type Name Username AppID
Social Twitter tunabelly
Social Facebook tunabellysoftware
Social AppStore 1609285899

Just like for using key/value pairs, look up the Social media platform below and make a column for each value.

The placeholders will have square brackets around them, for example, [USERNAME] and should be completely replaced with the actual username. Here's how one example would look:


• Create Name column with the value Twitter
• Create Username column with the actual value of the username

Social Media platform Content column value
Twitter name=Twitter;username=[USERNAME]
Facebook name=Facebook;username=[USERNAME]
Facebook Messenger name=FacebookMessenger;username=[USERNAME]
Instagram name=Instragram;username=[USERNAME]
Snapchat name=Snapchat;username=[USERNAME]
Snapchat (Business) name=SnapchatBusiness;username=[USERNAME]
TikTok name=TikTok;username=[USERNAME]
TikTok (Music) name=TikTokMusic;username=[USERNAME]
TikTok (Video) name=TikTokVideo;username=[USERNAME];videoid=[VIDEO ID]
Pinterest name=Pinterest;username=[USERNAME]
LinkedIn name=LinkedIn;username=[USERNAME]
LinkedIn (Company) name=LinkedInCompany;companyname=[COMPANY NAME]
LinkedIn (Job Post ID) name=LinkedInJobPostID;jobid=[JOB ID]
LinkedIn (Message Thread ID) name=LinkedInMessageThreadID;messageid=[MESSAGE ID]
Telegram name=Telegram;username=[USERNAME]
Telegram (Join Chat) name=Telegram;chatid=[CHAT ID]
PayPal name=PayPal;username=[USERNAME]
Venmo name=Venmo;username=[USERNAME]
App Store name=AppStore;appid=[APP STORE APPLICATION ID]
Google Play name=GooglePlay;appPackageID=[GOOGLE PLAY PACKAGE ID]
WhatsApp name=WhatsApp;phonenumber=[PHONE NUMBER]
WhatsApp (With Message) name=WhatsAppWithMessage;phonenumber=[PHONE NUMBER];message=[MESSAGE]
Cash App name=CashApp;username=[USERNAME]
X name=X;username=[USERNAME]
Threads name=Threads;username=[USERNAME]
Mastodon name=Mastodon;username=[USERNAME];server=[SERVER ADDRESS]



Create a crypto QR code is the same as making a Social Media one, with the same requirement to put all the data into the Content column using key-value pairs.

It requires a Type column with the value set to Social, plus a Content column, and any other optional ones that are needed.

Here is an example for a Crypto QR code:

Type Content
Crypto name=Bitcoin;WalletAddress=43718943268743212908

The easiest way to figure out the format is to use the template for the crypto type needed from the list below. Just copy it and fill in the placeholders with the proper values.

The placeholders will have square brackets around them, for example, [WALLET ADDRESS] and should be completely replaced with the actual wallet address. Here's how one example would look:

name=Bitcoin;WalletAddress=[WALLET ADDRESS]—> name=Bitcoin;WalletAddress=43718943268743212908

Social Media platform Content column value
Bitcoin name=Bitcoin;WalletAddress=[WALLET ADDRESS]
BitcoinWithAmount name=Bitcoin;WalletAddress=[WALLET ADDRESS];Amount=[AMOUNT IN DECIMAL]
Ethereum name=Ethereum;WalletAddress=[WALLET ADDRESS]
EthereumWithAmount name=EthereumWithAmount;WalletAddress=[WALLET ADDRESS];Amount=[AMOUNT IN DECIMAL]
EthereumWithAmountAndGas name=EthereumWithAmount;WalletAddress=[WALLET ADDRESS];SenderAddress=[SENDER WALLET ADDRESS];Amount=[AMOUNT IN DECIMAL];SuggestedGas=[SUGGESTED GAS IN DECIMAL]
Dogecoin name=Dogecoin;WalletAddress=[WALLET ADDRESS]
DogecoinWithAmount name=Dogecoin;WalletAddress=[WALLET ADDRESS];Amount=[AMOUNT IN DECIMAL]


Merchant of Record