> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://fyno.io/docs/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://fyno.io/docs/_mcp/server.

# How to Create and Fire a Campaign with a File Upload

> Learn how to create, configure, test, fire, and monitor a campaign in Fyno by uploading a CSV or XLSX file of recipients.

Campaigns let you send notifications to a group of users without any technical effort. In this tutorial, you will:

1. Create a campaign and upload a file of recipients.
2. Map destinations and placeholders, and configure optional settings.
3. Test the campaign.
4. Fire the campaign now or schedule it for later.
5. Monitor the campaign with logs and analytics.

The example in this tutorial sends a festive offer over WhatsApp and Email, but the same steps apply to any channel.

Watch the full walkthrough, or follow the steps below.

## Prerequisites

Before you create a campaign, make sure you have:

* An **integration** with a provider for each channel you want to use.
* A **live template** for the notification you want to send.
* A **live notification event** that uses that template. The campaign can use only the channels configured in that event. To learn more, see [Notification Events](https://fyno.io/docs/events-overview), or [Creating a Notification Event](https://fyno.io/docs/notification-event-creation) if you don't have one yet.
* A **CSV or XLSX file** with the recipients' destinations (for example, phone numbers or email addresses) and a value for each placeholder in the template.

## Create a Campaign

From the left navigation, click **Campaigns** to open the Campaigns page.

Click **+ New Campaign** in the top-right corner.

![New Campaign](/docs/_fern-img/9355795204b96476950ee803a99f975818532cc3909e8cbc97173cba44aa7d2a.webp)

**Campaign Name** — Enter a name for the campaign.

**Select a live notification event** — Choose the notification event to send. Only live events appear in the list. For more details, see [Notification Events](https://fyno.io/docs/events-overview).

Once you select an event, the **This campaign can be sent via** section shows the channels the campaign will use.

**Create a campaign using** — Select **File Upload**.

This is how you provide the recipient data. Campaigns can also be created from a Google Sheet, a public URL, or a cohort. This tutorial covers file uploads.

If you need a template for your file, click **Download Sample File**. The sample has the correct headers for the channels and placeholders in your event.

![Campaign Detail](/docs/_fern-img/d9549f1f19fb7c1b2547596e0bca4567d313e5405ab75e8447ad735a92701b92.webp)

Review the file requirements:

<table>
  <thead>
    <tr><th>Requirement</th><th>Details</th></tr>
  </thead>

  <tbody>
    <tr>
      <td>File type</td>

      <td>`.csv` or `.xlsx` only.</td>
    </tr>

    <tr>
      <td>File size</td>

      <td>Up to 200 MB.</td>
    </tr>

    <tr>
      <td>Placeholder names</td>

      <td>Case sensitive. They must match the placeholders in the template.</td>
    </tr>

    <tr>
      <td>Links</td>

      <td>Must not be shortened.</td>
    </tr>
  </tbody>
</table>

The tabs below the requirements show the expected columns for each channel in the event.

Drag and drop your file into the upload area, or click **Upload File**.

Fyno validates the file and shows a summary:

<table>
  <thead>
    <tr><th>Metric</th><th>What it means</th></tr>
  </thead>

  <tbody>
    <tr>
      <td>Records processed</td>

      <td>Total rows read from the file.</td>
    </tr>

    <tr>
      <td>Records can be imported</td>

      <td>Rows that passed validation.</td>
    </tr>

    <tr>
      <td>Invalid records</td>

      <td>Rows that failed validation and will not be sent.</td>
    </tr>

    <tr>
      <td>Duplicate records</td>

      <td>Rows that repeat another row.</td>
    </tr>
  </tbody>
</table>

Duplicates are excluded by default. Select **Include duplicates in campaign** if you want to send to them too.

Click **Submit**. The campaign is created and opens on its configuration page.

## Configure the Campaign

The configuration page shows the selected notification event, the template it uses, and the uploaded file with the number of unique records and duplicates. Click the download icon next to the file to download it again.

![Configure the Campaign](/docs/_fern-img/8b1d2ac5a11e8f8c49acd2bf97a56cfdfb4da2e21e1900243f2d4046e924d509.webp)

Under **Map Data**, map the columns in your file to the fields the campaign needs.

**Destinations** — Select the file column that holds the destination for each channel. For example, map SMS to the `sms` column and Email to the `email` column.

The number next to **Destinations** shows how many channels the notification event uses. Each channel gets its own row.

![Destinations mapped to sms, rcs, whatsapp, and email columns](/docs/_fern-img/22df300f906d57c8439985e7ab8b3455d575811b992d40a78070b6e858a3ba86.webp)

**Placeholders** — Select the file column that holds the value for each template placeholder. Every placeholder must be mapped. Click **Add Placeholder** to map an additional placeholder.

The number next to **Placeholders** shows how many placeholders the template uses. In this example, the template has two placeholders, `brand` and `name`, mapped to file columns with the same names.

![Placeholders brand and name mapped to file columns](/docs/_fern-img/50f81882e7f7ffde64428ebcf326f92338c31fdd7d81538957872fd2e43251f5.webp)

**Custom Parameters** (optional) — Expand **Custom Parameters** to map a custom ID and up to three custom values from your file, based on your requirements.

<table>
  <thead>
    <tr><th>Field</th><th>Maximum length</th><th>Characters not allowed</th></tr>
  </thead>

  <tbody>
    <tr>
      <td>Custom ID</td>

      <td>200 characters</td>

      <td>`<` `>` `/` `"` `'` `&`</td>
    </tr>

    <tr>
      <td>Custom Value 1</td>

      <td>50 characters</td>

      <td>`<` `>` `/` `"` `'` `&`</td>
    </tr>

    <tr>
      <td>Custom Value 2</td>

      <td>50 characters</td>

      <td>`<` `>` `/` `"` `'` `&`</td>
    </tr>

    <tr>
      <td>Custom Value 3</td>

      <td>50 characters</td>

      <td>`<` `>` `/` `"` `'` `&`</td>
    </tr>
  </tbody>
</table>

**Send data to my allowlisted endpoint(s)** (optional) — To receive this campaign's data at an allowlisted endpoint, select this option and choose the endpoint to use.

**Throttle** (recommended) — Throttling improves deliverability by controlling the rate at which notifications are sent. Click **Add**. Fyno shows the number of records available to send, then choose how to control the rate:

<table>
  <thead>
    <tr><th>Option</th><th>How it works</th></tr>
  </thead>

  <tbody>
    <tr>
      <td>Time</td>

      <td>In **Run this campaign for**, enter how long the campaign should run, between 15 and 180 minutes. Fyno shows approximately how many records will be processed per minute. For example, 71,966 records over 152 minutes is about 474 records per minute.</td>
    </tr>

    <tr>
      <td>Batch</td>

      <td>Control the rate by sending notifications in batches.</td>
    </tr>
  </tbody>
</table>

The actual run time may vary depending on the number of records in the file and the throttle limit set in your provider account. To turn throttling off, click **Remove**.

![Throttle set to run the campaign for 152 minutes](/docs/_fern-img/4e4378678ec373e4fa400821242574b0e738eddb00f9055e90408eb89b23e954.webp)

### Preview the Campaign

Once everything is configured, use the preview panel on the right to review the campaign before you fire it. The preview uses data from your file. It shows the template in use and the current record's destination.

* Click a channel icon to switch between channel previews.
* Use the **‹** and **›** arrows to step through sample records from the file.

## Test the Campaign

Run a test before firing the campaign to make sure everything is configured correctly.

At the top of the configuration page, click **Run Test**.

In the **Test Live Notification Event** popup, enter:

<table>
  <thead>
    <tr><th>Field</th><th>What to enter</th></tr>
  </thead>

  <tbody>
    <tr>
      <td>Destinations</td>

      <td>A test destination for each channel you want to test. Leave a channel blank to skip it.</td>
    </tr>

    <tr>
      <td>Placeholders</td>

      <td>Sample values used to fill the dynamic content in your template.</td>
    </tr>
  </tbody>
</table>

Click **Test Event** to send the test notification.

## Save as Draft

Click **Save** at any point to save your configuration. Saved campaigns appear on the Campaigns page with the **Draft** status, and you can edit them before firing.

## Fire or Schedule the Campaign

Click **Schedule / Fire**.

In the **Schedule Campaign** popup, choose when to send:

<table>
  <thead>
    <tr><th>Option</th><th>What it does</th></tr>
  </thead>

  <tbody>
    <tr>
      <td>Now</td>

      <td>Fires the campaign immediately.</td>
    </tr>

    <tr>
      <td>Later</td>

      <td>Schedules the campaign for a date and time within the next 30 days.</td>
    </tr>
  </tbody>
</table>

Click **Fire**, then click **Confirm** in the **Fire Confirmation** popup.

## Stop or Re-run a Campaign

After a campaign is fired, the configuration page shows two new buttons:

| Button            | What it does                                                                         |
| ----------------- | ------------------------------------------------------------------------------------ |
| **Stop Campaign** | Stops a running campaign. Available only for campaigns with more than 1,000 records. |
| **Re-run**        | Sends the campaign again.                                                            |

## View Logs and Analytics

Once a campaign has completed, open it to find the **Logs** and **View Analytics** buttons at the top of the page.

### Sent Logs

Click **Logs** to open the Sent Logs screen. It shows a table of every notification the campaign sent, with its entry type, status, destination, and message count. To download the data, click **Export Logs** in the top-right corner.

### Analytics

Click **View Analytics** to see how the campaign performed. You can also open analytics by clicking the bar chart icon next to the campaign on the Campaigns page. For details on each metric and chart, see [Campaign Analytics](https://fyno.io/docs/campaign-analytics).