Open abitrolly opened 3 years ago
This calculation is actually wrong. The correct one is this.
def upwork2(money):
# https://support.upwork.com/hc/en-us/articles/211062538-Freelancer-Service-Fees
fee500 = 0.2
fee10000 = 0.1
feeabove = 0.05
if money <= 500:
return money-money*fee500
else:
toll = 500*fee500
if money <= 10000:
toll += (money-500)*fee10000
else:
toll += (10000-500)*fee10000
toll += (money-10000)*feeabove
return money-toll
Testing to confirm that this progressive calculation actually gives less money from UpWork.
In [14]: upwork2(100)
Out[14]: 80.0
In [15]: upwork2(500)
Out[15]: 400.0
In [16]: upwork2(500.01)
Out[16]: 400.009
In [17]: upwork2(10000)
Out[17]: 8950.0
Checking with the real number from UpWork, which is $543.99 billed with reported $104.41 fees paid.
In [12]: upwork2(543.99)
Out[12]: 439.591
In [13]: 543.99-upwork2(543.99)
Out[13]: 104.399
Hey! Did somebody just steal 2 cents en route to me? Okay, it is 1.099999999999568 cents, but anyway. If I wanted to provide a superior service, I would try to round up the number in favour of users. The fishy part here is that round error doesn't fit into the 0-1 range. I mean maximum number that you may need to round up (ceil) some value after the dot is 0.9999999..
If you can imagine how outraged I was about that 2 stole cents, then try to guess how I felt looking at this digit.
One may think that money are still on the way, but it is not the case. There are some extra "debits" taking place as shown in this summary.
That's another $21 "stolen". Okay, it is $20 and 88.0000000000052 cents, but still. If I wanted to provide a superior service, I would include the debits break down on that summary.
In [22]: 543.99-104.41-418.70
Out[22]: 20.880000000000052
The number 20.888 didn't make sense to me, so I decided to check it it is some kind of additional percentage fee from the money I had left.
In [25]: leftover = 543.99-104.41
In [26]: leftover
Out[26]: 439.58000000000004
In [27]: howmuchisthecut = (leftover-418.70)/leftover
In [28]: howmuchisthecut
Out[28]: 0.04749988625506176
That looks like a round 4.75%, but maybe there is a better value. Let's check if that is the percentage of the fee that had already been taken.
In [29]: morecut = leftover-418.70
In [30]: morecut
Out[30]: 20.880000000000052
In [31]: morecut/104.41
Out[31]: 0.19998084474667227
That's 20% cut seems more like it. In fact one if the reports page contains the hint that this must be the VAT.
The explanation there is "VAT is applied to the Upwork service fee, premium Upwork memberships, and purchases of Connects. The tax is collected by Upwork and remitted to the Belarusian government." So good that they've took care of paying taxes for me. The irony of the deal is that it is directly supporting the terror government of Belarus I am trying to escape by registering on UpWork.
Watch https://www.coursera.org/learn/the-science-of-well-being if you've been tainted by the mood. I don't want to impose more censorship. I've been doing it for a long time, and it doesn't make things better. What makes things better is doing stuff and challenging the fears. Nothing could be done against a raw force. I can always opt-out from this game, but maybe there is a different lobby of my level.
The final version of the function that calculates cuts made by UpWork.
def upwork3(money):
# https://support.upwork.com/hc/en-us/articles/211062538-Freelancer-Service-Fees
# https://support.upwork.com/hc/en-us/articles/211061278--Value-Added-Tax-VAT-
fee500 = 0.2
fee10000 = 0.1
feeabove = 0.05
toll = 0 # this is how much UpWork took for its service
vat = 0 # this is how much UpWork takes from me to give to the government
if money <= 500:
toll = money*fee500
else:
toll = 500*fee500
if money <= 10000:
toll += (money-500)*fee10000
else:
toll += (10000-500)*fee10000
toll += (money-10000)*feeabove
vat = toll*0.2
return money-toll-vat
Checking.
In [33]: upwork3(534.99)
Out[33]: 410.7912
That's it. Now I need to get that money somehow.
Just for fun, here are some diagrams with input and output money from the three functions above.
# because everybody is using this
import numpy as np
# array of 101 numbers [0, 150, 300, ..., 15000]
xpoints = np.linspace(0, 15000, 101)
yupwork1 = [upwork(x) for x in xpoints]
yupwork2 = [upwork2(x) for x in xpoints]
yupwork3 = [upwork3(x) for x in xpoints]
# draw first function
import matplotlib.pyplot as plt
plt.plot(xpoints, yupwork1)
plt.show()
There are expected jumps in output value here. One is nearly invisible at 500 and another is at 10000.
In [66]: upwork(10000)
Out[66]: 9000.0
In [67]: upwork(10001)
Out[67]: 9500.95
It looks like a slope, because there is an interval of 150 between x points. Using smaller interval reduces the slope.
xpoints = np.linspace(0, 15000, 10000)
yupwork1 = [upwork(x) for x in xpoints]
plt.plot(xpoints, yupwork1)
plt.show()
That's still not convenient for the comparison. There should be a way to zoom on anomalies and draw all three functions in the same window.
More exercize for plotting with Python.
Let's move some funds. The cost of moving to bank account via wire transfer is $30 and about 7 days. That's 7.165% which is too expensive just for transfer. Most likely will be bank fee as well. Let's stick to the initial pipeline - move $418.70 to Payoneer. This page mentions a small transfer fee from UpWork side and additional "costs" from Payoneer without specify how much exactly for either side.
The "small transfer fee" from UpWork to Payoneer is $1. That cut sends only $417.70 down the pipeline.
There is a separate confirmation for receiving payment on Payoneer side. Looks like this step can not be automatied, or maybe it will cost $2.5.
And there is immediately another catching page, which I almost clicked.
It does looks like this 2 day limitation is artificial, because Payoneer is immediately aware of the incoming transfer. Holding the money for 2 days knowing that it came from UpWork with validated history does look like a fraud prevention scheme to me.
The funds are just received by Payoneer.
Which immediately introduces recurring payments.
There is a stateful activation fee per card (means it is attached to card state). There is also recurring maintenance fee.of $3 per month that is also depends on monthly transactions. With 3+ transactions it will be $1 per month.
https://myaccount.payoneer.com/MainPage/Widget.aspx?w=FeesUI#/settings/fees
There is also another interesting 12 months inactivity fee. Unlike blockchain, if you're dead or something, Payoneer just drains your balance like $29.95 per year.
In the end the available funds are $409.70 where 24.686% were taken off the initial $543.99
Another transaction down UpWork pipeline for tests.
$58.67 -> $52.80 ($5.87 Service Fee) -> $51.63 ($1.17 VAT for Service Fee) -> $50.63 ($1.00 Withdrawal Fee)
So far on 31st of January,
$409.70 + $50.63 = $460.33
-$23.98 for hosting.
$433.35 is new balance. $3 is the monthly maintenance fee. Payoneer decided to count the hosting transaction to be today instead of yesterday. That makes just 2 transactions in January, which are not eligible for reduced fee. Did they delay that on purpose?
-$68.46 for books.
In the world of money many intermediaries are taking a cut from your earned money while the money travels down from somebody to you. Those intermediary platforms do not cooperate to calculate the fees and takings. That's why one need to calculate them on their own. The UpWork pipeline looks like this.
When
Somebody
sends you first $500, the UpWork cuts 20%. https://support.upwork.com/hc/en-us/articles/211062538-Freelancer-Service-FeesTesting.