Appearance
Bing Merchant Center
Logidav builds menzzo.fr offers directly from ERP data and uploads them to Microsoft's SFTP server. Bing owns its copied France selection, product, label and manual-override rules. Google profile 9525921 is the implementation reference; no Google integration class, credential, constant or scheduled job is required at runtime.
Product rules
France store 3, French language, France market and EUR prices. Stable offer IDs use the France product-info feed ID. Eligible products retain the reference's active/non-new/source, effective visibility, merchant inclusion, supplier, manufacturer and France product-info restrictions. Unavailable offers remain selected.
The five custom labels retain category, subcategory fallback, manufacturer, sales-group/new/nosell precedence and merchant availability. Null manual values preserve automatic labels; empty strings clear them; other values replace them. Bing generates labels in memory and does not write global product label columns.
Actual availability uses the copied availability-date rule: numeric dates at or before today are in stock; future, end-of-life and nonnumeric values are out of stock. There is no additional quantity check or automatic preorder submission. The availability field is independent of customLabel4.
Configuration and connection
Logidav uploads a Google-format RSS/XML file directly to Microsoft SFTP. The format does not create a dependency on Google services. API/OAuth commands, developer tokens, client IDs, client secrets and customer IDs are no longer used.
Create a dedicated primary feed for France/French/EUR in the existing Microsoft store, select FTP/SFTP upload, and set its filename to menzzo-fr (without the extension in Microsoft's settings). Only this job should write that feed. Confirm the store/feed is empty before first activation; SFTP cannot enumerate store offers or validate catalog settings. The server shown in this account is sftp.ads.microsoft.com, port 19321.
Provision this complete block in ignored app/config/parameters.yml through the existing deployment flow before container compilation/cache warmup. The tracked example remains disabled. Do not add a bundle parameters file or import.
yaml
parameters:
bing_merchant:
enabled: false
host: 'sftp.ads.microsoft.com'
port: 19321
username: ''
password: ''
host_key: ''
filename: 'menzzo-fr.xml'Use the store's SFTP username/password. host_key is the verified SSH public host key (key-type base64-key); obtain it from a trusted Microsoft source or verify the server fingerprint independently before provisioning it. The uploader checks it before sending credentials. Never place secrets in Git or command arguments. filename must match the dedicated Microsoft feed. Logidav automatically creates var/exports/bingads under the project directory. The cron user needs write access to var/exports. Generated XML files are deleted after every attempt, including failed uploads and previews. The lock and feed.json manifest remain in this folder; preserve them across deployments and exclude them from export cleanup. There is no state_directory setting.
Run from the deployed application directory as the cron service user:
bash
php bin/console menzzo:bing:merchant:products --preview --limit=3 --env=prod
php bin/console menzzo:bing:merchant:products --preflight --env=prodPreview builds and validates XML locally, prints up to three mapped offers, deletes the temporary file, and requires no SFTP credentials or persistent state. --product-ids and --limit are preview-only: a partial feed is never uploaded. Preflight verifies state, SSH host key and login without writing a remote file; it does not prove target feed configuration or product acceptance. The old menzzo:bing:merchant:auth command and --validate-only option are removed.
Sync and retirement
After setup, set enabled: true and run menzzo:bing:merchant:products for the first complete upload. Until that operator step, uploads are blocked. The independent product mapper and repository selection retain the original France rules. Full scans page by 200 products and clear Doctrine between batches. The XML preserves currency, shipping, sale dates, images, all labels and empty manual overrides. Product validation errors from the mapper (including incomplete storefront URLs) skip only the affected products. The result reports skipped and skipped_product_ids; warning logs include the reason. Valid products are uploaded and a successful transfer exits zero. Encoding, file-writing, scan and SFTP failures still fail the run. The complete file is flushed locally before SFTP submission; it is deleted locally afterward.
feed.json scopes local IDs to the SFTP destination/account/filename. A pre-upload union preserves potentially uploaded identities after an interrupted transfer, and the successful transfer advances the local baseline. SFTP success means transferred, not accepted: every command result retains ingestion_verified: false. Check Microsoft's processing reports separately. Existing nonempty API offers.json blocks automatic migration and requires operator review.
Permanently retired products are omitted from the next complete primary feed, rather than deleted using the API. A previously uploaded offer may disappear only when it is locally deleted, disabled, merchant-excluded, disabled for France or marked Fin de produit. Products explicitly skipped for mapping validation are also omitted, without counting them as permanently retired. Any other unexplained disappearance blocks the upload. Temporary unavailability stays in the feed as out of stock under the same ID. Verify Microsoft's removal behavior and timing in the target feed before activation; this implementation cannot confirm remote deletion over SFTP.
An empty feed is always blocked, including when every product is retired; that case requires operator review in Merchant Center. A count below 80% of the previous baseline is blocked unless reviewed with --allow-catalog-drop; previously uploaded products explicitly skipped for mapping validation are credited toward this check. This flag never bypasses encoding/scan failures or unexplained disappearance. The lock prevents overlapping jobs on the configured single cron host. Failed transfers raise a nonzero exit; inspect Microsoft's reports before retrying a potentially interrupted remote file. No automatic retry claims ingestion success.
Four-hour schedule
Scheduling is an operator/deployment step; it is not automatically installed by this feature. After representative real offers and a full sync are accepted, register exactly one entry under the existing cron service user, preserving its PHP path, working directory and run_job.sh wrapper:
cron
15 */4 * * * <existing wrapper and runtime> menzzo:bing:merchant:products --env=prod --no-interactionThis runs at 00:15, 04:15, 08:15, 12:15, 16:15 and 20:15 in the existing Paris server timezone, including the overnight slots. Follow the existing cron timezone behavior around DST. Do not run duplicate schedules on multiple hosts.
The live cron user's crontab -l is the schedule source. After registration, run php bin/console logidav:cron:document --env=prod there, review and commit the generated reference/operations/system-crontab.md in menzzo-docs, then update Logidav's docs gitlink. Never hand-edit that generated file or run the exporter on an unrelated workstation to represent production scheduling.
Acceptance and recovery
Verify the feed is configured for France, French and EUR, and verify representative prices/sale dates, all labels and overrides, supplier products, unavailable offers, stock-loss/restock and permanent removal in Merchant Center. Require two fresh four-hour uploads with successful Microsoft processing reports. Local tests, SSH login and completed transfer do not prove ingestion, editorial approval or ad delivery. No Microsoft credentials have been configured or live uploads proven by this change.
Preserve and restore the feed manifest on failure. Disable this integration/cron for rollback; offers already submitted can continue serving until publishing is disabled in Merchant Center. Do not change Google jobs or delete the catalog as an automatic rollback. There are no new routes, ACL roles, entity columns, migrations or dependency packages.
Microsoft's feed format and submission guide describes Google-format XML and matching upload filenames; the SFTP endpoint above was supplied from this account's Merchant Center settings.