Segmenting a MailChimp List by Signup Source

I love Nathan Barry’s post on how he does email marketing. One small, but important, detail that I picked up the second time through the post is that Nathan keeps all of his subscribers in a single MailChimp list and then segments them down by signup source in order to deliver the most relevant content.

This is an excellent way to structure your list. You could achieve the same result with separate lists for each signup source, but that will become unwieldy when you want to send a single campaign to multiple lists, or to your entire subscriber base.

So, how do you capture signup source?

It’s really easy! Login to MailChimp and click on Lists in the left nav and then click on your list name. Click Signup Forms and then General Forms.

Add a hidden text field called SOURCE with a label “Signup Source” and a reasonable default value (in case you forget to pass one). Save your form.


Notice how I put the merge code *|SOURCE|* in the header of the signup form as well — this essentially lets you call your list something different to people signing up for different reasons versus settling on a generic name and potentially confusing people.

Now, wherever you embed your form, simply add the following line of HTML right above the <div> that encloses your submit button:

<input type="hidden" name="SOURCE" id="SOURCE" value=" Newsletter">

Obviously you should change the value parameter to whatever you want that signup source for that form to be.

That’s it — now you’ll have an extra property on every subscriber record that indicates which form they came in on. If you’re capturing email addresses with multiple different incentives, this extra bit of data is vital.


  1. Thank you. This is exactly what I was looking for!


  2. Quick question, I’m doing this on my forms (, but I’ve found it difficult to manage signups for different things (newsletter, courses, workshop), that I ultimately want all to be on the single master newsletter list. If a user tries to sign up to the list again, with a different “SOURCE” you get a big ugly error that they already exist. Have you experienced this at all?

    • Rob Sobers (Author)

      Hey Brandon – I haven’t run into that yet. That’s an edge case I haven’t tested yet, but I would consider it a bug. Have you contacted MailChimp support?

      Multiple conversions is tricky because, not only do you want to avoid the ugly error, you probably also want to keep track of historical conversions as well. This is where something like KISSMetrics or comes in. I’m using to track each subscriber’s historical form submissions.

  3. Paul

    Thanks for the advice Rob. This is exactly what I was looking for. However, I notice the default merge tag doesn’t get added to the list for General Forms and this only works if you embed the form and add the HTML. Do you have a workaround for this?

  4. So Rob gets a couple things wrong here, but his method is completely valid and I use it myself. Rob’s method leads to the problem which “Brandon Hilkert” encounters. Although I’m pretty sure Nathan Barry’s method would as well, if you use embeded form. Not 100% sure with out testing.

    I’ll explain.

    I believe Nathan is using “Interest Groups” to segment his lists, and not “Hidden Text Fields” which is what’s explained in this article. There’s a very important difference between the two.

    Mailchimp creates “Interest Groups” for any checkbox field you add to your signup form. These checkboxes can be hidden from the end user should you choose, but the values I believe must be pre-defined in the mailchimp form builder. You can still set “Interest Groups” when someone signs up though an embeded signup form, much like Rob explains with “SOURCE” but it’s slightly different. Setting a value for a checkbox interest group looks something like this (names would differ for you)

    <input type="hidden" name="group[10697][1]" value="1">
    <input type="hidden" name="group[10697][2]" value="1">
    <input type="hidden" name="group[10697][4]" value="0">
    <input type="hidden" name="group[10697][8]" value="1">

    Hidden text fields as Rob explains in this article are different. They can only have a single value for email in a list. Additionally, once a user is subscribed to a list, they can not signup to that list again. ….but they can edit their “Interest Groups” should you make those fields visible. I suspect, this is what Nathan Barry does.

    Also there’s some confusion with the naming of these variables, as “Signup Source” in Mailchimp I believe is a reserved variable, which gets set regardless of if you’re using “Source” as Rob explains. I believe it’s set automatically from what ever “App” your users get signed up from.


    Signup Source
    Hosted Signup Form (from my embeded form)

    Signup Source
    Unknown (from my imports)

    Signup Source
    Chimpified (from the chimpified app)

    But I’m also using “Source” which is ok, but shows up as a normal merge variable in Mailchimp.

    I’ve been playing with this stuff today, and found this blog post when looking how to edit the “Signup Source” internal variable in mailchimp, so please excuse me for being verbose.

    • Tom

      I’m using the same method as you Jordan, with the group selection hidden from the user.

      I have a standard newsletter signup for my list but I also have a WordPress theme I give away once someone gives me their email on a different form (they get signed up to the same list), which gets assigned to a different group. The problem I’m having is that if someone has already signed up to the email list, they can’t get the free WordPress theme because they will get the “[email] is already subscribed to list” error message.

      Is there any way around this with MailChimp?

Leave a Reply

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    Markdown is turned off in code blocks:
     [This is not a link](

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see