Which Mailchimp Opens Never Became a CRM Activity
It is the Tuesday pipeline meeting. The demand gen manager has Mailchimp open on one screen: last week's product update went to 4,180 contacts, 41 percent opened it, 610 people clicked through to the pricing page, and 38 of those clicked twice. Good numbers. She says so.
The sales manager has HubSpot open on the other screen. He filters deals created since the send, sorts by source, and finds eleven. He is not being difficult when he asks where the rest went. He genuinely wants to know, because his reps have a call quota and 610 people who read a pricing page is a list worth working.
Nobody in the room can produce the answer. The demand gen manager can export the 610 clickers. The sales manager can export contacts with activity in the last seven days. Someone offers to VLOOKUP the two exports, and by Thursday they have a list of 400-odd email addresses that appear on one side and not the other. Then the question changes shape. A rep looks at the list and says half of these are already mine, I talked to them, it just was not logged as a call. Another says three of these are the same company and one buyer. A third says this one bounced to a personal Gmail and the work address is different.
The join was easy. The judgement was not. That is the actual problem, and it is why this keeps landing back on someone's Thursday.
What Mailchimp shows on its own
Mailchimp is precise about the thing it owns. For any campaign you get opens, unique opens, clicks by link, click maps, unsubscribes, bounces by type, and a per-contact activity timeline. You can segment on that behaviour: everyone who clicked link three in the last two sends, everyone who opened four of the last five and never clicked. Those segments are real and they update. If you want to know which subject line performed, or which link in a newsletter pulled traffic, Mailchimp answers it cleanly and fast.
Where it stops is not a gap in the reporting. It stops at the edge of its own dataset. Mailchimp knows what happened inside an email. It does not know whether a human being followed up. It does not know if the person who clicked pricing was already in a live conversation with a rep, whether they are the economic buyer or an intern doing research, whether their company already churned, or whether a deal closed two days later for reasons unrelated to the email.
Mailchimp's HubSpot integration does push contacts and some engagement across, and it is a genuinely useful sync. But a sync moves fields. It does not adjudicate whether the engagement was acted on, because acting on it is something a person did somewhere else, often in prose.
What HubSpot shows on its own
HubSpot is equally solid on its half. Contact timelines, logged calls and emails, deal stages with dates, sequence enrolment and reply rates, task completion, and attribution reports that will tell you first touch and last touch against closed revenue. If a rep does their job in HubSpot, the record is there, and the reporting over it is good. HubSpot's own marketing email tool closes this loop by design, which is exactly why teams that live entirely inside HubSpot rarely hit this problem.
The teams that hit it are the ones sending from Mailchimp for a reason: a list that predates the CRM, a cheaper cost per contact at volume, a designer who owns the templates there, an ecommerce audience synced from Shopify.
Where HubSpot stops is symmetrical. It shows you activity that was recorded. Absence in HubSpot means one of two things and it cannot tell you which: nobody followed up, or somebody followed up and did not log it. Those two look identical in a report and require completely different responses. The first is a coverage problem. The second is a hygiene problem. Reporting on a system of record can only ever report what was entered into it.
Why the gap is structural, not a missing feature
Look at what each half of the evidence actually is.
| The Mailchimp half | The HubSpot half |
|---|---|
| Events. Timestamped, machine generated, unambiguous. | Records plus prose. Deal stage is a record. The call note is a sentence a person wrote. |
| "Opened at 09:14, clicked /pricing at 09:15." | "Left VM, he's evaluating but budget is next quarter, sending the case study." |
| Complete by construction. Every event that happened is there. | Complete only where a human chose to write it down. |
The left column is countable. The right column is half countable and half readable. And the readable half is where the answer lives, because "did anyone follow up" is a question that gets settled by reading a note, not by matching a field.
This is worth being clear about, because the usual instinct is to reach for an automation tool. Zapier, Make and HubSpot's own workflows all handle Mailchimp events well, and they are the right tool for a large class of jobs. But they are trigger based. They fire when something happens and move a record forward: someone clicked, so create a task, so update a property, so enrol in a sequence. That is forward motion, and it is genuinely valuable. It is not the same operation as looking backward across four weeks of already-happened events and asking which of them died on the vine. A trigger cannot answer a question about the past, because there is no trigger for "nothing subsequently occurred."
The BI direction has a different wall. Point Looker or Power BI at a warehouse where Mailchimp and HubSpot both land, and the joins and the counts are straightforward. Modern BI assistants will take the question in plain English and write the query. But the deciding evidence here is a free text note attached to a contact. A sentence somebody typed. It is not a modelled dimension, it is not a metric, and in most warehouse schemas it is either truncated, excluded, or sitting in a text column nothing queries. The BI tool is not failing at its job. The evidence is outside the shape of data it was built to see.
So the gap sits between two good products and two good categories of tooling. It is not a roadmap item anyone forgot.
What the join actually requires
Two pieces, and only one of them is mechanical.
The key. Email address, with caveats. The mechanical part is joining Mailchimp's clicker list to HubSpot contacts on email. The caveats are the usual ones and they matter: people click from a personal address that is a secondary email on the HubSpot record, one company frequently produces several clickers where only one has a deal, and a contact deleted or merged in HubSpot leaves a Mailchimp subscriber pointing at nothing. Resolving to company as well as contact is what turns a list of 400 addresses into a list of accounts worth calling.
The judgement. For each unmatched or thinly matched contact, someone has to decide what "no follow-up" means here. That requires reading, not matching:
- A logged call three days before the send with "not until Q3" in the note is coverage, not a gap. The rep already knows.
- A closed-lost deal from two months ago with "went with a competitor" is not a gap either.
- An open deal in stage two where the last note is six weeks old and the person just clicked pricing twice is the most interesting row on the list, and no field on the record says so.
- A support ticket saying the account is escalated changes whether you want a rep calling at all.
That is the work. It is reading a handful of sentences per contact and deciding what they mean. It scales badly by hand, which is why the Thursday spreadsheet gets built and then quietly abandoned by the following Tuesday.
How you would answer it with Skopx
Skopx connects to nearly 1,000 tools, Mailchimp and HubSpot among them, and it reads across all of them in one pass. You ask in chat, in the words you would use in the meeting:
For the product update sent on the 14th, list everyone who clicked the pricing link and has no logged call, email or meeting in HubSpot in the 14 days since. For each one show the deal stage if there is one, the last activity note, and the owner. Flag anyone whose last note says they asked for a follow-up.
The answer comes back with citations: which Mailchimp campaign report each click came from, which HubSpot contact and deal each row resolves to, which note the flag was drawn from. You click through and read the source. That matters more than it sounds, because the first thing the sales manager will do is dispute a row, and being able to open the note behind it ends the argument in ten seconds rather than restarting the export.
The flagging step is where the reading happens. "Asked for a follow-up" is not a property in HubSpot. It is a thing a rep wrote in a sentence, phrased forty different ways, and it gets found by reading the notes rather than filtering a field.
Once the question is worth asking every week, you type another sentence and get a standing console over the same data. Ours is called an internal app, and you can see how internal apps work if you want the mechanics. In this case it would show: clickers with no logged activity, grouped by owner, with the deal stage and last note inline, and a button per row that creates a HubSpot task for the owner. The button asks for confirmation before it writes anything, and creating the task is the only write in the whole thing.
The reps stop asking marketing for the list. They open the console, see their own rows, and work them.
What this does not do
Be clear about the edges.
It does not store anything. There is no new database of clickers, no forms, no records created on a schedule. The console reads Mailchimp and HubSpot live each time it loads, and the single write is a task you click a button to create, with a confirmation step in front of it.
It does not run on a schedule and it does not alert you. Nothing fires at 8am. Nothing emails you when a threshold trips. If you want the console at 8am on Tuesday, you open it at 8am on Tuesday. If you want triggered automation, use an automation platform, they are good at it, and this is not that.
It does not fix logging hygiene. If your reps do not log calls, this will show you a long list of contacts that look uncovered and are not. It surfaces the discrepancy honestly, and you still have to decide whether the answer is more calls or better logging.
It does not resolve identity perfectly. A clicker on a personal address that has never been associated with a HubSpot contact will not match, and no join will find them.
It is not certified SOC 2, it has SOC 2 controls in place, and it is not a HIPAA environment. Do not route protected health information through it.
Team is $16 per seat per month with 2.3 million AI tokens included. Solo is $5. The Tuesday meeting still happens, but somebody can answer the question in it.
Skopx Team
The Skopx engineering and product team