Overview
Publish Owl lets you import keywords and data from CSV files. Every column in your CSV
automatically becomes a template variable you can use in prompts, titles, image prompts,
and meta descriptions using the {{column_name}} syntax.
Importing a CSV
In the keyword table of your workflow editor, click Import CSV and select your file. The first row is treated as column headers.
{`keyword,notes,slug,categories,product_name,affiliate_url
best headphones,Focus on wireless,best-wireless-headphones,Reviews,Sony WH-1000XM5,https://...
best laptops,For students,best-laptops-students,"Reviews, Guides",,`}
The keyword column maps to the keyword field. The notes column maps to
the notes field. All other columns become custom template variables.
Reserved Column Names
These column names have special behavior beyond being usable as template variables:
| Column | Behavior |
|---|---|
slug | Overrides the auto-generated URL slug when publishing. Non-ASCII characters (e.g. Cyrillic) are preserved. |
categories | Sets per-article WordPress categories. Accepts comma-separated names or numeric IDs. Missing categories are created automatically. |
featured_image | URL of a featured image to use for the article. |
reference_images | Comma-separated image URLs fed to AI image generators as visual references (for both featured and in-article images). |
featured_reference_images | Reference images for featured image generation only. |
in_article_reference_images | Reference images for in-article image generation only. |
group | Controls product roundup grouping. Rows with the same keyword and group value are merged into one job. |
Using Variables in Prompts
Reference any column value with double curly braces. Variables work in:
- Workflow step prompts
- Title templates/prompts
- Image generation prompts
- Meta description templates
- Webhook URLs
{`Write a review of {{product_name}}.
The article should target the keyword "{{keyword}}".
Include this affiliate link: {{affiliate_url}}
Additional context: {{notes}}`} Keyword Modifiers
Transform keyword values using modifier syntax. Useful for building URLs, extracting parts of multi-word keywords, or reformatting text.
| Modifier | Input | Output |
|---|---|---|
{{keyword}} | new homes for sale chicago | new homes for sale chicago |
{{keyword:slug}} | new homes for sale chicago | new-homes-for-sale-chicago |
{{keyword:first}} | new homes for sale chicago | new |
{{keyword:last}} | new homes for sale chicago | chicago |
{{keyword:word:2}} | new homes for sale chicago | homes |
{{keyword:words:2-4}} | new homes for sale chicago | homes for sale |
{{keyword:from:2}} | new homes for sale chicago | homes for sale chicago |
{{keyword:to:3}} | new homes for sale chicago | new homes for |
{{keyword:notlast:1}} | new homes for sale chicago | new homes for sale |
Modifiers work with any variable, not just keyword. For example, {{city:slug}} would
slugify a city column value.
Product Roundups
When multiple CSV rows share the same keyword, they are automatically grouped into a single job. All rows' column data is collected into a product list.
{`keyword,product_name,product_price,product_url
best headphones,Sony WH-1000XM5,$348,https://...
best headphones,AirPods Max,$549,https://...
best headphones,Bose QC Ultra,$429,https://...`} Access grouped data in your prompts:
{{products}}— A formatted text block listing all grouped products and their fields{{product_1_product_name}},{{product_2_product_price}}, etc. — Indexed access to individual product fields (1-based)
group column to control grouping explicitly. Rows with the
same keyword but different group values become separate articles.
Google Sheets (pSEO Mode)
In pSEO mode, you can connect a public Google Sheet as your data source instead of uploading a CSV. The sheet must be set to "Anyone with the link can view".
- Open your Google Sheet and click Share
- Set General access to "Anyone with the link" (Viewer)
- Copy the URL from your browser
- Paste into the Google Sheets field in the Data Source tab
- Click Load Sheet to preview, then Use This Sheet
If your data is on a specific tab, navigate to that tab before copying the URL. Column types (text, number, image URL, boolean) are auto-detected.