The story starts off in New England, 1835. Sarah, a beautiful young girl, meets her father, Alex Stafford, for the first time. Six-year-old Sarah learns that she is the product of Stafford's adulterous affair with her mother, Mae. Mae was urged to abort the child, but refused to do so. This decision separated her and Alex and left Mae depressed. Sarah begins to think that she is to blame but she hopes Alex never comes back.
Later on that year Mae's maid Cleo begrudgingly takes Sarah with her on a trip to the seashore, so that Mae can have a private visit with Alex. Cleo takes Sarah with her into a popular brothel where Cleo is well-known and has a male companion. After getting drunk she agrees to sleep with him while Sarah waits in the hall. After this man leaves Cleo heartbroken again, Cleo in a half-drunk stupor tells Sarah "God's truth" and forces a frightened Sarah to listen to her say that no man ever cares for a woman and all they want is sex.
Mae and Sarah then move to a shack on the docks, where Mae takes up prostitution to make ends meet. Her reputation is known all over town, and young Sarah is forced to suffer the rejection of the townspeople because of it. Through this experience, Sarah learns to mask her emotions and replace them instead with a hard exterior.
A few years later, Mae dies to a terrible illness, leaving Sarah alone at the age of eight with a drunken man named Rab. Unsure of what to do with the small child, Rab seeks a home for the child. He finds a man that is looking for a little girl for his wealthy master. Thinking that this is Sarah's lucky break, Rab takes Sarah to the wealthy neighborhood. They are greeted at the door by a woman who urges Rab to take Sarah away and not come back. Not dissuaded, Rab insists that Sarah is perfect for this rich man. The woman admits the pair and sends them to a bedroom upstairs where they are instructed to wait until her master can see them.
Duke, the master of the household, welcomes Sarah and Rab; minutes later, Rab is strangled before Sarah's eyes, his body dumped in a nearby alley. Duke, who is a pedophile, had been scouring the town not for a new daughter, but a new mistress. Duke informs Sarah (renamed by him Angel) that there are many things he wants to teach her. He gives her first "lesson" that very night.
After about 10 years with Duke, Angel finally escapes and boards a ship bound for California. Robbed and forced to the option of prostituting herself instead of being raped by the mostly male passengers, she disembarks in San Francisco with nothing more than the clothes she is wearing. Angel is taken in by 'The Duchess', the owner of The Palace, a brothel in Pair-a-Dice and becomes an exclusive, high-priced prostitute. Employed by the Duchess, Angel is guarded constantly, her meager earnings kept from her. Her only solace is Lucky, a fellow prostitute that is often drunk. Lucky reminds Angel of her mother.
Michael Hosea first sees Angel on a trip to Pair-A-Dice to sell produce. He is ready to leave when God tells Michael "she's the one", the woman he is meant to marry. Michael soon discovers to his shock that Angel is a prostitute. Still determined to heed God's command and marry Angel, Michael pays the high fee for her services in hopes of convincing her to leave with him. She stubbornly rejects his offer. Discouraged, Michael questions God, but still obeys. He pays Angel's fee for three successive nights, talking and reasoning with her until his time and money are up. Angel keeps her cold, sarcastic front to dissuade him, wanting to escape the pain his words cause her. Meanwhile, she cannot seem to escape thoughts of Michael and her rising hope of life outside the Palace.
After the last night with Angel, Michael grows frustrated and leaves Pair-A-Dice. A few days later, he returns to Pair-A-Dice, unable to ignore God's command any longer. He finds Angel almost dead from a brutal beating given her by Magowan, Duchess' bodyguard. Willing to use any means to preserve Angel's life, Michael asks her to marry him so he can take her to his cabin. Barely conscious, Angel agrees, mumbling "Why not?"
Michael nurses Angel back to health at his cabin. Angel remains barely tolerant of the arrangement while it serves her needs. Michael endures Angel's harshness, remaining faithful to his new wife and God's plan. Michael's widower brother-in-law, Paul, returns home from fruitless gold panning in the Sierras. Paul recognizes Angel immediately as the high-priced prostitute from the Palace. Believing Angel has deceived Michael, Paul treats her badly. Paul tries to tell Michael about Angel's profession, but only angers him. Paul thinks Michael married Angel out of blind lust and without knowing she was a prostitute. During his visit Paul thinks there is a rift between him and Michael because of Angel, not knowing that Michael loves Angel in spite of her past and that he is the one causing the rift between them.
When she finally heals from her wounds, Angel tries to run away from Michael in hopes of returning to the brothel to get back her money The Duchess had kept from her and insisted it was being spent in the clothing and food Angel received. When Paul leaves to sell the produce of his land back in Pair-A-Dice, Angel sees this as a way for her to escape. While Michael is out working in the field, she runs after Paul's wagon. He agrees to take her with him if she pays him back with her only means of currency: herself. He's disgusted by her actions even more after they have sex together and hopes that is the last of her he will be seeing ever again.
Upon her return to Pair-A-Dice, she sees that the Palace has burned down killing her dearest companion Lucky, and another prostitute by the name of Mai Ling. With nowhere else to go, she begins working above a bar—once again as a prostitute. Even though she loathes being seen as nothing but a harlot, she has no other skills with which to make a living. A livid Michael finds her in a room with a client and fights their way out of the bar filled with drunken men waiting for their turn with Angel.
They return to the cabin, where Michael relies on God to work through his anger at her unfaithfulness. Angel begins to develop affectionate feelings towards Michael, which she cannot comprehend because she has never allowed herself to love any man, for "God's truth" said they will take advantage of her or desert her, just like her father. Despite her continued coldness, Michael loves her unconditionally. Upon showing her a sunrise, he says, "That is what I want to give to you." Angel feels herself becoming soft-hearted day by day, but in her uncertainty and fear refuses to share it with Michael. She feels a deep sense of shame at her "uncleanness". She is softened by Michael's love but cannot see herself as worthy of it. Though they have slept together regularly, Angel is very disconnected from the experience of sex, but when one night she experiences the same joy and pleasure that Michael does ("And she flew, Michael with her, into the heavens..."), it frightens her.
Upon their arrival back in the valley, they meet the Altman family, who have a broken wheel and are stranded on the side of the road. Michael helps fix their wagon and invites them to stay at their cabin. Angel reveals to Mrs. Altman and the oldest daughter, Miriam, that she met Michael in a brothel, and is amazed to find that they have only compassion for her instead of contempt. They become close, and Angel takes a liking to the oldest daughter, Miriam, who begins to fancy Paul, who is living at the other end of the valley. When Angel sees Miriam talking with Michael, she assumes that they have feelings for one another and jumps to the conclusion that they would make a much better couple than she and Michael. Paul wants to see Michael end up with Miriam as well, but has also begun to develop feelings for the 16-year-old Miriam. He denies his feelings only because he wishes to see Michael with Miriam instead of Angel.
She runs away once again, this time to Sacramento; on the way she is offered a ride by an old man that sells pots. Upon reaching Sacramento while looking for work she again meets Joseph Hochschild, who has built his new store, and she stays with him, knowing that he is a good friend of Michael's. She works for him in his store along with his wife and mother. When an order comes in for Michael, she tries to leave but Joseph keeps her busy, making her wait longer. When she finishes her duties and goes to close up the store, Michael is standing at the doorway, having again come back for her. She admits that she is frightened by the idea of being in love with him, but he reassures her and brings her home.
Meanwhile, it is revealed in a flashback that during her time as Duke's mistress, Angel got pregnant twice and both times an infuriated Duke had a doctor abort it, taking measures the second time to ensure that she can never get pregnant again. Angel later reveals this to a devastated Michael. She also reveals that she once had sex with her own father, who came to her brothel, in a bid for revenge because he left her mother. She is swamped with guilt at the callous way she treated him. Knowing that has shocked her husband, and feeling guilty for not being able to give Michael any children of his own, as she knows he longs for, Angel runs away once more, leaving her wedding ring behind, in hopes that Michael will marry Miriam and have children with her. Michael is crushed, but says he will not go after Angel again if she does not want to be with him.
This time Angel goes to San Francisco. When she arrives, she gets a job with a gentle man called Virgil. He takes her in as a cook at his cafe, and takes care of her. But after months of their hard work, the cafe burns down, and in it all of Angel's savings and possessions. Observing the fire in the street, a bereft Angel hears a familiar voice—it is Duke, greeting her. Fearing that he would hurt Virgil, who seems suspicious of Duke, Angel agrees to go back with him.
Once more under Duke's power, Angel is expected to resume her life as a prostitute. However, Duke's sexual preference is for young girls, and he asks Angel to manage his prospective "companions," but only after a week's worth of prostitution. Angel is to be presented to a crowd of men. She begins to wrestle in her mind and cries out to God internally. She is prepared to go on stage to entertain the men. When she is finally before them, the voice of God tells her to sing and she starts singing "Rock of Ages" to the awed and confused crowd. A gray-haired man sings along with her and moves up to the front of the stage. She forgets the words of the song, and he finishes it.
After the presentation, Duke reprimands Angel. However, he is met by the singing stranger from the crowd. He threatens to have Duke hanged if he lays a single finger on Angel. With that the man escorts Angel out, and on their way out Angel rescues two other young girls Duke was using as lovers. When the men at the brothel see the two young girls with Angel, they become furious and destroy the place. The man takes them to his house, where his wife and daughter take care of them. Jonathan Axle, the man who saved her, is a wealthy and respected banker with a solid Christian family. Angel starts to attend church with the Axle family and grows fond of them.
Meanwhile, Miriam reveals that she is in love with Paul, and the two of them marry while Angel is away. Michael still awaits the return of Angel and prays continually for her to come back. Seeing his grief, Miriam insists that Paul should go and find Angel, but Paul, still full of contempt for the woman he believes Angel to be, refuses.
Angel eventually recognizes God's love for her and receives Christ in her heart. She begins to work with prostitutes by helping them leave their old ways and learning new abilities that might help them make a living. Susanna Axle, the daughter of Jonathan Axle, helps her run the boarding house.
Paul finally gives in to Miriam and goes to San Francisco to look for Angel. He sees her with an old man—Jonathan Axle—and thinks that he is a client, and she still a prostitute. He is furious that he came all this way, and starts making up excuses to give Miriam so that he does not have to hurt her by telling her Angel is a prostitute. However, the next day he decides to go up to the house and confronts Angel. At first he acts cold, contemptuous, and sarcastic, but is startled by her humility and the genuine love she harbors for Michael. He is shocked to learn that she left Michael in the hope that he would marry Miriam so that he could have children. When she discovers that Paul is marriedto Miriam, and that Michael is still waiting for her after three years of absence, her whole world falls apart and she no longer feels justified in staying in San Francisco.
She finally makes the decision to leave Susanna in charge of the house, and goes back to Michael. She surprises him in the field where he is working, kneeling at his feet and crying. She is grieved to see how losing her has had a profound effect on Michael. She reveals that her real name is "Sarah". Michael, in tears himself, receives her with kind, pure and forgiving love, and declares that he believes the revelation of her name is a promise from God that they will one day be able to have children (the Sarah in the Bible was a barren woman who, by the grace of God, was eventually able to have a son). At last they start a new life together, the life they have dreamed of.
In the epilogue, it is said that Michael and Sarah later had four children.