> ## Documentation Index
> Fetch the complete documentation index at: https://docs.replo.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Mailchimp

> Connect Mailchimp so Replo waitlists and signup forms can add subscribers to your audience.

export const TryPromptButton = ({prompt, imageSrc, imageAlt = "Template preview", imageStyles = {}, buttonCta = "Build in Replo"}) => {
  const [isLoading, setIsLoading] = useState(false);
  const [error, setError] = useState(null);
  const PUBLISHER_API_BASE_URL = "https://publisher.replo.app";
  const APP_URL = "https://dashboard.replo.app";
  const LoaderIcon = <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" style={{
    animation: "spin 1s linear infinite"
  }}>
      <path d="M21 12a9 9 0 1 1-6.219-8.56" />
    </svg>;
  const ChevronIcon = <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
      <path d="m9 18 6-6-6-6" />
    </svg>;
  async function postJSON(url, body, headers = {}, timeoutMs = 120000) {
    const controller = new AbortController();
    const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
    try {
      const response = await fetch(url, {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          ...headers
        },
        body: JSON.stringify(body ?? ({})),
        signal: controller.signal
      });
      const responseText = await response.text();
      if (!response.ok) throw new Error(`API Error: ${response.status}`);
      return responseText ? JSON.parse(responseText) : {};
    } finally {
      clearTimeout(timeoutId);
    }
  }
  async function handleTryPrompt(event) {
    event.preventDefault();
    event.stopPropagation();
    setIsLoading(true);
    setError(null);
    try {
      const body = {
        prompt,
        file: null
      };
      const {seed} = await postJSON(`${PUBLISHER_API_BASE_URL}/api/v1/marketing/issue-marketing-site-jwt`, body);
      if (!seed) throw new Error("No seed returned from API");
      const url = new URL(APP_URL);
      url.searchParams.set("type", "agent");
      url.hash = `seed=${encodeURIComponent(seed)}`;
      window.open(url.toString(), "_blank");
    } catch (caughtError) {
      console.error("Failed to generate prompt:", caughtError);
      setError("Something went wrong. Please try again.");
    } finally {
      setIsLoading(false);
    }
  }
  return <div style={{
    position: "relative",
    display: "inline-block",
    width: "100%"
  }}>
      {}
      {imageSrc && <img src={imageSrc} alt={imageAlt} style={{
    width: "100%",
    height: "auto",
    display: "block",
    borderRadius: "8px",
    opacity: 0.8,
    ...imageStyles
  }} />}

      {}
      <div style={imageSrc ? {
    position: "absolute",
    top: "50%",
    left: "50%",
    transform: "translate(-50%, -50%)",
    zIndex: 10
  } : {
    display: "flex",
    justifyContent: "flex-start",
    margin: "1.25rem 0"
  }}>
        <button type="button" className="try-replo-btn" onClick={handleTryPrompt} disabled={isLoading} style={{
    backgroundColor: "#274AE2",
    color: "#ffffff",
    padding: "0.5rem 1.1rem",
    fontSize: "0.875rem",
    fontWeight: 600,
    fontFamily: "inherit",
    border: "none",
    borderRadius: "9999px",
    cursor: isLoading ? "not-allowed" : "pointer",
    lineHeight: 1.4,
    whiteSpace: "nowrap",
    display: "inline-flex",
    alignItems: "center",
    justifyContent: "center",
    WebkitFontSmoothing: "antialiased",
    boxSizing: "border-box",
    opacity: isLoading ? 0.7 : 1,
    boxShadow: "0 1px 2px rgba(15, 23, 42, 0.08)",
    transition: "background-color 0.15s ease, box-shadow 0.15s ease, transform 0.15s ease"
  }}>
          <span style={{
    visibility: isLoading ? "hidden" : "visible",
    display: "inline-flex",
    alignItems: "center",
    gap: "0.375rem"
  }}>
            {buttonCta}
            {ChevronIcon}
          </span>
          {isLoading && <span style={{
    position: "absolute",
    display: "inline-flex",
    alignItems: "center",
    justifyContent: "center"
  }}>
              {LoaderIcon}
            </span>}
        </button>
      </div>

      {}
      <style>
        {`
          @keyframes spin {
            from {
              transform: rotate(0deg);
            }
            to {
              transform: rotate(360deg);
            }
          }
          .try-replo-btn:hover:not(:disabled) {
            background-color: #1f3ec0 !important;
            box-shadow: 0 4px 12px rgba(39, 74, 226, 0.35);
            transform: translateY(-1px);
          }
          .try-replo-btn:active:not(:disabled) {
            transform: translateY(0);
            box-shadow: 0 1px 2px rgba(15, 23, 42, 0.08);
          }
          .try-replo-btn:focus-visible {
            outline: 2px solid #274AE2;
            outline-offset: 2px;
          }
        `}
      </style>

      {}
      {error && <div style={{
    marginTop: "12px",
    padding: "12px 16px",
    backgroundColor: "#fee",
    border: "1px solid #fcc",
    borderRadius: "6px",
    color: "#c33",
    fontSize: "14px",
    textAlign: "center"
  }} role="alert">
          {error}
        </div>}
    </div>;
};

[Mailchimp](https://mailchimp.com) is an email marketing platform for audiences, campaigns, and automations. Connecting it in Replo lets published waitlists and other email forms add subscribers to a Mailchimp audience.

Connecting Mailchimp in Shopify does not send Replo form submissions to Mailchimp. The project needs a Replo Mailchimp connection.

## Connect Mailchimp

You can connect Replo to Mailchimp by signing into your Mailchimp account from the Replo Integrations app.

<Steps>
  <Step title="Open the Integrations app">
    In Replo, open the [Integrations app](/apps/integrations) and find **Mailchimp**.
  </Step>

  <Step title="Sign in and authorize">
    Click **Connect**, sign in to Mailchimp, and approve access. This links your Mailchimp account to your Replo project.
  </Step>
</Steps>

You can also connect straight from chat; if you ask Replo to use Mailchimp before it's connected, it drops the connection card right into the conversation.

```text theme={null}
Connect my Mailchimp account
```

<TryPromptButton prompt="Connect my Mailchimp account" />

## Add a signup or waitlist form

Ask Replo to add an email signup form and it builds a custom, on-brand form that submits to the Mailchimp audience you choose. Mailchimp's API can't be called from the browser, so the form submits through Replo, which adds the subscriber with your connected Mailchimp account.

```text theme={null}
Add an email waitlist form to my page that adds subscribers to my Mailchimp audience
```

<TryPromptButton prompt="Add an email waitlist form to my page that adds subscribers to my Mailchimp audience" />

If the audience uses double opt-in, Mailchimp sends a confirmation email and the subscriber stays pending until they confirm. Someone who is already in the audience but unsubscribed gets a confirmation email to rejoin, and existing contacts' details are never changed by a form signup.

Replo can tag everyone a form adds (for example `waitlist-spring`), let visitors pick audience groups, and record an event that starts a Mailchimp Customer Journey, so you can tell each form's signups apart and send them the right follow-up.

## Ask about your audience

Once connected, you can ask Replo how an audience is doing (size, growth, open and click rates), review recent campaigns, or have it write a launch email and save it as a Mailchimp draft. Drafts are never sent automatically; you review and send them in Mailchimp.

```text theme={null}
How is my Mailchimp waitlist doing? Then draft a launch email for it.
```

<TryPromptButton prompt="How is my Mailchimp waitlist doing? Then draft a launch email for it." />


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.