In general, there is more support for the geometry than the geography data type, see function comparison matrix. For your type of query, classic point in polygon, I think you can use the geometry datatype, setting the spatial reference ID (SRID) to 4326 (lat/lon). See, this thread on the difference between geography and geometry for more info.
The gist index applied to geometry/geography datatypes creates an extended R-tree, which is more efficient for point in polygon type searches than geohashing (which is essentially just a trick to squash 2-dimension into one, so it can be indexed using B-trees). R-trees work by making more or less equally balanced trees based on bounding boxes and generalize fine for areas of higher density (the boxes will just be smaller), so searching first works on minimum bounding rectangles to find potential candidates, before more expensive point in polygon calculations are performed.
So, presumably for normalization purposes, and to support many to many product/supplier relationships, you would want to have a products table, a productID, supplierID table and a supplier table, with supplierID and the geometry/geography or that supplier's area. The supplier table would look something like,
CREATE TABLE suppliers (id serial primary key, geom geometry (geometry, 4326));
Note the contraint on geom column, setting the type to geometry and the SRID to 4326. If you know you are only going to have Polygons or Multipolygons, you could further restrict this, to prevent Points or Linestrings being inserted, while geometry will take any geometric type.
Then you want to add the spatial index,
CREATE INDEX ix_spatial_suppliers_geom ON suppliers USING gist (geom);
Obviously, you can call the index what you want -- I tend to use ix_spatial_table_column.
To find if a product can be distributed in an area, you would make use of the ST_Contains function, which test if one geometry (your point) is inside another (your supplier area), eg,
SELECT productID, sp.supplierID
FROM
products_suppliers sp
INNER JOIN
suppliers supl on sp.supplierID = supl.supplierID
WHERE ST_Contains(supl.geom, ST_SetSrid(ST_MakePoint(lon, lat), 4326));
which will return a list of product and supplier, based on a supplier's delivery region. To find if a specific product can be distributed, you would add an and clause to the where. If there were multiple suppliers for a given product, based on a user's location, you could make use the ST_Distance function, or for more accuracy ST_Distance_Spheroid between the user's location and the supplier's location in an ORDER BY, but this is going beyond what you originally asked.
As for gotchas, I can't think of any. Postgres/GIS queries of this type scale to the hundreds of millions of rows, and the supplier/product lists are presumably reasonably static, ie, this will be mostly read.