Gratis verzending in WooCommerce – Het probleem

Gratis verzending in WooCommerce – Soms is het niet zo gratis!

De verzendkosten in WooCommerce vormen een uitdaging op zich. Met de introductie van WooCommerce 3.0 hadden de makers van WooCommerce eindelijk een structuur te pakken, die het mogelijk maakte de berekening van je verzendkosten helemaal naar je hand te zetten. Voor 3.0 had je eigenlijk wanneer je naar meerdere gebieden je producten wilde kunnen versturen en je bepaalde regels toe wilde passen als ‘gratis verzending boven een x bedrag’ geen fatsoenlijke mogelijkheid dit te doen.

Nu kan het wel. Maar toch loop je nog tegen enkele problemen aan.

Wanneer jij stoeit met de complexiteit van WooCommerce rond ‘shipping methods’ (verzendmethoden), ‘shipping classes’ (verzendklassen) en ‘shipping zones’ (verzendszones) dan ben je precies op de juiste plaats gekomen, om hier meer over te lezen.

Dit zijn namelijk de drie bouwstenen die het je mogelijk maken om op iedere denkbare manier de verzending van je producten in te stellen.

Laten we met de eenvoudigste beginnen. Voor de afbeeldingen bij dit artikel gebruik ik screenshots van een Engelstalige WooCommerce site die ik op dit moment aan het inrichten ben. Bij de verschillende screenshots zal ik ook aangeven wat de paden in de Nederlandse versies zijn. De realiteit is echter, dat je veel vaker met deze problematiek te maken zal krijgen, wanneer je jouw producten wereldwijd wilt versturen. En dan heb je ook meestal met de Engelse versie van WooCommerce te maken.

Verzendzones (shipping zones)

Verzend zones zijn simpelweg de gebieden, waarheen jij de producten wilt verzenden. Wanneer jij een pakketje naar de VS wilt versturen, dan zal je daar een ander bedrag voor in rekening willen brengen dan naar Frankrijk neem ik aan. En wanneer je het pakketje in eigen land houdt, wordt het mogelijk nog voordeliger.

De verzending van een pakket is onder meer afhankelijk van de afstand. En daarom is het goed, om de verschillende landen, waarheen je eventueel wilt verzenden, in aparte ‘gebieden’ onder te brengen. Dat doet PostNL toch ook? Nederland, Europa, Wereld.

Wanneer je in WooCommerce de verzendzones in wilt stellen, moet je zoeken onder WooCommerce -> Instellingen (of in het Engels ‘WooCommerce->Settings’). En binnen deze ‘Settings’ moet je naar ‘Verzending’ (Shipping) gaan.

Gratis verzending in WooCommerce

Onder het tabblad ‘Shipping’ (Verzending) zie je een drietal (in mijn geval een viertal, maar de laatste is door een plugin toegevoegd, die zal je niet in de standaard versie van WooCommerce tegenkomen) subkeuzes.

Ik heb zelf al de ‘Eurozone’ toegevoegd, en zoals je kan zien in het overzicht is de ‘Eurozone’ in mijn geval heel Europa.

Ik zou hier bijvoorbeeld nog een zone ‘Nederland’ aan toe kunnen voegen. De reden dat ik het niet gedaan heb, is omdat in dit specifiek geval ‘Nederland’ helemaal niet relevant is. Vanuit de winkel die ik hier onder handen heb, worden de producten vanuit Spanje of Estland verzonden. Voor heel Europa geldt een eenheidstarief.

De twee de optie die je ziet is ‘Locations not covered by your other zones’. De locaties die niet worden afgedekt door de andere zones. Dit is het gebied ‘overige landen’. In dit voorbeeld zie je, dat er naar ‘overige landen’ niets zal worden verzonden. Want er zijn geen verzendmethoden voor geconfigureerd. En dat is hier precies wat de bedoeling is. Zou je naar die andere landen ook willen verzenden zou je hier specifieke verzendmethoden moeten definiëren.

De volgorde

Wat hier ook belangrijk is, is te realiseren dat de volgorde van wezenlijk belang is. Stel dat ik wel een apart tarief voor Nederland zou hebben. Voor het bepalen van de juiste methode zal WooCommerce het lijstje doorlopen. Staat Nederland bovenaan de lijst, komt WooCommerce deze als eerste tegen, en zal dus methoden gebruiken die in de zone ‘Nederland’ zijn gedefinieerd.

Staat ‘Nederland’ onder Europa en komt Nederland ook voor in de definitielijst voor Europa, dan zal WooCommerce ‘Nederland’ zien zodra ‘Europa’ tegen wordt gekomen. En dan zullen de verzendmethoden voor Europa gebruikt.

Maar wat zijn nu die magische ‘verzendmethoden’?

Voor ik daar dieper op in wil gaan, heb ik het eerst graag even over de ‘Shipping Classes’.

Verzendklassen (Shipping classes)

Ik heb een klant die online kampeerartikelen verkoopt. En niet voor mensen die met een omgebouwd busje erop uit trekken, maar het ‘klassieke’ spul zoals tenten, lichtgewicht keukengerei, rugzakken en wandelschoenen. Hij verkoopt ook van die grote ‘Harry Potter’ kookpannen. Nu is een paar schoenen nog vrij makkelijk te verzenden, maar wanneer je zo’n pan wil verzenden dan vragen vervoerders -vanwege het formaat- hier toch een wat hoger bedrag voor. En dat bedrag wil hij natuurlijk doorberekenen aan de klant.

En dat is precies waarbij ‘Verzendklassen’ heel behulpzaam zijn. Ik kan namelijk zo’n ‘verzendklasse’ aanmaken en vervolgens die verzendklasse toekennen aan een product. Door die verzendklasse ook te relateren aan een verzendmethode (wat we even verderop gaan doen, kan ik zo een afwijkende prijs bepalen.

Maar laten we eerst eens kijken hoe we zo’n verzendklasse aan kunnen maken en met een product kunnen koppelen.

Aanmaken van een verzendklasse

Het aanmaken van een verzendklasse is heel eenvoudig. In subkeuze ‘Verzendklassen’ (Shipping classes) klik je op ‘Verzendklasse toevoegen’ (Add shipping class).

gratis verzending in woocommerce

Vervolgens geef je hier een naam, een ‘slug’ en een eventuele omschrijving in. Die ‘slug’ mag je overigens overslaan, want die wordt vanzelf gegenereerd uit de naam van de verzendklasse. Daarna sla je het op door op de blauwe knop te klikken.

Een verzendklasse aan een product toevoegen

gratis verzending in WooCommerce | Gratis verzending in WooCommerce - Het probleem

Wanneer je een verzendklasse wilt toevoegen aan een product, dan is dat ook heel eenvoudig. Je gaat naar het product en bij de productgegevens kies je onder ‘Verzending’ (Shipping) de juiste klasse.

Verzendmethoden (Shipping methods)

En dan zijn we uiteindelijk aangeland bij waar het eigenlijk allemaal om ging. De ‘Verzendmethoden’ (Shipping methods). En de reden dat dit met zo’n grote omweg moest, is omdat voor verschillende verzendgebieden verschillende methoden al dan niet beschikbaar kunnen zijn.

WooCommerce heeft drie ‘ingebouwde’ verzendmethoden. ‘Vast tarief’ (Flat Rate), ‘Gratis verzending’ (Free shipping) en ‘Afhalen’ (Local pickup).

Daarnaast kan je nog tientallen andere verzendmethoden door middel van plugins installeren. Zo zijn er plugins die op basis van grootte en gewicht direct de kosten voor een bepaalde vervoerder doorberekenen, plugins om prijzen te kunnen staffelen en nog veel meer. Maar laten we dit even buiten beschouwing laten.

We hadden al gezien hoe we een Shipping zone (verzendzone) aanmaken. Laten we nu eens meer in detail naar die verzendzone krijken. Ik kan hier namelijk ‘Shipping methods’ aan toevoegen.

Klik ik op de knop ‘Verzendmethode toevoegen’ (Add shipping method) krijg ik de mogelijkheid om uit de verschillende verzendmethoden te kiezen.

Laten we eens kijken, wanneer ik kies voor ‘Flat rate’.

Gratis verzending in WooCommerce

In deze dialoog kan je aangeven, wat het verzendtarief is. Ook kan je aangeven of over dit tarief wel of geen BTW berekend wordt.

Interessant wordt het echter onder ‘Shipping class costs’. Hier kan je namelijk per shipping class aangeven wat hier de kosten zijn. Kost het bijvoorbeeld 10 euro om de klasse ‘kookpotten’ te verzenden, dan vul je hier 10 in.

Tenslotte heb je het veld ‘Berekeningsmethode’ (calculation type). Hier kan je aangeven of het verzendtarief per klasse moet worden berekend en uiteindelijk opgeteld, of dat alleen de duurste methode geldt.

De magie in ‘flat rate shipping’

In al deze prijsvelden is ook een stukje ‘magie’ verborgen. Want je kan hier natuurlijk gewoon de prijs invullen. Je kan hier echter ook bepaalde formules ingeven, die de prijs berekenen. Vul ik namelijk 10 euro in, dan zal dit bedrag berekend worden over de hele order. In de meeste gevallen is dat ook precies wat je wilt. Maar wat nu, als je deze kosten per product in rekening wilt brengen?

Wanneer ik 60 kookpotten zou bestellen, zou dit waarschijnlijk een vrachtwagen vol zijn. Ik denk niet, dat er veel vrachtvervoerders zijn die voor 10 euro willen rijden.

Gelukkig kunnen we ook formules gebruiken. En voor deze formules kunnen we een aantal ‘placeholders’ als variabelen opnemen.

Formule placeholders

[qty]Van ‘quantity. Dit wordt bij de berekening vervangen door het aantal producten
[fee]Een vast, extra bedrag gebaseerd op de totale kosten van de order. Hierbij kunnen een aantal optionele argumenten worden meegegeven.
‘percent’- Een percentage gebaseerd op de totale kosten van de order
‘min_fee’- Een minimum bedrag. Handig bij percentages.
‘max_fee’ – Een maximum bedrag. Handig bij percentages.

Enkele voorbeelden

10 + (2 * [qty])

De verzendkosten zijn 10 euro plus 2 euro per item in de winkelwagen. Heb ik dus 4 producten met die shipping class in de winkelwagen betaal ik 10+(2 x 4) = 18 euro verzendkosten.

10 + [fee percent="10" min_fee="4" max_fee="40"]

Hier betaal ik 10 euro plus 10% van het totale orderbedrag, met een minimum van 4 en een maximum van 40 euro.

Heb ik dus een totaal bedrag van 20 euro, dan betaal ik 10 euro, plus 4 euro (10% van 20 is 2, maar het minimum bedrag is 4), dus 14 euro.

Is het totaal bedrag 800 euro dan betaal ik dus 10 euro, plus 40 euro (10% van 800 is 80, maar het maximum is 40), dus 50 euro.

Gratis verzending

Wil ik voor sommige verzendklassen gratis verzending aanbieden, voor andere niet, dan is dit ook vrij eenvoudig te doen. In het veld voor de specifieke verzendklasse vul ik in:

0 * [qty]

Voor deze ‘gratis verzending’ is het overigens wel belangrijk dat je als berekeningsmethode ‘Per Class’ kiest. Anders gaat de vlieger niet op.

Meerdere ‘flat rates’ per shipping zone

Iets wat veel mensen niet weten, maar wat wel heel handig kan zijn, is dat je in principe meerdere ‘flat rate’ tarieven per shipping zone kunnen benoemen. Het is dan overigens wel van belang, dat de verschillende ‘flat rate’ methoden verschillende namen krijgen.

Stel je bijvoorbeeld voor, dat ik mijn klanten de keuze zou willen geven tussen verzending per PostNL of verzending per DHL. Doodgewoon omdat sommige mensen bepaalde voorkeuren hebben. Zelf ben ik bijvoorbeeld niet zo’n grote DHL fan, andere mensen hebben hetzelfde gevoel bij PostNL. Wanneer ik op deze manier verschillende ‘Flat rate’ methoden configureer, iedere methode een eigen naam en eventueel aangepaste tarieven geef, dan geef ik de klant de mogelijkheid om zelf te kiezen van wie hij de zending wil ontvangen.

Een andere toepassing kan bijvoorbeeld zijn vanwege de tijd. Wil de klant de volgende dag het pakket ontvangen betaalt hij iets meer, dan wanneer hij tevreden is met een levering binnen drie dagen.

Gratis verzending (bis)

Hierboven gaf ik aan dat je voor bepaalde producten ‘gratis verzending’ op kan geven. Maar waarin verschilt dit van de ‘gratis verzending’ die er voor de verzendmethode ‘Gratis verzending’ beschikbaar is?

In ‘Flat rate’ is de gratis verzending afhankelijk van de verzendklasse van het product. Je kan hierbij bijvoorbeeld aan brievenbuspost denken, post die in een envelope verstuurd kan worden.

‘Free shipping’ is bedoeld om gratis verzending aan te bieden vanaf een bepaald orderbedrag. Laten we eens naar de methode kijken.

Gratis verzending in WooCommerce

Hier kan ik dus aangeven vanaf welk bedrag gratis verzending van toepassing is. In mijn concrete voorbeeld is dit vanaf 50 euro.

Addertje onder het gras

Bij deze gratis verzending rust er echter een addertje onder het gras. Zoals je hier ziet, ontbreken hier de verzendklassen. De ‘Free shipping’ module houdt hier namelijk geen rekening mee. In ons voorbeeld met de kookpotten, zouden we hier dus een groot probleem hebben. Gelukkig is er een plugin waarmee je dit hele verhaal met al zijn complexiteit wel kan implementeren, de ‘Table Rate Shipping‘ plugin.

In mijn werkelijke situatie hoef ik hier echter geen kookpotten te versturen. Ik heb hier deze plugin dus niet nodig.

Wat wilde ik bereiken?

Wat ik wilde bereiken met mijn verzendkosten is dat wanneer mensen voor meer dan 50 euro bestellen, ze geen verzendkosten hoeven te betalen. Bestellen ze voor minder dan 50 euro -zelfs al ik het 49,99, dan wel.

‘Geen verzendkosten’ kan een prima manier zijn om de waarde van een gemiddelde bestelling, je ‘Average Order Value’ te verhogen.

Wanneer we even voorbij gaan aan onze denkbeeldige verzendklassen, dan heb ik in het bovenstaande verhaal alles dus goed ingesteld. Ga ik nu echter een bestelling plaatsen voor een bedrag groter dan 50 euro, zie ik het volgende:

gratis verzending in WooCommerce | Gratis verzending in WooCommerce - Het probleem

Dat was dus niet helemaal de bedoeling. De bedoeling was, dat er automatisch geen verzendkosten berekend zouden worden. En niet dat iemand mag kiezen of hij wel of geen verzendkosten betaald, maar het standaard wel te zien krijgt.

Het eerste wat hier fout is gegaan, is dat de eerste payment method in de lijst altijd wordt gekozen. We hadden dit in ieder geval kunnen voorkomen door ‘Free shipping’ boven ‘Flat rate’ te zetten.

Het tweede wat hier fout ging -tenminste voor wat onze intentie betreft- is dat de ‘Flat rate’ sowieso getoond wordt.

Let op: Soms wil je juist dat er extra methoden getoond worden. Ik zou bijvoorbeeld de intentie kunnen hebben om mensen de mogelijkheid te geven om tegen betaling een expreslevering te kiezen. In dat geval moet er wel een keuze gemaakt kunnen worden. Maar in ons geval dus niet.

Hoe lossen we dit op?

Helaas is dit niet op te lossen met instellingen, maar je zal zelf een stukje code toe moeten voegen aan de functions.php van je website. Hoe je dit doet heb ik eerder beschreven in mijn artikel ‘WooCommerce voor Waaghalzen‘. De titel maakt hopelijk duidelijk, dat ik niet iedere WordPress gebruiker zou willen aanbevelen dit zelf uit te voeren.

En als je het doet, ongeacht je ervaring, test het altijd eerst uit in een staging omgeving.

Hieronder vind je de code.

<?php 
function wxp_free_shipping_filter( $rates ) {
	$free = array();
	foreach ( $rates as $rate_id => $rate ) {
		if ( 'free_shipping' === $rate->method_id ) {
			$free[ $rate_id ] = $rate;
			break;
		}
	}
	return ! empty( $free ) ? $free : $rates;
}
add_filter( 'woocommerce_package_rates', 'wxp_free_shipping_filter', 100 );

Op deze manier filter je zodra ‘free_shipping’ als een mogelijke methode in de lijst voor zou komen, alles behalve free shipping uit. Alleen ‘free shipping’ blijft dus over.

Maar wat nu, wanneer je meer methoden over had willen houden? Bijvoorbeeld in mijn eerder genoemde voorbeeld, waarbij je meerdere ‘Flat rate’ tarieven hebt. Je wil het éne flat rate tarief gebruiken voor de ‘standaard’ en het tweede voor de expresse verzending.

Ook dat is mogelijk, maar hier wordt de code enigszins complex. Zelfs voor WooCommerce waaghalzen. Dus nogmaals : Doe dit altijd eerst op een staging omgeving, want bij de minste of geringste fout ligt je site eruit!

Ik laat je eerst de code zien, daarna bespreken we hem. Kopieer de code niet blind, zonder ook de bespreking te lezen!

<?php
function wxp_free_shipping_filter_extended( $rates, $package ) {
    $filtered_rates = array();
    foreach ( $rates as $rate_id => $rate ) {

        if ( 'free_shipping' === $rate->method_id ) {
            $filtered_rates[ $rate_id ] = $rate;
            break;
        }
    }

    if ( ! empty( $filtered_rates ) ) { 

        foreach ( $rates as $rate_id => $rate ) {
            if (('flat_rate' === $rate->method_id ) &&
                ('Mijn omschrijving' === $rate->title) 
                ) {
                   $filtered_rates[ $rate_id ] = $rate;

            }
        }
        return $filtered_rates;
    }

 
    return $rates;
}
 
add_filter( 'woocommerce_package_rates', 'wxp_free_shipping_filter_extended', 100);

Wat doe ik hier?

Het eerste stuk van de code is in grote lijnen nog hetzelfde, behalve dat ik wat dingen heb hernoemd, het gaat immers niet alleen meer om de ‘free shipping te vinden. De grote veranderingen zitten in het stuk wat ik heb gemarkeerd met de commentaren

Ik ga hier namelijk op zoek naar alle verzendmethoden met als methode ID ‘flat_rate’.

Maar omdat ‘flat_rate’ meerdere malen voor kan komen, zij het met verschillende omschrijvingen en tarieven, controleer ik daarnaast ook op naam. Die naam staat in de variabele $rate->title.

Nu hoef je niet te begrijpen hoe deze code exact werkt, wat je wel moet begrijpen is wat je aan moet passen. Dat is dus de tekst die nu getoond wordt als ‘Mijn omschrijving’. Daar maak je dus bijvoorbeeld ‘Expresse verzending’ van. Deze naam moet letterlijk overeenkomen met de naam die je hebt opgegeven bij de toegevoegde ‘flat rate’ methode.

Verander je later die naam in je verzendmethode, dan zal je dit ook hier in de code moeten wijzigen.

Minstens net zo belangrijk : Heb je een meertalige website, bijvoorbeeld door gebruik van WPML, dan moet je dit codeblok net zo vaak voor laten komen als je omschrijvingen voor talen hebt.

Je kopieert dus het stuk tussen //begin code block en //einde code block en plakt het onder de //einde code block in de code. Hier verander je de omschrijving, bijvoorbeeld in plaats van ‘Expresse verzending’ maak je er ‘Express shipment’ van. Het kan overigens eenvoudiger, en heb je al de nodige PHP ervaring dan zie je vast wat je moet doen, maar ben je een ‘snippet plakker’, dan is het hele blok dupliceren de veiligste methode.

Hetzelfde is geldt wanneer je bijvoorbeeld een ‘Expresse verzending’ en een ‘Super-Expresse verzending hebt. Ook hier geldt, plak het codeblok tussen de commentaren nogmaals in in de code.

Vind je dit allemaal super griezelig klinken? Weet dat met behulp van de WordXPression Support Strippenkaart je de mogelijkheid hebt dit te laten doen.

Tenslotte

De manier waarop de verzending van goederen in WooCommerce geconfigureerd kan worden is denk ik wel één van de meest lastige onderdelen van WooCommerce. Kom je niet uit? Via de WordXPression Support Strippenkaart help ik je graag verder. Wist je dat je deze trouwens ook kan gebruiken voor een 1-op-1 persoonlijke videotraining over die zaken rond WooCommerce waarover je graag meer wilt weten?

Wees eens aardig en deel dit met je vrienden
Enkele trefwoorden om vergelijkbare posts te vinden:

Word je website de baas. Neem vandaag nog contact op!

Contact Information

WordXPression 
Imkersdreef 525
7328DG Apeldoorn
06-10449807 (van 9:00 tot 17:00 van ma-vr)

KVK : 75580152 

Social media
Stuur een bericht

Flinke kortingen op cursussen van WordXPression.