How to process data asynchronously in Elixir?

Yes, that’s because CSVParser.call (and therefore Controller.create) still blocks by awaiting the task. As I wrote above, if you don’t care about the result, you can use Task.start_link/1. The controller in your case does not need to wait for the email to be sent, so in CSVParser you can do this:

def call
  Task.start_link(fn -> do_async_task(csv_path, email) end)
end

Also, controller functions should always return conn (as the error message says). So make sure you return conn in your create method:

def create(conn, %{"file" => %Plug.Upload{path: fullpath, content_type: "text/csv"}, "email" => email}) do
  CSVParser.call(fullpath, email)
  conn |> render_json_response({:ok, %{message: "Request Initiated"}})
end