Can i have different price in each product based on the country of a registered customer? (im talking about the base price, not shipping or tax or special price)
Any ideas or any module to suggest?
Assuming all your users are registered already, with an actual billing or shipping address, you could easily change the pricing according to the user's country.
There are 3 ways you can approach it. Since I am assuming you are familiar with how to customize OpenCart I will layout the guidelines with minimal code. I am also assuming all your users are already registered as you suggested.
The options are:
Customer Groups (Easy but not recommended).
Adding a price ratio column to the countries table. (Moderate but recommended).
Override your currencies (Easy but limited solution).
Use Customer Groups.
You will have to create a unique customer group for each country (or continent if you wish) and upon signup you will assign the correct customer group to the user. You can do it automatically by changing your registration model and controller files or manually by making sure that all new customers need to be approved first.
When setting a product discount, you can set up a different discount for each customer group.
This is A LOT OF WORK and will BE HARD to maintain but it’s possible.
Note that, by default, customers will be able to see the base price before discount (which can sometimes be lower than their customer group price). You can edit the product.tpl or your css file and remove it from showing.
Add a price_ratio column
The 2nd way (my recommended way) will be to modify your country mysql table and add a fixed price ratio for each country (i.e US is 1, UK is 1.2, Thailand, 0.8 etc). This will change base pricing for all products in a fixed ratio.
Edit database table 'country' and add column named 'price_ratio'.
Edit your model and controller files to calculate the effective price by price * price_ratio.
Send it to the view and show the effective price.
You will also need to modify your admin localization/country model, view and controller so you can make changes to the price_ratio directly from the Admin.
With this method, you only need to change the price_ratio once and all prices will be updated (in contrary to the first method where you’ll have to change pricing for each product and each country).
Also, technically if you are lazy about it, you could store all price ratios in an associative array in your code and avoid all other modifications, but that would be harder to modify down the road.
Use Currencies
3rd way will be to override your currencies but that would only give you limited control (i.e different countries in Europe share the same currency so you can not display different pricing).
Hope this helps!
There is no such extension, AFAIK, and asking for recommending of such an extension is a reason for closing Your question. But it is possible to implement it these ways:
check the IP address - find out the country of origin (via one of many free/paid services out there on the internet) and change the prices accordingly. This may not be 100% accurate as users may use proxies and thus user from USA may have IP from China in the end...
require users to log in first and then check their shipping/invoice address to get the country. This may also have some hacks considering the user may have more shipping addresses (to different countries) or his shipping and invoice address's country may be different
inform users that the prices are country-dependent and that they to pick up one country (a select box similar to language/currency chooser) where the shipping will be done and after this You can change the prices accordingly. Then there will have to be a check whether the selected country is the same as the country of shipping/invoice address...
Anyway, all methods will require a huge modification - maybe a new module for backend to set the product/country price ratio (similar to the currency) or a modification of product details to be able to set a concrete price for each country (keep in mind there are hundreds of countries so maybe it would be wise to allow just few of them) and of course a modification for frontend to calculate the prices correctly in regards to the country...
My opinion: this is useless waste of time... You can achieve similar behaviour when using ratios for different currencies (different country - different currency - until you want to set different prices for EU countries with EUR)...
Here is the list of extension i have found related to your problem
Assign Customer Group By IP (By D3MO)
Auto Price Increment / Reduction Rules By GeoIP (By D3MO)
There is another extension to set different prices for each currency
Currency Price (By ashwani_multi )
I hope these will help you. Following are the links for these extensions
https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=34652&filter_search=Customer%20Group%20Price
https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=29023
https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=34754&filter_search=Customer%20Group%20Price
Related
We have a situation where we'd like to show two shipping methods at cart and checkout. Not just refine down to the most applicable.
We have a country only based zone with one method - Free Pickup.
And.
We have different postcode specific zones set up that have flat rate and free shipping methods.
Our Aim
Free Pickup will always show if the user has set the country field to the applicable country.
And.
Flat rate or Free Delivery will show based on if it's available to the users postcode (as per default)
So in simple terms. Keep everything the same but always display our Country zone method, as long as the user has input a country.
So Far
Currently we're looking at manually adding the pickup method via woocommerce_package_rates filter at the function calculate_shipping_for_package().
What we'd really like to do is to intercept at the session set method and add our pickup method. But that's where we're stuck. Determining exactly where the rates are set to the session.
So turns out we were on the right track.
What was adding additional confusion at the time was that we were also accounting for WooCommerce Multivendor plugin which has an extra step in adding rates.
Solution was to hook into woocommerce_package_rates and build a new rate based on our available zone specific to pickup and the pickup method by creating a new object with the WC_Shipping_Rate class.
By adding it at this point in the stack, we were able to keep our country based method along side our zone based methods.
I run a Magento Shop that has several downloadable products, some come for free with a downloadcode when people buy other products or they get our vouchers from somewhere else.
So there are 2 Scenarios, 1. people buy downloadable products only, pay with paypal, or 2. people download products for free, if they have a voucher.
Its rather annyoing for many people to enter billing information although they are only downloading files as guests and we don't need a billing info.
Did anyone ever come across a way to get rid of the billing info when people are only downloading products? Which means they can actually check out with email only, like its done on pages like bandcamp.com?
Thanks a lot for your ideas.
You are not going to like this.
I don't think it's possible, not within a reasonable cost, to remove the billing address from Magento.
It is deeply embeded in the orders mechanism.
For the shipping address, this should be done out of the box.
If you have only virtual and downloadable products in your order the shipping address and shipping method steps should not appear in the checkout.
But if you insist in doing it I can give you some pointers on where to start.
First you will need to modify the onepagecheckout controller or even better write your own checkout controller that handles your needs.
Then look in the Mage_Sales and Mage_Checkout modules for the text getBillingAddress and setBillingAddress and handle the cases when these values can be null.
Here is an example to understand better what I'm talking about.
In the sendNewOrderEmail method of the order model there is this
$customerName = $this->getBillingAddress()->getName();
You need to change this in case the billing address is null. If it's not null let it work as it does now.
Maybe I should be more clear, I don't necessarily need the remove the billing completely. I only need a name and an email address to send the purchase email with the download links. But I need to get rid of Street, Tel, City etc. or set them not-required, but only if all products are downloadable.
Magento already checks whether we need shipping or not based on the shopping cart.
So I would think of something like
check in OPC if we need shipping (or alternatively, all products are downloadable)
change billing fields to "not-required" or remove them
2a. If Magento requires an address, maybe set a dummy address hidden from the customer???
cheers Marek
When a customer is going through the checkout phase...
How can the price of the delivery a customer will pay, CHANGE/UPDATE depending on the country they are based in with the use of Magento?
The shipping method that comes with default Magento is good enough to achieve what you're asking for.
Go to System > Configuration > Shipping Methods(Sales).
Select Website in Current Configuration Scope. and then go to Table Rates. You will see Export and Import CSV. Prepare your data in CSV format and import. Then you are ready to go.
If you have multiple shipping method that the customer can choose from then there are some free modules on the magento connect. http://www.magentocommerce.com/magento-connect/webshopapps-matrixrate-1-multiple-table-rates-extension.html.
It is useful when you have different shipping schemes such as
1. Price vs destination
2. Weight vs destination
3. Num of items vs destination
Then you can use default for one of the above, and the extension to achieve some of the remaining ones.
You can use Table Rate shipping method, provided as default in Magento, you have to upload a csv of rates for all countries for which you want a different one.
You can create different shipping method for different countries if you are a developer. But I don't think that's an ideal solution if you have more countries. You can go for http://www.magentocommerce.com/magento-connect/webshopapps-matrixrate-1-multiple-table-rates-extension.html
This will meet your requirement.
I need separate shipping charges for different countries, is it possible to do in open-cart, How can I change in shipping pages?
Example
Canada, Mexico, Alaska - ships for $9.99`
Hawaii & International - ships for $19.99
Yes, it can be done.
Check out http://www.18aproductions.co.uk/news/view/how-to-get-different-shipping-rates-on-your-opencart-shop
Summary:
Use weight based shipping even if your shipping cost don't depend on weight.
The weight based shipping module allows for different zones.
Just enter an extremely high weight limit to cover all weights with one shipping rate.
There are extensions available in the extension store that handle this. In particular you want to be looking for flat rate geo zone based shipping
You need first to set up each of your shipping areas as a Geo Zone.
The included flat rate shipping module matches one Geo Zone.
It is not (currently) possible to add multiple instances of a module within OpenCart.
As a result, similar modules that allow settings for multiple geo zones have sprung up on the extension store.
You could write your own module, but another (fiddly but free) option is to clone the flat.php files (or relevant shipping module) for each additional GeoZone.
The logic is in catalog\model\shipping; admin controls are in admin\controller\shipping and admin\view\template\shipping. In all these folders you need to duplicate the original file and give it the same new filename (eg flat2, flat3) in each. There's also language in catalog\language\english\shipping and admin\language\english\shipping, but you could use the same language files for all.
You must then edit each to amend the class names (eg change the Free part in ModelShippingFree, ControllerShippingFree to match your Free2).
Then you can go into Admin and set each to a different Geo Zone.
Go to Admin panel -> User Administration -> Extension -> Shipping - Here you can see the geo based shipping price.
the product’s page would have a “restricted countries” tab, where we can select countries that the product cannot ship to.
Nope I am afraid recently coded the functionality for a project: Few pointers how I tackled the issue:
You will have to modify the addToCart
functionality to introduce your
logic. Rewrite
Mage_Checkout_CartController::addAction()
You will also need to alter the OnePageController Mage_Checkout_OnepageController::saveBillingAction and saveShippingAction to confirm that the address choosen are not restriced
You will also need to alter Mage_Checkout_MultishippingController::addressesPostAction to do the same address checking during multi shipping checkout.
Admin Changes
You will need a product attribute called restricted_countries ...you will need to set some source and backend models to poplulate the countries in the multi select list in the product tab
I hope this puts you on the right path ... good luck.
Personally I think you should go multi-website and have the product selection, prices and delivery prices setup per currency (or region).
You then should put some GeoIP code on the index.php so that you have one URL for all of your websites.
In that way the person from region A sees the subset of products for their region based on their currency, e.g. ₡7.99 instead of an auto-converted ₡7.57, region B sees a different subset of products e.g. ₱14.99 instead of auto-converted ₱14.23 and so on.
Price points do matter if your site is to be popular, making money and a long term investment then you need price points not auto-converted prices or foreign currency only.
The multi-store, multi-website arrangement is out-of-the-box, easy to setup and with minimal burden on catalog inventory management. Work within the software and the methods available, don't reinvent the wheel.