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?

      • Hey Tom,

        There is currently no way around this in MailChimp, unless you use the API to subscribe people, or use a separate signup service for MailChimp. I discuss both of these options in my free Bootstrapper’s Guide to MailChimp.

        • Ryan, you seem to know these stuff pretty well!

          I was wondering, using this method, is it possible to record the “value” to be the name of a page/post or page slug…etc?

          I have an opt-in box under each post but would like to record which post did the subscriber come from… is that possible?

          Thanks in advance and also thanks Rob for writing this article.

    • thanks for this Jordan…. how would I find the codes for the groups? And where in the embed code would I place the preset values in the code?

  5. I have the same question as Andy. We have a signup form in the cart for people that have made a purchase and also one in the footer of our site. We would them it to go to the same list but segment them based on where they signed up. If it’s the same form for each source (in order to land in the same list) how do we designate from which source they signed up?

    • Rob Sobers (Author)

      Hey Elizabeth,

      You simply change the value of the hidden SOURCE field in each individual embed snippet for the form. I assume you embed the same form twice: one for the cart and one for the footer. Just manually hard code the SOURCE values and you should be good to go.

      The problem that you’ll still encounter is the one that Brandon Hilkert mentions, which is when a person tries to submit the same form twice MailChimp will tell them they’re already a member of your list. This is really a result of us all trying to use MailChimp forms for lead capture vs. traditional newsletter signups.

      • Rob, the problem I have is that the code is in the function.php of my WordPress theme; it’s a generic code for all posts.

        I was just wondering if there’s a way to make that a variable or something so that it calls out the post name or slug; otherwise I might just change it to a post-by-post basis rather than “one code fits all”.

        • Rob Sobers (Author)

          You can do this pretty easily by adding some jQuery code that loads on each post page. It’ll look at the post name and then set the hidden field value on the form dynamically. Something like this:

          $(function() {
          var sourceText = $(‘h2.entry-title a’).text();

  6. I have been trying to figure this out forEVER. Ive always been confused with mailchimp…segments? groups? and what it could all be used for.

    This time I wanted to create a whole new automation campaign. I just tested this using a group and it worked great!!! If anyone wants to know, this is how i did it… first I created the group. Then I set up an autoresponder selecting Automation > Custom (triggers). I chose – send when the sub joins the list. Added a condition that matches the group I want them in. and finally, in my embedded form, instead of “source”, I used the checkbox code mailchimp gave me for users to select a specific group. I deleted the other groups and changed input type=”checkbox” to input type=”hidden”. Awesome! It works!

    Thanks so much for pointing me in this direction. Its a great way to create new campaigns!

    I have another scenario if anyone can help me get this working, i will be so grateful!!! I have a blog where I want to offer a different freebie on every post. The subscribers can go right in the main list without groups or segments, but I cannot seem to find the form code that redirects them to a specific page to download. I dont mind if a few people slip through the cracks and dont finish the signup process. They will if they like my content. Does anyone know custom form code to redirect to a different thank you page per form?

    • Rob Sobers (Author)

      Hey Trisha,

      I haven’t found a way to do different redirect URLs per form in MailChimp. It’s one of the reasons I switched away (now using ActiveCampaign).

      Another big problem for me was that if a single person wanted to get multiple freebies, they’d get a “You’re already subscribed to this list” message on their second try.

      I love MailChimp on so many levels, but they’re sorta caught in between email newsletters and marketing automation. Their forms are REALLY only meant to be entry points to a mailing list, not lead capture and content delivery. :(

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