I was offered a contract to build a hybrid mobile app, but I've only ever done native development. Essentially, my question is this: Is it ethical to accept a contract if you will need to essentially learn every required framework/technology on the job? Is it reasonable to include time spent learning in the quote?
I had that problem some times and I accepted, but didn't include all the learning time - I tried to account the amount of time I'd needed if I already had that knowledge. But I guess that's more ethics most professionals would consider ..., some even call it unprofessional to spend time on projects without being paid.
However you account, accept the contract - what you will learn might bring you many opportunities in the future!
My vote: It's ethical to accept the contract, but not to include all the time spent learning (as long as it's more than just a few percent).
Actually, there are a few factors involved here.
Case 1: The client is a person whom you share a rapport with. And you be honest and tell him that the project is not within your skillsets. But, you are eager to learn that technology and are willing to do it at a lower rate than your existing one. The client, who trusts you, agrees to it and shares a flexible timeline and costing with you. In the end, you get to learn a new technology and the client gets the project delivered. There might be ups and downs on the timeline. But as long as there is honest feedback and communication between the two, it is not a problem.
Case 2: This is the case where you reject the project. The client has a fixed timeline and budget and he expects quality. You, being a newbie in that technology, cannot deliver the project. Therefore, you tell this upfront to the client and decline the project in a nice way, without giving any wrong vibes.
The customer/client is asking for someone with experience, so I would say it is not ethical to accept the contract unless the client knows first. If it were something simple to learn by reading a page or two on the internet, okay, otherwise stay away. It would not look good to falter during the contract and then have to reneg.
If you make an offer, nothing unethical can arise: you propose your pricing and it's up to them to accept or not.
Your offer can explicitly list hours for learning or silently absorb them in other items, your choice.
The situation would be a little different for a task charged by the hour, where they might expect shorter time, then it would be fair to warn them.
I think it is unethical to bill for time that you are learning something new. Take your effective hourly rate, figure out what it would cost you if you were doing a native app (or something else that you already know how to do well and then bid it based on those hours). The first time you do work on something you haven't done before the actual hours that you spend on the project will make your real hourly rate suck, but I have always considered it getting paid to learn.
Think about it. Lots of people pay to go to school and learn new skills. In your situation, you are learning something new, getting paid to learn it, and you have a firm deadline forcing you to learn the material by a certain date.
I had been wanting to learn NodeJS but didn't have any reason to learn it. I took on a Node project, bid it out at cost of what it would take if I knew what I was doing going into it and struggled and stressed over not getting the project done in time, but guess what? I got it done, the client was happy and now if I have the ability to profitably spend my time on a whole new technology.