Hi Saad,
Looks like you've been speaking to one of our Reps over Live-Chat, so I have a little more info for you here.
The reason the Customer.Firstname is populating with the wrong value is because of the way the 'Locate Using Record ID' part of your character function has been set up.
This Action is the problem -
Set up like this, the action is Taking the current Active Record ID of the Estimate and assuming that the Same ID corresponds to the Customer.RecordID, but these are two separate - unrelated tables (or atleast their RecordID's are) - and you are going to get random results.
The Easiest Fix - Add the Customer.FirstName field as a Linked field to the Estimates Table, and then use the value contained here as your Replace Merge field action (ie. take the value from Estimate.FirstName - rather than Customer.FirstName)
If you would prefer not to do this, there are other ways to achieve the same result, but they require a little more effort to get up and running.
Regards,
Ben