> ## Knowledge Base Index
> Fetch the complete knowledge base index at: https://help.supersend.io/sitemap.xml
> Use this file to discover available pages before exploring further.
> Pure-Markdown content can be obtained by appending a '.md' suffix to the content URLs listed in the sitemap (without the trailing slash).

# Dynamic attachments (per-contact files)

# Dynamic attachments (per-contact files)

## Purpose

**Dynamic attachments** let each contact receive a different file on send—SuperSend downloads the file from a URL stored on that contact and attaches it to the message. This is often called **custom attachments** in the app. Typical uses include recruiting (a specific resume or CV per hiring manager), sales (a tailored proposal or one-pager per account), or any workflow where the file is already chosen per row in your spreadsheet. This article explains how to define an attachment URL field, load URLs (for example via CSV), enable them on an email or LinkedIn message step, and fix common issues such as Google Drive links.

## Prerequisites

- A **campaign** with contacts (attachment-type custom variables are configured from that campaign’s **Contacts** area)
- Files reachable at an **`http` or `https` URL** that returns the **raw file** (not an HTML viewer or login page)
- URLs and files within product limits: **up to 25 MB** per file download, **30 second** fetch timeout (see Troubleshooting if sends fail)

## How it works (short)

1. You add a **custom variable** whose **Type** is **attachment** (a URL field on each contact).
2. Each contact holds the **direct download link** for their file in that field (CSV import, manual edit, or integration).
3. On an **Email** or **LinkedIn** step, in **Custom Attachments**, you select which of those variables to attach. At send time, SuperSend **downloads** the file from the contact’s URL and **attaches** it. You do **not** need to paste the URL into the message body; selecting the variable under **Custom Attachments** is what includes the file.

**Static vs dynamic:** You can still upload files on the step for the **same** attachment for every contact; **Custom Attachments** is only for **per-contact** URLs.

## Steps

### 1. Add an attachment-type custom variable (campaign Contacts)

Custom attachment variables are managed from the **campaign** contacts screen (not from team **All Contacts** global settings alone—the editor for adding custom variables is available there).

1. Open the **campaign**.
2. Click **Contacts** in the campaign navigation.
3. Click the **gear** icon in the toolbar (the side panel title is **Global Settings**).
4. Open the **Variables** tab.
5. Under **Custom Variables**, click **Add Custom Variable**.
6. Enter a **Name** (e.g. `resume_url`). Names are stored normalized (spaces become underscores, lowercased).
7. Set **Type** to **attachment**.
8. Click **Save**.

You’ll use the token shown in the UI (e.g. `{{resume_url}}`) as the identifier for this field. The value stored per contact must be a full URL string starting with `http` or `https`.

### 2. Put the file URL on each contact

- **CSV import:** Add a column (for example `resume_url`). During import, map that column to your custom attachment variable. See [Upload Contacts via CSV](https://help.supersend.io/en/article/upload-contacts-via-csv-rom2na/). In the mapper, custom fields use labels such as **Custom Field (Attachment URL)** when appropriate.
- **Manual edit:** Open the contact, find the custom field, and paste the URL.
- **Integrations:** Map an external field that contains the file URL to this custom variable.

**Important:** The URL must **download the file** when opened in a browser (or return the file to an HTTP GET). Preview pages, interstitial virus-scan pages, or links that require a logged-in session usually **fail**.

### 3. Enable the variable on the sequence step

Works in **simple** or **complex** sequences for **Email** steps, and similarly for **LinkedIn** message steps that support attachments.

1. Open the campaign **Sequence** tab.
2. Select the **Email** (or LinkedIn) step.
3. Scroll to **Custom Attachments** (helper text: *Select variables to attach per-contact files when sending.*).
4. Check the variable(s) to attach (e.g. `{{resume_url}}`). You can select more than one if you have multiple attachment fields.
5. Save the campaign / sequence as you normally do.

### 4. Optional: Google Drive direct download link

Shared Drive links usually open a **viewer**, which will not work. Build a **direct download** URL:

1. From a link like `https://drive.google.com/file/d/FILE_ID/view?usp=sharing`, copy **FILE_ID** (the segment between `/d/` and `/view`).
2. Use: `https://drive.google.com/uc?export=download&id=FILE_ID`
3. Open that URL in a **private/incognito** window: the file should **download** (or prompt to download), not show the Drive UI.
4. Ensure the file is shared so **Anyone with the link** can access it if your recipients are not signed in (SuperSend’s servers fetch the URL without the recipient’s cookies).

Filename hints: SuperSend uses response headers and the URL when possible; Drive `uc?export=download` links sometimes need a correct extension—if the name lacks one, the system may infer an extension from the file’s content type.

### 5. Test send

Use your usual **test email** / preview flow for the step. If a test contact’s URL cannot be downloaded, you’ll see an error referencing the variable and URL (same underlying behavior as live sends).

## Expected Result

- Each recipient gets the email (or LinkedIn message, where supported) with **their** file attached, fetched from **their** URL.
- **Static** uploads on the step still apply to everyone; **checked** custom attachment variables add **per-contact** files.
- In the contact profile, attachment-type fields may show as a **View file** link for quick verification.

## Troubleshooting

- **Issue:** No **Custom Attachments** section on the step.  
  **Fix:** Add at least one custom variable with **Type** **attachment** in **Global Settings** → **Variables** on that campaign’s **Contacts** page, then save. Refresh the sequence editor if needed.

- **Issue:** Attachment missing; send skipped or contact paused.  
  **Fix:** If the download fails, SuperSend **pauses the contact for one day** with a reason about the attachment and sends an **in-app notification** with the variable name and URL. Fix the URL (direct download, permissions, no auth wall), then resume or clear the pause as you do for other paused contacts. Empty or non-`http` URLs are skipped for that variable.

- **Issue:** “Could not download attachment” / timeout / size errors.  
  **Fix:** Confirm the URL returns the file within **25 MB** and **30 seconds**. Try the URL with `curl` or a browser. Avoid redirects to HTML error pages.

- **Issue:** Wrong filename or extension.  
  **Fix:** Prefer URLs whose server sends a useful `Content-Disposition` filename. For Drive, use the `uc?export=download&id=` form above.

- **Issue:** Works in browser when logged in, fails from SuperSend.  
  **Fix:** The fetch runs from SuperSend’s infrastructure with **no** user session. Use a **public** direct link (signed S3 URL, public CDN, or Drive “anyone with the link” + direct download URL).

## Related Articles

- [Edit Sequence Steps](https://help.supersend.io/en/article/edit-sequence-steps-1tu4afc/)
- [Upload Contacts via CSV](https://help.supersend.io/en/article/upload-contacts-via-csv-rom2na/)
- [Contacts Overview](https://help.supersend.io/en/article/contacts-overview-bk1sx7/)
