Julian Zelizer, a history and public affairs professor at Princeton University and a CNN political analyst, is the author of " The Fierce Urgency of Now: Lyndon Johnson, Congress, and the Battle for the Great Society ." He's co-host of the "Politics & Polls" podcast. The opinions expressed in this commentary are his own.

(CNN) Monday night, two Republican Senators -- Mike Lee and Jerry Moran -- announced that they would not vote to send the health care bill to the floor. The announcement marked a stunning defeat for a Republican Party that controls the White House and Congress and which has made this item the top priority for years.

Not only is health care reform in limbo, but going into the end of July, Republicans don't have a single major piece of legislation to show for President Donald Trump's first six months of office.

As the blame game now begins, everyone in Washington will be asking -- who killed the health bill? As in an Agatha Christie novel, there are many suspects on the train.

The bill itself

This was the main problem. Republicans crafted a piece of legislation that faced immense odds. At the same time that the legislation aimed to dismantle a major piece of the social safety net, it offered nothing much in return to the millions of Americans who were going to lose benefits. The legislation threatened to strip away benefits from millions of poor, elderly, and sick Americans.

The early versions of the bill offered a huge tax cut to the wealthiest Americans. And even after that was stripped out in the revised bill, the legislation was seen as punitive and was opposed by governors from both parties, major players in the health care industry as well as a large majority of Americans who continued to register their strong opposition. Each CBO score -- the Congressional Budget Office's assessment of the likely impact of the bill -- was a reminder of what would happen if Congress said yes. The Republicans managed to put forth a bill that had very few fans -- but many victims.

President Trump

As the President would say of others, he proved to be a "disaster," making things more difficult for the GOP every step of the way. The chaos that is coming from his White House and the ongoing investigation into Russia -- which he and his advisers have done little to stop, only adding fuel to the fire -- didn't help Republicans keep a focus on this fight. When President Trump, who now has a historically low approval rate of 36% did say something -- like calling the House bill "mean" soon after passage and saying he was fine if nothing passed after the first round of Senate efforts fell apart -- he usually hurt the Republican cause. He proved unwilling or unable to use the bully pulpit of the White House to build public support for the legislation and make a convincing case to Americans that this bill was anything other than hurtful. When Republican Senator Dean Heller of Nevada expressed his strong reservations, a pro-Trump Super Pac threatened to run ads against him.

Trump's response to Monday night's news came in a tweet: "Republicans should just REPEAL failing ObamaCare now & work on a new Healthcare Plan that will start from a clean slate. Dems will join!" Once again, the President is not listening. Democrats might work with Republicans to fix the problems with ACA. But they won't agree to eliminate the program -- which would still mean millions of Americans losing their benefits -- based on a promise from a President, who faces a credibility gap bigger than the Grand Canyon, that the GOP will somehow make things better down the line.

The Freedom Caucus

This bill has its origins in a Freedom Caucus that had pushed the Republicans far to the right in the House. The Freedom Caucus insisted on an extremely conservative measure to kick off this period of Republican government. Sen. Mitch McConnell always had an eye back on the House where he knew that he had little wiggle room. If he did anything to address the concerns of moderates like Susan Collins about the fate of Medicaid, he would never be able to negotiate a compromise in conference committee. Freedom Caucus allies in the Senate such as Ted Cruz could not be bought off with anything short of removing strong regulatory protections, as was evident when McConnell caved to the senator before announcing the second version of the bill.

Sen. Mitch McConnell

When the Senate deliberations started, everyone predicted that McConnell was a master legislator, Lyndon Johnson style, who would figure out a way to get this done. They were wrong. The truth is that McConnell has spent much of his career as an obstructionist. He is extraordinarily good at stopping things, but not really tested in making legislation happen. In his first major test in his new role, he didn't have the legislative wherewithal to put these votes together. Facing a challenge with this unpopular bill, he stumbled and fumbled.

It turned out that he didn't have some magic trick up his sleeve to bring the votes together. His lack of a strong television presence hurt, particularly given that we have a president who did so little to sell the bill to the public. Everyone was working in the backroom on a bill that sounded horrible to most Americans.

After the collapse of his bill Monday night, McConnell announced his Hail Mary plan. He is going to give this one more try. Listening to the President, he announced that the Senate would move to repeal Obamacare with a two-year delay to allow time for a transition to a "patient-centered health care system." Perhaps the gambit will work, and Republican senators will take a risk on a proposal that will be just as unpopular with the public. But given the opposition to cutting the Medicaid expansion and the patient protections, that is a dicey proposition.

The Congressional Democrats

The opposition on Capitol Hill played this well. House Minority Leader Nancy Pelosi and Senate Majority Leader Chuck Schumer kept their troops in line. There were no major defections from the Democrats at any point. In the Senate, this meant that McConnell could only lose two votes if he wanted the bill to pass. The Senate Democrats were also consistently on message, pointing out the many threats posed by the legislation and the reasons it would undercut health care markets. Yet they did this without becoming the story. Although Republicans would have loved to turn this into a tale of partisan Democratic obstruction, they failed. Democrats let the Republicans make their own mistakes -- and let the bill speak for itself.

Follow CNN Opinion Join us on Twitter and Facebook

The grassroots resisters

Since President Trump took office, opponents have been mobilizing at the grassroots. A group of former congressional staffers, for instance, formed the group Indivisible which used the methods of the tea party to create pressure on Republicans in Congress to vote no on repeal and replace. They flooded town halls, spoke to the media, called and emailed congressional offices and appeared at public events to make their case known. The strategy worked. They have been incredibly effective throughout at generating fear among congressional Republicans and making it clear that there would be high costs to voting in favor of this bill.

The irony is that the failure of the Senate bill could be the best thing to happen to Republicans. This stops them from passing legislation that could easily cause a massive backlash and creates an opportunity for moving forward with measures more attractive to their supporters, like tax cuts. But that all assumes that the dysfunction we have seen from this White House and the rightward pressure coming from within the party come to an end. The odds are that those won't. If that's the case, the defeat of health care might portend more legislative failures.