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.
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.
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):
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.
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:
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.
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:
email=support@tunabelly.com;subject=Hello;body=Type your email here;cc=example@example.org;bcc=hidden@example.org
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"
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.
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
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:
The next steps are to choose which CSV file will be used and where the generated QR codes will be stored.
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:
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:
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.
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:
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.
For columns that contain a color, there are multiple formats that define which color to use:
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 |
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 |
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. |
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. |
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 Hours - 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 | SEPA |
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. |
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). |
URL | Any URL |
Note | Any notes about the person. |
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 |
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 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 https://twitter.com/tunabelly, so the value would be https://twitter.com/tunabelly|tunabelly
For another example, the Tunabelly Software YouTube username is @tunabellysoftware5670 and the full URL to the account is https://www.youtube.com/@tunabellysoftware5670, so the value would be https://www.youtube.com/@tunabellysoftware5670|@tunabellysoftware5670
Column Name | Value |
---|---|
SocialProfileSERVICE_NAME | FULL_URL|USERNAME |
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: https://twitter.com/tunabelly
USERNAME = Just the username. For example: tunabelly
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.
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
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 | tunabelly | ||
Social | 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:
name=Twitter;username=[USERNAME]
• Create Name column with the value Twitter
• Create Username column with the actual value of the username
Social Media platform | Content column value |
---|---|
name=Twitter;username=[USERNAME] | |
name=Facebook;username=[USERNAME] | |
Facebook Messenger | name=FacebookMessenger;username=[USERNAME] |
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] |
name=Pinterest;username=[USERNAME] | |
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] |
name=WhatsApp;phonenumber=[PHONE NUMBER] | |
WhatsApp (With Message) | name=WhatsAppWithMessage;phonenumber=[PHONE NUMBER];message=[MESSAGE] |
Cash App | name=CashApp;username=[USERNAME] |
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] |
QR Factory