AWIN Telco Datafeeds developer guidance
Contact & Support
If you are experiencing difficulties downloading the latest data, interpreting the documentation or think you might have identified a bug or inconsistency in the data, please don't hesitate to get in touch with Publisher Services:
- Field names suffixed with or cannot be null/empty. Your import code can rely on these values always existing and you should report an issue to Affiliate Window if you ever encounter an empty value. Note that a value of 0 could have a specific meaning. The documentation on the individual fields will provide further information on interpreting values.
- Anyone planning to use the JSON fields should not need to absorb any of the fields described in "Generic / Default fields" or "Simple Telco fields". The only exceptions are merchant_product_id, deep_link and last_updated so these should always be ticked along with the fields described in JSON Telco fields when downloading from create-a-feed. All others can remain un-ticked.
- Field names in the generic / default schema are in many cases slightly misleading as the schema has to cope with multiple verticals. It's important therefore to read the documentation below in order to understand the proper function of each field in the context of the Telco vertical. JSON fields on the other hand are Telco-specific and so are more appropriately named.
- All Telco fields are available in the same schema (group of tick boxes) in create-a-feed, but they're described here separately as "JSON Telco Fields" and "Simple Telco Fields" as their intended use is different.
In general all products will be better described, and in more detail in the JSON Telco fields.
Generic / Default fields
These fields are available across all verticals and should be used by anyone wishing to include telco products alongside other types of product. Note that in order to provide data that can co-exist with far 'simpler' product types, the information in the generic / default fields is heavily simplified. Anyone planning to make extensive use of Telco products is encouraged to use the JSON Telco fields described later in this document.
Affiliate Window's unique product ID
A unique ID linked to this deal. The unique ID persists from one feed to the next, including in most cases, when monthly or upfront prices change.
The primary product's product type. See the list of valid product types here.
This is the 'tracked' version of the merchant_deep_link field. You should use this to ensure you receive commission for your clicks. Where a basket/deep link is unavailable, the product page link will automatically be substituted here.
A large (400x400 pixels) image of the primary product being sold.
Note: This image will have a white background. Should you want a large image with a transparent background, consider using the large_image field instead.
A note about images.
The deal's upfront price. This is a one-off price. See store_price
The primary product's product description. Usually a paragraph or two long, and designed to act as an introduction to the product's main features and benefits for anyone browsing your product page.
The 4G ready Galaxy S5 has all the iconic design you'd expect from Samsung. The perforated pattern on the back cover creates a sleek modern look and the contoured shape comes in a range of colours including Charcoal Black, Shimmery White, Electric Blue and Copper Gold. Dust and water resistant, the S5 is made to last. With an IP67 certification, the S5 is resistant to sweat, rain, liquids, sand and dust so your phone is protected whilst you enjoy your favourite sporting activities. Packed with an impressive 16 megapixel camera with selective auto focus and advanced High Dynamic Range for beautifully lit shots even in low light conditions.
Note: Where the network does not contain "No Network", this field should be consistently populated. Developers should not make assumptions about the availability or completeness of product descriptions under other circumstances.
Describes the primary features of the deal being sold. If the price is a special affiliate-only or publisher exclusive price, this will also be described here.
Samsung Galaxy Note 3 (White) on O2 O2 Refresh 4G (24 Month(s) contract) and 500 mins UNLIMITED texts 500MB 4G Internet data for 33.00 per month
the merchant's untracked basket URL (or the 'deepest' URL available for this merchant). You should only use this URL if you plan on adding your own tracking links.
A medium (200x200 pixels) image of the primary product being sold (served from Affiliate Window's servers).
Note: This image will have a white background. Should you want a large image (though larger, at 400x400 pixels) with a transparent background, consider using the large_image field instead.
A note about images.
The trading name of the merchant whose products are represented in this datafeed.
A unique ID for the merchant mentioned above.
Affiliate Window's product category for the primary product represented on any given row of the feed.
The only currency currently supported is "GBP"
This is the deal's upfront cost. The upfront cost usually relates to the purchase of a device with a contract (contracts on their own, for instance SIM-only will rarely if ever attract an upfront cost). Note that in some cases, the device and the linked contract can have separate monthly costs. Where this is the case, details can be found in the deal_cost_json field.
This joins the currency and store_price fields together.
Affiliate Window's unique ID for the specific datafeed that any given row belongs to.
The primary product's specifications, represented as a name:value pair, with each specification separated by an asterisk. You can feel free to interpret this field programmatically as it will always remain structured in this way.
* Colour: Gold * SIM Type: Micro SIM * Camera Megapixels: 16 * Camera Flash: LED * Selfie Camera: 2.1 Megapixel, 1080p@30fps * Screen resoution: 1080 x 1920 * Screen size: 5.1" * Screen type: Super AMOLED capacitive touchscreen, 16M colors * Internal memory: 16GB * Memory card slot: microSD, up to 128GB * Processor: 2.5 GHz Quad-core Krait 400 * Chipset: Qualcomm Snapdragon 801 * Cellular support: 2G 3G 4G * Maximum Talk-time: Up to 21 hours * Bluetooth: 4.0 with A2DP, LE, EDR * GPS: A-GPS and GLONASS * Wifi: 802.11 a/b/g/n/ac, dual-band, DLNA, Wi-Fi Direct, Wi-Fi hotspot * Weatherproofing / IP Rating: IP55 & IP58 - Protected against dust, water jets and immersion in water * Weight (grams): 144 * Dimensions: 142 x 72.5 x 8.1 mm * Operating System: Android
- Colour - this is the device's 'marketing' colour, could be any value like "ruby red", "scarlett", "blood red" etc., and is used to construct the product name for marketing/advertising purposes. This field should not be used for grouping or filtering is it isn't distinct enough (use the separate colour field for this instead).
- SIM Type - valid values for this are currently limited to: "Combi SIM" (used for SIM cards only), "Standard SIM", "Nano SIM", "Micro SIM". Note that "Micro SIM" and "Standard SIM" devices can be used with "Combi SIM" SIM Cards.
- Camera Megapixels - The number of megapixels available to the device's primary camera. This field is intended to be used for filtering or grouping products, and so for simplicity rounds up the actual number of megapixels to the nearest 1MP (so a device with 5.2MP would be listed as having 5MP with the exception of devices with less than 1MP where decimal values are allowed). The actual camera resolution in pixels is listed separately in the device_specifications_json field as primary_camera_resolution.
- Camera Flash - The type of Flash available with this device (i.e. None, Xenon, LED, etc.)
- Selfie Camera - Details of the device's secondary or rear-facing camera if available.
- Screen Resolution - The device's primary display resolution in pixels in "W x H" format.
- Display Size - The device's primary display size in inches in X" format where valid values could be decimal, and will always end with a double quote.
- Display Type - A text description of the type of display (like "Super AMOLED", etc.)
- Internal Memory - The amount of internal storage the device ships with. This value can be quite specific, and will end with either "MB" or "GB". Note this differs from the "Capacity" field, which is rounded to the nearest GB and used for grouping/filtering products.
- Memory card slot - The type of memory card slot, and the maximum card capacity (if known).
- Processor - Details of the device's processor (where known).
- Chipset - Details of the device's chipset (where known).
- Cellular Support - Will contain "2G", "3G", "4G" or a combination of those, separated by a space to show whether the device is compatible with those data standards. More detailed information about which frequency bands the device operates on may be available in the device_specifications_json field.
- Maximum Talk-time - Will contain text in the format "Up to x hours". Talk time is always rounded up to the nearest hour for simplicity and to allow for easier filtering/grouping.
- Bluetooth - The bluetooth version number will always be at the beginning of the string and will be a decimal like "2.0", "2.1", "4.2". This will be followed by any text describing the additional/supported Bluetooth features of the device as advertised by the manufacturer.
- GPS - The supported GPS standards of the device.
- Wifi - The supported WiFi standards of the device.
- Weatherproofing / IP Rating - Describes the device's weatherproofing capabilities along with its IP rating where known.
- Weight (grams) - An integer rounded up to the nearest gram describing the device's weight.
- Dimensions - Always in the format "H x W x D mm"
- Operating System - The device's operating system where known (for instance it is unlikely this field would be populated for a USB Modem or Wifi Dongle).
- Not all product types support the above fields. See Specifications and Features availability for more information.
- The above represents the total number of available fields. These will only be displayed where the relevant entry exists for the device being described, so if there's no GPS specification (for instance), you won't see a GPS entry.
Whether the primary device (i.e. not including free gifts) is "new" or "refurbished" (these are the only two valid values and will always appear lowercase). Note that some merchants or brands may prefer to have their products described differently (for instance EE prefer to use "Good as new" to describe refurbished products whereas Apple prefer "Refreshed". Where this is the case, you can find the appropriate brand-friendly representation in the device_features_json field under condition_friendly.
Any promotional text that relates to the deal, should any exist. It is expected that this text would be passed through as is and displayed on site. Often this text describes some important aspect of the deal and so it is important that it is displayed to consumers in order for them to be fully informed and improve both chances of click-through and ultimately conversion.
This field is currently unused.
Note: All new products sold in the UK will have a minimum 1 year warranty and are covered by both EU directive 1999/44/EC (which states that all EU countries have to ensure a retailer could be held liable for all "non-conformities" which manifest within two years from delivery) as well as the UK's SOGA (Sale Of Goods Act).
A small (150x150 pixels) thumbnail image of the primary product being sold.
Note: This image will have a white background. Should you want an image with a transparent background, consider using the alternate_image field instead.
A note about images.
A very small (70x70 pixels) thumbnail image of the primary product being sold.
Note: This image will have a white background. Should you want a (slightly larger 150x150 pixels) thumbnail image with a transparent background, consider using the alternate_image field instead.
A note about images.
The primary product's branding. Note that this could be different from the manufacturer, so for instance a "Google Nexus 6" is branded "Google" but is manufactured by Motorola. Wherever possible we will specify the branding rather than the manufacturer. Similarly the "EE Kestrel" is manufactured by Huawei, but will be branded "EE" in our data.
Affiliate Window's unique ID for this brand
This field contains details of any bundled benefits, gifts or promotions that come with the deal. Note that this is a very simple, asterisk-delimited representation. A significantly more detailed and structured representation of this data is available in the field: deal_extras_json
*BlackBerry Services *O2 Priority *O2 Tracks *O2 TU Go *O2 WiFi Hotspots *O2 Travel
Note: This field will be empty if the network field contains "No Network" and can be ignored.
Boolean - Contains 1 if the the device is available for pre-order only, or 0 if the device has some other stock status (could be in stock or out of stock).
Boolean - Contains 1 if in stock, otherwise 0.
This field will always be set to 1 (you can assume that if it appears in the feed, it's available for sale).
Describes the type of deal (Consumer, Upgrade, Business, etc) to allow appropriate filtering. Currently valid values are described here.
This is the primary product's full name, excluding the manufacturer/branding. You can prefix the brand_name field to this field to construct a full product name.
iPhone 5c White 8GB
Currently the only supported language is 'English'.
This is the date/time the deal described in this row was last imported by our systems.
The primary product's dimensions - always in the format "H x W x D mm". Dimensions are not always available for all product types (SIM Cards being one example). See Specifications and Features availability for more information.
This is the device's "Colour Group". We use this for grouping or filtering, and as such the list of acceptable values here has been reduced to a sensible minimum. You won't find any "ruby red" or "sunset orange" style values here, just "red" and orange".
This data is repeated in the device_features_json field described later in this document, along with a list of valid values.
The colour won't always be available (for SIM Cards, for instance). See Specifications and Features availability for more information.
This field will be populated with the word 'exclusive' in the case of affiliate channel or publisher exclusives.
Contains the retailer logo URL, to be used for linking out to their site or in comparison lists.
Contains the URL for the Retailer's general terms and conditions page. Note that this differs from the Network's terms and conditions page found in network_details_json.
This contains the type of contract being sold to the customer. These values can be used to reliably filter/group tariffs. See tariff_details_json for a list of valid values.
Contains the URL for the primary device's product page on the merchant's website, where available. In most cases, the deeplink URL is better for conversion.
Contains an asterisk-delimited list of cash discounts. These are broken down below:
- "Discount: " - Refers to a discount offered by the retailer (as opposed to a mobile network). Examples include Half Price Line Rental or Free Line Rental for a certain number of months.
- "Network Discount: " - Refers to a discount offered by the Mobile Network themselves. These discounts are usually automatically taken off the customer's monthly bill. Note that a retailer discount and network discount could co-exist in the same deal (this hasn't happened recently, but was the case for a while with Orange deals sold via retailers like mobiles.co.uk).
- "Cashback: " - Really just another type of retailer discount, but generally expressed as a total £ value like "£100 cashback by redemption" or "£325 automatic cashback".
- Greater detail on these discounts is available in a structured format in the fields deal_discounts_json and deal_cashback_json.
- This field should be ignored if the network field contains "No Network"
- The asterisk-delimited structure will exist even when there are no discounts or cashbacks available in the deal. In this case, output would look like this:
Discount: None * Cashback: None * Network Discount: None
Contains the Brand-friendly description for the Data Allowance. In all cases, this field will repeat what you see in inc_data while overriding any content that isn't On-Brand. You can therefore rely on this field for display purposes without having to check both fields, but always use the inc_data field for comparison/sorting/filtering.
Note: This is often a legal/compliance issue and it is thus important that this value is used in your presentation layer when engaging with customers. The underlying data allowance is still contained in the inc_data field and should still be used for comparison/sorting/filtering purposes.
The primary device's thumbnail image, 200x200 pixels with transparent background. A note about images.
The primary device's large image, 400x400 pixels with transparent background. A note about images.
This will contain only basket links. Unlike the aw_deep_link field described earlier, product page links won't be substituted in where basket links are unavailable.
Simple Telco fields
The fields listed above form part of the Affiliate Window "Generic" schema. The fields below, however, are only available if the user elects to enable the additional "Telco" fields, which we highly recommend. The intention is that the fields below will enhance the information available to users of the generic schema without much additional work.
See tariff_details_json for a list of valid values.
The number of months this contract runs for.
Note: This field will contain the length of the handset finance agreement term where the deal is a giffgaff deal. Since giffgaff are a pay-as-you-go network, there's no term associated with the tariff portion of the deal.
Note 2: Some Networks for legal reasons don't advertise "1 month" contracts and instead refer to "30 day" contracts. Any brand-friendly contract length descriptions can be found in the tariff_details_json field under tariff_term_friendly.
See search_price earlier in this document. Far more detailed pricing information is available in deal_cost_json.
This is the deal's total monthly cost. Note that in some cases, the phone and contract are sold separately, with a finance agreement covering the device's monthly cost, and a separate contract governing the services provided by the Network. Details of these 'split' monthly pricing deals (of which O2's Refresh tariffs are one example) can be found in the more detailed deal_cost_json field. In all cases, even where the monthly cost is split, this (month_cost) field will represent the sum of the device and contract monthly costs.
Note: This field will be empty if the network field contains "No Network". Otherwise you can rely on it being populated.
Contains the total number of cross-network, anytime minutes available with this contract. Some or all of these minutes may be eligible for use abroad. Where this is the case it will only be described in the more detailed tariff_allowances_json field described later in this document.
Note: This field will be empty if the network field contains "No Network" or if the tariff type being sold doesn't include a minutes allowance.
Contains the total number of anytime texts available with this contract. Same-network texts are described in tariff_allowances_json
Note: This field will be empty if the network field contains "No Network" or if the tariff type being sold doesn't include a texts allowance.
Contains the total amount of data included in this contract, expressed as a number of megabytes. This excludes any WiFi allowances that might be described in the more detailed tariff_allowances_json field.
Note: This field will be empty if the network field contains "No Network" or if the tariff type being sold doesn't include a data allowance.
IMPORTANT NOTE: This field can be used reliably for sorting/filtering/grouping, but please refer to the custom6 field for the Brand-friendly description of any data allowances included in this deal. This can be important for legal/compliance reasons and so should not be skipped.
Describes the fastest 'speed' at which the contract will allow the customer to access data services. Currently available values are:
- "4G Double-Speed"
- This field describes the service being purchased, not the device's capabilities. Device capabilities are described in detail in device_specifications_json and contract details can be found in tariff_allowances_json
- This field will be empty if the network field contains "No Network" or if the tariff type being sold doesn't include a data allowance.
A short text description of the Network contract being sold.
Note: This field should be ignored if the network field contains "No Network"
Describes the primary device's storage capacity rounded to the nearest GB. This field is intended to be used for filtering/grouping similar products and may not be available in all cases. See Specifications and Features availability for more information.
The Mobile Network Operator's brand name. Will be set to "No Network" in the case of products not sold with a contract.
The primary device's operating system, where known (USB Modems for instance are unlikely to have an Operating System listed). See Specifications and Features availability for more information.
JSON Telco fields
These fields should be used in preference to the others described earlier in this document wherever possible. Through a more complex structure we are able to more accurately represent the industry's available deals and so better communicate them to customers, leading to improved conversion.
Note: The following (default / generic) fields should be downloaded alongside all the below fields as they aren't duplicated here:
Note: Not all the fields described below contain JSON, though they are listed here as they are expected to be used alongside the JSON fields. JSON-containing fields can be identified in create-a-feed by the presence of a _json field-name suffix.
The "product" sits at the highest level of our product tree, and describes a conceptual product like an "iPhone" or a "Galaxy" phone. It belongs to a manufacturer/brand, and has a product type. Using the product_id you can group all "Galaxy" products together or all "iPhone" products together (for example).
Example (Nokia Lumia 735 Black):
- product_id - simple integer
- product_name - text name, for example "Galaxy".
- product_brand - The primary product's branding. Note that this could be different from the manufacturer, so for instance a "Google Nexus 6" is branded "Google" but is manufactured by Motorola. Wherever possible we will specify the branding rather than the manufacturer. Similarly the "EE Kestrel" is manufactured by Huawei, but will be branded "EE" in our data.
- product_brand_id - The brand ID is unique and will persist even if a brand name changes (for instance RIM recently changed to BlackBerry)
- product_type - See below for valid values.
- product_type_id - See below for valid values. These IDs are unique and persist even if a product type's name changes. Note that new product types will be added over time and documented here.
Current product_type values
- 1 - Mobile Phone
- 2 - SIM Card
- 3 - Tablet
- 4 - USB Modem
- 5 - Laptop
- 6 - Mobile Wi-Fi
- 7 - Game Console
- 8 - Smartwatch
- 9 - Television
- 10 - Wearable
- 11 - Case
- 12 - Headphones
- 13 - Software
- 14 - Camera
- 15 - Media Streamers & Players
- 16 - Charging, Docks & Stands
- 17 - Personal Grooming
- 18 - Input Devices
- 19 - Toys & Gadgets
- 20 - Speakers
- 21 - VR Headsets
The product_name can be appended to the product_brand to arrive at a more complete product name: product_brand + product_name = "Apple iPhone".
The "product version" sits below the "product" in the product hierarchy and describes at a reasonably high level the product in the range. Examples would be (Apple iPhone) "5s" or (Samsung Galaxy) "S4". Using the product_version_id, all the different colours and capacities of Samsung Galaxy S4 could be grouped together, or we can filter on just Apple iPhone 5C, and see all the colours and capacities that are available.
Example (Nokia Lumia 735 Black):
- product_version_id - simple integer
- product_version_name - text name, for example "S4". This can be empty in cases where the device_product_json.product_name field sufficiently describes the product (so, there probably aren't multiple versions of this product as is the case with iPhones).
The product_version_name can be appended to product_name and product_brand to arrive at the complete product version name: product_brand + product_name + product_version_name = "Apple iPhone 5S".
The "product edition" is the lowest level of the product hierarchy and describes a specific product being sold. Examples would be (Apple iPhone 5S) "16GB White" or (Samsung Galaxy S4) "32GB Blue". The product edition ID is therefore unique to each specific product unlike the product_version_id and product_id.
Example (Nokia Lumia 735 Black):
- product_edition_id - simple integer
- product_edition_name - text name, for example "16GB White". This can be empty in cases where the device_product_json.product_name and/or device_product_version_json.product_version_name fields adequately describe the product (so there probably aren't multiple editions (colours, capacities, etc.) of this product, as there are with iPhones).
- reseller_product_edition_id - simple integer that uniquely identifies this product at a reseller level (for instance there might be one reseller_product_edition_id for a New product, and another for Refurbished models). No two resellers will ever share reseller_product_edition_ids, but they will share Product_id, product_version_id, and product_edition_ids.
Note that in practice, the capacity and colour will act as the defining features of this edition (separating it from other editions under the same product_version), but in future other defining features could emerge. Note also that the capacity and colour are described in a structured way in the device_features_json field so there is no need to parse the product_edition_name field.
The full product name can be derived by using the product_brand, product_name, product_version_name and product_edition_name together: e.g. "Apple iPhone 5S 16GB White", though this has been provided in the next field.
Should always be the same as adding together product_brand, product_name, product_version_name and product_edition_name.
The primary product's product description. In all cases where the network_details_json.company_id field is not "76" (i.e. a telco product sold on contract), this description should be fully populated. Developers should not assume the existence of a complete description under other circumstances.
- primary_thumb - thumbnail image
- primary_large - large image
More image types could be added in future. A note about images.
This field contains product attributes that can be used for filtering and grouping of products.
- colour - This is the device's 'marketing colour' (see notes in the 'specifications' field described earlier in this document). It is unlikely to be generic enough to use for filtering or grouping but could be used as a secondary filter if needed.
- colour_group - used for filtering/grouping. The list of acceptable values here has been reduced to a sensible minimum. You won't find any "ruby red" or "sunset orange" style values here, just "red" and orange". A list of valid values is provided below.
- max_data_standard - The device's maximum available data standard. Valid values are "2G", "3G", "4G" and "5G". Note that this does not relate to the Network or tariff being purchased (as in, it's entirely possible to buy a 3G contract for a 4G device). The contract's data standard is described in tariff_allowances_json under cellular_speed.
- condition - Is either "New" or "Refurbished" and should be used for grouping/filtering.
- condition_friendly - This should be displayed on your page in place of "New" or "Refurbished" and represents the merchant or Network's preferred wording (for instance EE prefer "Good As New" instead of "Refurbished"). In some cases there could be legal implications, so condition_friendly should be displayed in place of condition wherever possible. Note that where no 'friendly' description is available, the standard description is passed through in its place.
- sim_type - valid values for this are currently limited to: "Combi SIM" (used for SIM cards only), "Standard SIM", "Nano SIM", "Micro SIM". Note that "Micro SIM" and "Standard SIM" devices can be used with "Combi SIM" SIM Cards.
- capacity - The device's internal storage rounded up or down to the nearest GB (in line with the product's marketing, where possible).
- os - The device's operating system, where known. Valid values are currently: "Android", "Apple iOS", "Badu", "BlackBerry", "N/A", "Proprietary", "Tizen", "Windows". Note that this list will grow over time.
- megapixels - text describing the number of megapixels the device's camera has available. Note that older cameras can show as having a decimal value of less than 1 megapixel ("0.3" is VGA, for example), but all newer cameras will be rounded to the nearest megapixel. If no camera is available, this field will contain the text 'None'.
Note that unless marked otherwise with above, the values can be empty for product types where the feature does not apply (for instance Televisions don't have a SIM Card Type), and as a result the key may not appear. See Specifications and Features availability for more information.
Valid colour_group values
- Rose Gold
It is expected that specifications will not be used for filtering or grouping, in particular because many of the specifications are free text fields, however where values are likely to be consistent, this has been indicated below.
Note that many of the fields below have already been described here and so aren't repeated below. Those fields that are unique to the JSON representation have been described.
Note: While the device_specifications_json field will exist in all cases, the values for the sub-fields could still be empty. Where this is the case, the key will not be included. This is because not all specification types apply to all products. See Specifications and Features availability for more information.
General details of the Mobile Network Operator with whom the customer will have a contract.
- name - Name of the Network
- company_id - The unique ID of this company. This could be the same as the retailer ID where the Network and the Reseller are the same (for instance O2 direct).
- logo_url - The URL containing the Network's logo for use in comparison lists or outbound links
- coverage_url - The Network's coverage checker URL. Note that this is not always available for MVNOs.
- terms_url - The Network's general terms and conditions URL. Note that this could be different from the retailer's own terms and conditions URL (see deal_retailer_json for this). Where a customer is buying a Network's products from a Retailer, the Retailer's terms are more likely to be of use to the customer.
- description - A short description of the network and its primary benefits.
Note: In cases where the product does not belong to a Network (i.e. is SIM-Free or not a cellular device), the name ("No Network") and company_id ("76") values will be populated consistently but the other values can be blank. See also Skipping fields based on network_details_json.
Tariffs are often grouped by the networks. The tariff group allows for filtering/grouping of tariffs. Similar tariffs often have the same benefits, call charges etc. See also Displaying tariff information.
- tariff_group_id - simple integer, can be used to group similar tariffs together.
- tariff_group_description - a description of the tariff and its benefits.
- tariff_group_promo_info - should there be any promotional information to display, it will be contained here. Note that it is important to display promotional information when it is available as it could materially affect the product the customer is purchasing. This field can (and often will) be empty.
Note: In cases where the product is sold without a contract (as in the case of SIM-Free phones, or some wearable devices), the tariff_group_description field can be empty. In all other cases it should be populated. Where the product is sold without a contract, you should find that network_details_json.company_id is set to "76". See also Skipping fields based on network_details_json.
Contains details of the specific tariff being purchased. See also Displaying tariff information.
- tariff_id - can be used to link the same tariff across multiple handsets or even retailers (An O2 Big Bundle sold by O2 will have the same ID as an O2 Big Bundle sold by mobiles.co.uk)
- tariff_name - describes the tariff being sold
- tariff_type_id - See below for valid values.
- tariff_type - This contains the type of contract being sold to the customer (also repeated in custom3).
- tariff_term - integer - the number of months the customer is tied into a contract with the network.
- tariff_term_friendly - the network's preferred wording for the contract length. In some cases Networks will legally have to refer to 1 month contracts as "30 day" (since not all months have the same number of days). Wherever a 'friendly' contract length is provided, this should be displayed on-site, with the "tariff_term" field used only for filtering/sorting/grouping. Where this field is empty, you should use the tariff_term field instead.
- tariff_promo_info - should there be any promotional information to display, it will be contained here. Note that it is important to display promotional information when it is available as it could materially affect the product the customer is purchasing. This field can (and often will) be empty.
Valid values for tariff_type_id and tariff_type
- 1 - "Mobile Broadband Contract" - A contract that usually only includes a data allowance.
- 2 - "Mobile Broadband Pre-pay" - A pay-as-you-go deal with no contractual commitment intended for use with MBB devices.
- 4 - "Phone Contract" - A contract that usually includes minutes, texts and data.
- 5 - "Phone Pre-pay" - A pay-as-you-go deal with no contractual commitment intended for use with phones.
- 11 - "SIM/Contract Free"
- To determine whether or not the device comes with a contract you can check for the presence of "11" in tariff_details_json.tariff_type_id or "76" in network_details_json.company_id. See also Skipping fields based on network_details_json.
- The tariff_type_id gives no indication of whether the deal is a "SIM Only" type deal (i.e. without a device included). In order to determine whether the deal comes with or without a device, check the device_product_json.product_type_id field for a value of 2 (SIM Card). More information can be found here.
Contains details of all the allowances that come with this tariff. See also Displaying tariff information.
- cross_net_anytime - integer - number of Cross-Network Anytime minutes
- cross_net_anytime_qualifier - "UK" or "Roaming See Terms". Clarifies whether any international minutes are included.
- same_net_anytime - integer - number of Same-Network minutes (if any)
- special_numbers_see_terms - integer - number of special number minutes included in the allowance (like access to 0800 or 0808 numbers).
- landline - integer - number of landline minutes included
- cross_net_anytime - integer - number of Cross-Network Anytime texts included
- same_net_anytime - integer - number of Same-Network Anytime texts included
- wifi_mb - Amount of wifi data included in the plan in MB (note that sometimes unlimited wifi is included as a benefit of being on the network or under certain circumstances like on the london underground. This won't be represented here, but instead will be shown in deal_extras_json.)
- cellular_mb - amount of data allowance included in MB
- cellular_speed - the speed at which the contract can operate. See connectivity described earlier in this document for valid values.
- All these fields are optional, and depend on the type of contract tied to the deal (if any). To determine whether or not it's worth your code checking through this field, you can look for the presence of "11" in tariff_details_json.tariff_type_id or "76" in network_details_json.company_id. See also Skipping fields based on network_details_json.
- Wherever the product *does* come with a contract, you should find data in these fields, though exactly which ones are populated will depend on the type of contract (for instance Mobile Broadband deals don't come with minutes and texts). In most cases, it is best for your page to 'fail gracefully' - i.e. intelligently show or hide fields based on the presence of a value.
- In many cases Pay-as-you-go tariffs can have inclusive minutes/texts/data/etc. when purchased with an appropriate topup, so it's best not to rely on assumptions about contract types (related to the above point).
Contains details of pence-per-minute or pence-per-MB style charges when the customer uses up all their inclusive allowances (or where there's no inclusive allowance). See also .
- pence_per_cross_net_min - integer
- pence_per_cross_net_text - integer
- pence_per_mb - integer
- data_charge_text - text - occasionally networks don't charge per MB (sometimes a flat rate per day, for instance). Where that's the case this field will be populated and the pence_per_mb field will likely be empty.
- pence_per_voicemail_min - integer
- All these fields are optional, and depend on the type of contract tied to the deal (if any). To determine whether or not it's worth your code checking through this field, you can look for the presence of "11" in tariff_details_json.tariff_type_id or "76" in network_details_json.company_id. See also Skipping fields based on network_details_json.
- Wherever the product *does* come with a contract, you should find data in these fields, though exactly which ones are populated will depend on the type of contract (for instance Mobile Broadband deals don't come with minutes and texts, so won't have associated call charges). In most cases, it is best for your page to 'fail gracefully' - i.e. intelligently show or hide fields based on the presence of a value.
Describes the type of sale to allow appropriate filtering. Valid values are currently limited to:
- deal_type_id - The ID of the deal type. This won't change so can be relied upon for filtering/grouping over time.
- deal_type_name - The name of the deal type.
Currently valid values for deal_type_id and deal_type_name
- 0 - "Consumer" - default. Note that Consumer deals don't necessarily exclude business customers, but they will be billed inclusive of VAT.
- 1 - "Consumer Upgrade" - as above, but limited to customers who already have a qualifying product from the Network this deal applies to. The most obvious example is a customer who already has an O2 mobile phone contract, and would like to buy another O2 contract, but upgrade their handset at the same time, keeping their number.
- 2 - "Consumer Existing Customer" - Unlike above, the customer might have a non-mobile contract (like broadband or TV). These "existing customer" deals provide favourable pricing for customers who already purchase some other service from the Network in question. Current examples include Virgin Mobile (who sell discounted mobile products to their existing Broadband/TV customers) and TalkTalk whose mobile products are ONLY available to their existing customers.
- 3 - "Business" - Available to business customers only. Prices should be represented as ex. VAT wherever possible (or clearly marked as including VAT).
JSON-Only: Currently valid values for deal_type_id and deal_type_name
- 7 - "Consumer - Affiliate Price" - Special affiliate price. You will also see 'exclusive' in the keywords field, and "Consumer" in the product_type field.
- 8 - "Consumer Existing Customer - Affiliate Price" - As above, but for existing customers. You will also see 'exclusive' in the keywords field, and "Consumer Existing Customer" in the product_type field.
- 9 - "Consumer - Publisher Exclusive" - This will only appear if you have agreed an exclusive with the advertiser. You will also see 'exclusive' in the keywords field, and "Consumer" in the product_type field.
- 10 - "Consumer Existing Customer - Publisher Exclusive" - As above but for existing customers. You will also see 'exclusive' in the keywords field, and "Consumer Existing Customer" in the product_type field.
This field may (it's not always populated) contain text that should be passed through unaltered and displayed on your web page. The text usually contains legally required information relating to the package being sold. See also Displaying tariff information.
From 2015, Airtime Plan prices will be adjusted on your April bill by RPI rate of inflation announced in the preceding February. Phone Plan on 0% APR Representative, 24 month consumer credit agreement, subject to status and credit check. 18+
See also Displaying tariff information.
Should the deal have any promotional information tied to it, this will be displayed here. The text should be passed through unaltered where possible as it could contain important information about the customer's deal.
Extras are split into high-level Groups (like "Free Gifts", or "Discounts & Loyalty", for instance), and within those groups Extras are further sub-categorised into Source Types. Everything is given a consistent ID and so Groups and Types can be grouped/filtered as required within your code. See also Displaying tariff information.
- groups - This is the top level - beneath this are the Extra Groups, represented as an array. Each Extra Group is contextually different, and their purposes are discussed below, though their structure is consistent.
- id - The Extra Group Type ID. This is consistent and can be used for grouping in your code (see the list of "Extra Group Types" and their corresponding IDs below)
- text - The Group's text description acts as a key. The value for this field is an array of Extra Source Types and their details. Source Types allow us to subcategorise Extras. Note that a Source Type can appear under more than one Group (for instance, allowances could be part of an inclusive service and/or a loyalty reward.)
- id - The ID of the Source Type. This is consistent and can be used for grouping in your code. Note that an ID of 1 means the Source Type is an Allowance (data/texts/minutes), and an ID of 2 means the Source Type is a Product (most usually applies to free gifts). An ID that begins 255 is 'something else' - this is used for most other 'soft' benefits like additional services or rewards.
- text - The Source Type's text description acts as a key. The value for this field is an array of Extras belonging to that Source Type.
- id - The Extra's unique ID. This will never change, and if you're storing it, you could avoid re-absorbing the details of the extra next time you pull in the feed.
- groupingId - This ID allows you to group similar Extras. In the example above, both "O2 Priority" and "O2 Tracks" have a groupingId of "M4", as they're both part of the "Entertainment freebies and discounts" Source Type. (see interpreting the groupingId)
- title - a short title for the service/product being included
- suffix - In some cases, an Extra will be time limited or there may be other exclusions that clarify important details. These will often be included in the suffix field.
- desc - A short paragraph describing the product or service being included. We recommend having this available as a popup/mouseover or expander where it's populated (it should be in the majority of cases). The field could have escaped line breaks, so you should check for these and handle them appropriately.
- cost - the cost of the item, if chargeable. This field will only appear where a cost exists.
- cost_type - can be "Fixed" (a one-off payment) or "Monthly". This field will only appear where a cost exists.
- img_url - an image URL, where available. This is currently only implemented where the source type ID is 2 ("Product"). A note about images.
Extra Group Types:
- 1 - Free Gifts - Contains details of any physical goods included as part of the deal, for instance free televisions, games consoles or boxed software that the customer owns without limitation. Time-limited software (like "Free Evernote Premium for a year") is considered a free service, and included in "Inclusive Services" (below) instead.
- 2 - Inclusive Services - Contains details of services or allowances that are included as part of the deal at no extra cost to the customer. Current examples include "Extra 750MB Wifi for the first 3 months", "BlackBerry services", "Tethering", and "6 months free Netflix".
- 3 - Discounts & Loyalty - Contains details of rewards or discounts linked (perhaps loosely) to customer loyalty. Examples include Tesco Clubcard points, charity donations on the customer's behalf or trade-in discounts for existing customers.
- 4 - Comes with (chargeable) - Contains details of additional products or services that are a mandatory part of the overall deal but for which the price charged isn't reflected in the upfront price. In all current examples this is limited to Top-ups for PAYG devices but there may well be different types in future. This is arguably a hangover from the days when a phone could be purchased (from a bricks-and-mortar shop) with a larger Top-up if required and so the price of the Top-up was excluded from the advertised price, but this doesn't actually happen on the web. You might consider just rolling the cost of the topup into the upfront price, though this risks making the deal look less attractive.
- 6 - Bundled products - Contains details of any bundled products or services that make up the Deal. The most obvious current examples are EE's Sharer deals that contain two products and two tariffs intended to be shared amongst the devices.
Example Source Types:
- 1 - "Allowance" - A minutes, texts or data allowance (see interpreting the groupingId)
- 2 - "Product" - A physical product (see interpreting the groupingId)
- 255-1 - Gift Voucher
- 255-2 - Pay as you go Top-up
- 255-3 - Service Attributes
- 255-4 - Entertainment freebies and discounts
- 255-5 - Enhanced customer service
- 255-7 - Rewards Points
- 255-10 - Calls to special numbers
- 255-11 - Roaming services
- 255-16 - Trade-in Discounts
- 255-17 - Charity Donations
- 255-18 - Phone backup and protection services
- 255-19 - Commitments and Guarantees
- 255-23 - Free or discounted allowances
- 255-25 - Free or discounted software
- 255-26 - Free Gift
- 255-27 - VOIP Services
- 255-28 - Separate Call & Device Contract
Interpreting the groupingId:
- Where the Source Type ID is 2 ("Product"), the groupingId will begin with a "P" followed by an integer (e.g. "P1234"). The integer refers to a product_edition_id, and will therefore be consistent across deals and resellers. It can be used to safely group all deals across all resellers who include (for instance) a Playstation 3.
- Where the Source Type ID is 1 ("Allowance"), the groupingId will begin with an "A" followed by an integer (e.g. "A1234"). The integer refers to an allowance type ID. This allows you to group or filter on all deals that come with additional Text allowances or Data allowances (for instance).
- Where the Source Type ID begins 255, the groupingId will begin with an "M" followed by an integer (e.g. "M43"). This allows you to group or filter on all deals that come with (for instance) "Trade-in Discounts", "Enhanced customer service" or "Entertainment Freebies and Discounts". See the list of example Source Types above. In the case of Source Types beginning 255, the Source Type ID is as useful for grouping as the groupingId.
Allowance type IDs:
- 1 - Talk Time
- 2 - Texts
- 3 - Data
- Additional Group Types may be added in future. When they are, they will be documented here.
- The list of Source Types will grow and change over time as new services and types of service are brought to market. It's therefore best to build your list of Source Types based on the contents of the data feed rather than the list above, which is provided as an example only.
Contains details of the merchant (retailer) selling the deal. Note that this can be different from the Network the deal is being sold on.
- name - The Retailer's trading name
- company_id - The company's unique ID. Where this is the same as the network_details_json.company_id, the deal is being sold direct by the Network.
- logo_url - The URL for the Retailer's logo to be used in comparison lists and outbound links
- terms_url - The URL for the Retailers terms and conditions of sale.
Contains details of the deal's pricing both including and excluding VAT. Including VAT prices should be shown for consumer deals, whereas convention dictates that business-only deals be sold at exc. VAT prices. We have included both in case you need to mix and match business and consumer deals in the same list.
See Understanding Pricing for more information.
- upfront_inc_vat - The deal's total upfront cost including VAT
- upfront_exc_vat - The deal's total upfront cost excluding VAT (for business-customer deals)
- upfront_previous_inc_vat - Where this deal has previously been sold at another price, that price will be listed here.
- upfront_previous_exc_vat - As above but excluding VAT (for business-customer deals)
- monthly_total_inc_vat - The deal's monthly total cost (note this field will contain the sum of the phone monthly cost and contract monthly cost where these are expressed separately, as is the case with O2 Refresh products.)
- monthly_total_exc_vat - As above, but excluding VAT (for business-customer deals)
- monthly_total_previous_inc_vat - Where this deal has previously been sold at another monthly price, that price will be listed here.
- monthly_total_previous_exc_vat - As above, but excluding VAT (for business-customer deals)
- monthly_device_inc_vat - the monthly price of the device portion of the monthly cost. This will be populated only where the device is being sold separately from the tariff (e.g. Giffgaff handsets, Tesco Mobile, O2 Refresh).
- monthly_device_exc_vat - As above, but excluding VAT (for business-customer deals)
- monthly_device_term_months - in most cases the contract term for the device will be the same as for the contract, but not in all cases. In the case of giffgaff it is possible to purchase the handset over a different term from the contract (all giffgaff deals are in fact Pay-as-you-go). In all cases, this field should be checked to ensure the customer is given the correct information.
- monthly_device_final_term_inc_vat - the monthly price of the final term of the device finance contract. Currently only used by Sky Mobile, and tends to be a reduced line rental for the final few months of the device contract.
- monthly_device_final_term_exc_vat - As above, but excluding VAT (for business-customer deals)
- monthly_device_final_term_months - this is the number of months that the 'final term' lasts. If populated, this 'final term' will often feature a reduced line rental or some other changes to the way the device is financed.
- monthly_contract_inc_vat - the monthly price of the tariff portion of the monthly cost. This will be populated only where the device is being sold separately from the tariff.
- monthly_contract_exc_vat - As above, but excluding VAT (for business-customer deals)
- monthly_contract_term_months - the contract term for the tariff.
- ecpm_inc_vat - effective cost per month - the effective total monthly cost after taking into account all payments over the course of the contract and any upfront cost. Note that discounts and free gifts are not included in this calculation.
- ecpm_exc_vat - As above, but excluding VAT (for business-customer deals)
- tco_inc_vat - total cost of ownership - the total cost over the course of the contract including any upfront cost. Note that discounts and free gifts are not included in this calculation.
- tco_exc_vat - As above, but excluding VAT (for business-customer deals)
- Where the product is not being sold with a contract (check for "76" in network_details_json.company_id), any _monthly fields should be ignored. See also Skipping fields based on network_details_json.
- Any _previous fields can be empty where no previous price exists.
- monthly_contract_ and monthly_device_ fields will be empty where the contract isn't a split-price deal.
Details the discounts available with this deal, split into network and retailer discounts (the two can co-exist). A retailer discount is often supplied on a redemption (customer must claim) or automatic (sent in the post after x days) basis, and payment will usually arrive by cheque or bank transfer. By contrast a network discount is usually discounted at source, and so the customer will see the discount applied to their monthly bill.
See implementation tips on filtering/grouping. See also comparing with Cashbacks.
- nd_reduction_type_id - The type of discount being described
- nd_payment_type_id - whether the discount is applied automatically or has to be claimed by redemption
- nd_requires_promo_code - boolean - whether this discount requires a promo code to be entered in the basket by the customer in order to be activated.
- nd_value - The value of the promotion (whether a percentage or pence value). This field can only be interpreted in the context of the reduction_type_id (see "Discount types" below).
- nd_duration_in_months - the number of months that the promotional price applies
- nd_description - a description for the discount, like "Pay only 50% for 3 months (automatic)"
- rd_reduction_type_id - the type of discount being described
- rd_payment_type_id - whether the discount is applied automatically or has to be claimed by redemption
- rd_requires_promo_code - boolean - whether this discount requires a promo code to be entered in the basket by the customer in order to be activated (this is very rare for retailer discounts).
- rd_value - The value of the promotion (whether a fixed price or discount). This field can only be interpreted in the context of the reduction_type_id (see "Discount types" below).
- rd_duration_in_months - the number of months that the promotional price applies
- rd_description - a description for the discount, like "Pay only £8.50 for 22 months (by redemption)"
Discount types (used in the above nd_reduction_type_id and rd_reduction_type_id fields):
- 1 - Fixed price (for instance, Pay only £20/month - the _value field will contain the monthly price in pence)
- 2 - Fixed reduction (for instance, £20 off per month - the _value field will contain the monthly discount in pence)
- 4 - Pay percentage (for instance, pay only 50% each month - the _value field will contain the percentage of the monthly price to be paid by the customer)
- 8 - Percentage reduction (for instance, 25% off each month - the _value field will contain the percentage discount)
Payment types (used in the above nd_payment_type_id and rd_payment_type_id fields):
- 32 - By redemption
- 64 - Automatic payment
- Where a promotion code is required to support any given discount, this will be described in the fields: tariff_group_details_json.tariff_group_promo_info, tariff_details_json.tariff_promo_info or deal_promo_info. It is important therefore that all these fields can be passed through unaltered and presented on-site in order to support merchant promotional activity. Whether the promo info is stored at the tariff group, tariff, or deal level depends on to what extent this promotion is shared among other deals offered by the merchant.
- Empty entries will be excluded, so if there are no discounts of any sort, this field could be empty.
See implementation tips on filtering/grouping and comparing with Discounts.
- id - the unique ID for this cashback (combines type and value)
- type_id - the unique ID for the type of cashback. Valid values are 1 (redemption) and 2 (automatic)
- type_name - the text description for the above ID.
- value - the amount of cashback being offered, like "200.00"
Note: This field will be empty where no cashbacks are available for this deal.
These implementation tips can be used in conjunction with wireframes (here for PAYG and here for PAYM) that demonstrate the relative importance of various data elements through the use of colour and positioning.
Grouping and Filtering Devices
Should you wish to focus purely on the hardware, the merchant_category (generic) or device_product_json (JSON) fields provide basic product type categorisation, with the JSON fields in general providing a more reliable ID-based approach.
In many cases however, it's likely that you will want to also filter based on the type of contract (pay as you go, mobile broadband, sim only, etc.), as well as deal type (consumer, existing customer, upgrade, business, etc.) linked to the device in order to ensure the customer doesn't end up looking at a device only available on a type of contract they aren't interested in.
For deal type, check out the product_type (generic) or deal_type_json (JSON) fields, and details of the contract type are available in custom3 (generic) and tariff_details_json (JSON).
Sorting and Filtering Discounts
Discounts (whether network or retailer discounts) are represented identically aside from field naming. This means that both types of discount can be stored internally in the same table, with just a marker denoting whether the discount is a retailer or network discount. This should make filtering far easier.
The nd_reduction_type_id and rd_reduction_type_id fields described here can be used to group deals by the type of discount being offered, or perhaps more usefully, the fields can be used in combination with the _value and _duration_in_months fields to calculate the total discount available and use this derived value as a means of sorting the results (or comparing against Cashbacks - see "Filtering and Grouping Cashbacks" below).
Using the _payment_type_id field, developers can group deals according to whether or not the customer is required to redeem the discount, or whether it is automatically applied. In many cases customers will prefer to opt for an automatically applied discount.
Filtering and Grouping Cashbacks
Cashbacks are really just a simpler type of discount where the amount of discount is expressed as a total discount available. This means Cashbacks can be compared directly against Discounts in two ways:
- Compare Cashback value with the derived total Discount mentioned in "Sorting and Filtering Discounts" above.
- Compare claim method (automatic / redemption) in the Cashback type_id field against the claim method stored in a Discount's _payment_type_id field.
Many will be used to the idea of pricing in the Telco vertical being split into an upfront cost (a deposit of sorts on the hardware, assuming we aren't dealing with a SIM-only deal) and a monthly cost that covers the service/allowances being purchased but also subsidises the cost of the device.
While the above approach still exists, there are now more complex pricing structures being adopted that not only have a bearing on the data now made available via datafeeds but also on how pricing is displayed on the web. In many cases there can be legal requirements that have to be met (such as displaying information about RPI-linked price increases or credit agreements) and pricing is now increasingly represented as one price for the service, and another for the handset or device. Additionally the contract term for the device and service can be different (so for instance Giffgaff offer 30 day topups, and hire purchase agreements for the device of up to 24 months)
When should I use ex. VAT pricing?
If the deal is a Business deal (product_type (generic) or deal_type_json (JSON) fields), then you should use ex. VAT pricing wherever possible. It is acceptable to use inc. VAT pricing in circumstances where Consumer and Business deals are being compared but you should indicate clearly that the customer will be charged Ex. VAT when it comes to payment.
How will I know when to show separate monthly prices for devices and tariff?
For comparison / sorting / filtering purposes you can safely just use the upfront_inc_vat / upfront_exc_vat and monthly_total_inc_vat / monthly_total_exc_vat fields. It's only when it comes to displaying pricing for the deals in question that you need to worry about any split.
Identifying a deal where the price has been split is straightforward - if monthly_device_inc_vat / monthly_device_exc_vat is populated, then we're dealing with a split-pricing deal. Remember that the contract length for the device (monthly_device_term_months) can be different from the contract length for the service/tariff (monthly_contract_term_months), so you'll need to ensure these are properly represented on the page along with the legal text if populated.
I'm not using the JSON fields. How can I implement split-pricing?
This is currently unsupported. Split pricing information is only available here. Even if you aren't able to use JSON natively in your code, it may be possible to extract the required values using some simple regular expressions, though the exact method will depend on your programming language of choice.
Displaying tariff information
Note that this section assumes the use of JSON fields. When displaying a deal, the following should be considered:
A note about images
We attempt to ensure that images are provided in all cases however there are some situations beyond our control (for instance early product pre-orders) that mean images won't always be available. Where that's the case we will always provide a placeholder image so your import code won't throw errors and your web page won't contain any broken image links. As soon as we are able to get hold of the relevant image, the feed will be updated to include it.
In total there are six styles of image available, listed below:
- merchant_image_url - white background, 400x400 pixels, PNG
- aw_image_url - white background, 200x200 pixels, JPEG
- merchant_thumb_url - white background, 150x150 pixels, PNG
- aw_thumb_url - white background, 70x70 pixels, JPEG
- large_image - transparent background, 400x400 pixels, PNG
- alternate_image - transparent background, 150x150 pixels, PNG
Note: The large_image and alternate_image data is repeated in the device_images_json field.
Handling feed updates efficiently (JSON only)
Since the JSON fields are structured and include IDs wherever possible, we can rely on them to efficiently update the feed whenever it is imported. Rather than overwriting everything in your local database each time you import a row of the CSV you can check each ID just once, and then ignore any further occurrences of it in the feed.
For a super-quick import you can even just check *some* of the fields as described below, though you risk not picking up on corrections to previously faulty data (human errors will always happen). If you do want to use this approach we recommend that you perform a more complete update once every couple of days or so.
Bare minimum field value updates
During each feed import run, assuming the IDs (and previously imported data) for the below already exist in your database:
- merchant_product_id - Since this is unique to a specific combination of product, service and any extras, you need only check:
- tariff_group_details_json.tariff_group_id - Check the first occurrence of each tariff_group_id for the following:
- tariff_details_json.tariff_id - Check the first occurrence of each tariff_id for the following:
- device_product_json - can be skipped entirely if the product_id and related data have previously been collected.
- device_product_version_json - as above.
- device_product_edition_json - as above. Additionally, the following can be skipped, as they relate to the product edition and will change very rarely:
- network_details_json - can be skipped entirely if the company_id (in the context of a Network, because details might be less complete when the company is presented as a retailer) and related data have previously been collected.
- deal_retailer_json - can be skipped entirely if the company_id and related data have previously been collected (whether as a network or a retailer)
- deal_discounts_json - can be skipped entirely if the nd_id or rd_id have been encountered previously (not just in this feed run, in any).
- deal_cashback_json - can be skipped entirely if the id has been encountered previously (in any feed run).
Skipping fields based on network_details_json
Where the network_details_json.company_id is "76", we're dealing with a product that comes without a contract. Therefore we can skip the following fields, which will be unused in this context:
Specifications and Features availability
In all cases where the product is a "Mobile Phone" (device_product.product_type_id = "1"), all of the fields mentioned below should be populated.
Where the product type is not a Mobile Phone, you should check each field carefully for a value without assuming they will always be available.